OpenGL 4.5 缓冲纹理:扩展支持
OpenGL 4.5 Buffer Texture : extensions support
我使用 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") 也都 return是的。
但是缓冲区中的数据没有出现在纹理样本中(在片段着色器中纹理只包含零)。
所以,我认为这些扩展可能在默认情况下以某种方式被禁用,我在片段着色器中启用了这些扩展:
#version 440 core
#extension GL_ARB_texture_buffer_object : enable
#extension GL_EXT_texture_buffer_object : enable
现在我在 运行-time:
收到这样的警告
***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) 为什么尝试在着色器中启用扩展失败?
编辑详情: 我更新了 post,因为我找到了 "Invalid Enum" 错误的原因,这是我首先提到的,它是由缓冲区纹理不允许的 glTexParameteri。
我解决了这个问题。我很匆忙,愚蠢地错过了维基页面上的一个非常重要的东西:
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 以来就包含在核心中,因此不应再额外启用它们。
我使用 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") 也都 return是的。
但是缓冲区中的数据没有出现在纹理样本中(在片段着色器中纹理只包含零)。
所以,我认为这些扩展可能在默认情况下以某种方式被禁用,我在片段着色器中启用了这些扩展:
#version 440 core
#extension GL_ARB_texture_buffer_object : enable
#extension GL_EXT_texture_buffer_object : enable
现在我在 运行-time:
收到这样的警告***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) 为什么尝试在着色器中启用扩展失败?
编辑详情: 我更新了 post,因为我找到了 "Invalid Enum" 错误的原因,这是我首先提到的,它是由缓冲区纹理不允许的 glTexParameteri。
我解决了这个问题。我很匆忙,愚蠢地错过了维基页面上的一个非常重要的东西:
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 以来就包含在核心中,因此不应再额外启用它们。