OpenGL 4.5缓冲区纹理:扩展支持

时间:2015-05-18 12:14:30

标签: opengl cuda textures buffer opengl-4

我使用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。

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

所以,我认为默认情况下可能会以某种方式禁用扩展,我在片段着色器中包含启用这些扩展:

***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);

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

请参阅下面的代码示例:

HEAD

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

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

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

编辑详细信息:我更新了帖子,因为我发现了“无效枚举”错误的原因,我之前提到过,它是由glTexParameteri引起的,不允许缓冲区纹理。< / p>

1 个答案:

答案 0 :(得分: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以来此功能已包含在内核中,因此不应再启用它们。

相关问题