【问题标题】:OpenGL 4.5 Buffer Texture : extensions supportOpenGL 4.5 缓冲区纹理:扩展支持
【发布时间】:2015-07-29 22:38:54
【问题描述】:

我使用的是 OpenGL 版本 4.5.0,但不知何故我无法让 texture_buffer_object 扩展为我工作(“GL_EXT_texture_buffer_object”或“GL_ARB_texture_buffer_object”)。我对 OpenGL 很陌生,但如果我理解正确的话,这些扩展已经很老了,甚至已经包含在核心功能中......

我用“OpenGL Extensions Viewer 4.1”寻找扩展,它说它们在我的计算机上受支持,glewGetExtension("GL_EXT_texture_buffer_object") 和 glewGetExtension("GL_ARB_texture_buffer_object") 都返回 true。

但是来自缓冲区的数据不会出现在纹理样本中(在片段着色器中,纹理只包含零)。

所以,我想也许默认情况下这些扩展被禁用了,我在我的片段着色器中启用了这些扩展:

#version 440 core
#extension GL_ARB_texture_buffer_object : enable
#extension GL_EXT_texture_buffer_object : enable

现在我在运行时收到这样的警告:

***GLSL Linker Log:
Fragment info
-------------
0(3) : warning C7508: extension ARB_texture_buffer_object not supported
0(4) : warning C7508: extension EXT_texture_buffer_object not supported

请看下面的代码示例:

//#define GL_TEXTURE_BIND_TARGET GL_TEXTURE2D
#define GL_TEXTURE_BIND_TARGET GL_TEXTURE_BUFFER_EXT

.....
    glGenTextures(1, &texObject);
    glBindTexture(GL_TEXTURE_BIND_TARGET, texObject);   

            GLuint bufferObject;
            glGenBuffers(1, &bufferObject);

            // Make this the current UNPACK buffer (OpenGL is state-based)
            glBindBuffer(GL_TEXTURE_BIND_TARGET, bufferObject);
            glBufferData(GL_TEXTURE_BIND_TARGET, nWidth*nHeight*4*sizeof(float), NULL, GL_DYNAMIC_DRAW);
            float *test = (float *)glMapBuffer(GL_TEXTURE_BIND_TARGET, GL_READ_WRITE); 
            for(int i=0; i<nWidth*nHeight*4; i++)
                test[i] = i/(nWidth*nHeight*4.0);
            glUnmapBuffer(GL_TEXTURE_BIND_TARGET); 

            glTexBufferEXT(GL_TEXTURE_BIND_TARGET, GL_RGBA32F_ARB, bufferObject);


    //glTexImage2D(GL_TEXTURE_BIND_TARGET, 0, components, nWidth, nHeight,
    //                0, format, GL_UNSIGNED_BYTE, data);

............

所以如果我使用 GL_TEXTURE2D 目标并将一些数据数组直接加载到纹理中,一切正常。如果我使用 GL_TEXTURE_BUFFER_EXT 目标并尝试从缓冲区加载纹理,那么我会在着色器中得到一个空纹理。

注意:我必须从缓冲区加载纹理数据,因为在我的实际项目中,我在 CUDA 端生成数据,并且(据我所知)可视化来自 CUDA 的数据的唯一方法正在使用这样的纹理缓冲区。

所以,问题是: 1)为什么我在纹理中没有数据,虽然OpenGL版本没问题,并且扩展查看器显示扩展支持? 2) 为什么尝试在着色器中启用扩展会失败?

编辑细节:我更新了帖子,因为我发现了我首先提到的“无效枚举”错误的原因,它是由缓冲区纹理不允许的glTexParameteri引起的。

【问题讨论】:

    标签: opengl cuda textures buffer opengl-4


    【解决方案1】:

    我解决了这个问题。我很着急,愚蠢地错过了 wiki 页面上的一个非常重要的东西:

    https://www.opengl.org/wiki/Buffer_Texture

    在着色器中访问

    在 GLSL 中,缓冲区纹理只能通过 texelFetch​ 函数访问。此函数将像素偏移量带入纹理而不是归一化纹理坐标。缓冲区纹理的采样器类型是 samplerBuffer。

    所以在 GLSL 中我们应该像这样使用缓冲纹理:

    uniform samplerBuffer myTexture;
    
    void main (void)  
    {  
       vec4 color = texelFetch(myTexture, [index]);
    

    不像通常的纹理:

    uniform sampler1D myTexture;
    
    void main (void)  
    {  
       vec4 color = texture(myTexture, gl_FragCoord.x);
    

    关于不支持的扩展的警告:我想我明白了,因为这个功能自 OpenGL 3.1 起就包含在核心中,因此不应再启用它们。

    【讨论】:

      猜你喜欢
      • 2015-11-14
      • 1970-01-01
      • 2011-11-24
      • 2015-11-15
      • 2014-01-06
      • 1970-01-01
      • 2021-12-15
      相关资源
      最近更新 更多