Opengl 从3D纹理中读取GLSL
我有3D体积纹理,我用下面的行初始化它:Opengl 从3D纹理中读取GLSL,opengl,glsl,textures,fragment-shader,Opengl,Glsl,Textures,Fragment Shader,我有3D体积纹理,我用下面的行初始化它: glTexImage3D(GL_TEXTURE_3D, 0, GL_RED, numX, numY, numZ, 0, GL_RED, GL_UNSIGNED_BYTE, voldata); 在片段着色器中,我想读取此纹理的值,但无法使用texture3d()函数读取 下一行给出片段着色器中的编译错误:(texture3d没有匹配重载) 如何从sampler3d获取数据 OpenGLPart: unsigned int texture; glGe
glTexImage3D(GL_TEXTURE_3D, 0, GL_RED, numX, numY, numZ, 0, GL_RED, GL_UNSIGNED_BYTE, voldata);
在片段着色器中,我想读取此纹理的值,但无法使用texture3d()
函数读取
下一行给出片段着色器中的编译错误:(texture3d没有匹配重载)
如何从sampler3d获取数据
OpenGLPart:
unsigned int texture;
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_3D, texture);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_REPEAT);
glTexImage3D(GL_TEXTURE_3D, 0, GL_RED, numX, numY, numZ, 0, GL_RED, GL_UNSIGNED_BYTE, voldata);
free(voldata ); //free the texture
...
display()
{
....
glActiveTexture(GL_TEXTURE0);
int texture_location = glGetUniformLocation(shader.id(), "VolumeTexture");
glUniform1i(texture_location, 0);
glBindTexture(GL_TEXTURE_3D,volumetext);
....
}
我的片段着色器:
uniform sampler3D VolumeTexture;
void main()
{
float value = 0;
...
value = texture3d(VolumeTexture,vec3(0.2f,0.2f,0.2f);
...
gl_FragColor = IntersectRay(ray);
}
注意:我的OpenGL版本是3.3
使用texture3d()
函数我无法阅读
尝试
texture3D()
。请注意大写的D
尝试不带3D后缀的纹理,他们不推荐使用OpenGL 4中指定尺寸的函数,而只是为不同的采样器重载纹理函数。此外,您的行中缺少一个括号。将注释移动到正确的答案中
加载、编译和链接着色器时,始终(无例外)执行正确的错误检查。从长远来看,你会节省很多时间。即使在外部程序中验证着色器,这也适用
- 调用
后,通过调用glCompileShader(..)
以glGetShaderiv(..)
作为参数来获取编译状态GL\u compile\u status
- 如果返回值为0,则表示出现问题
- 通过使用
参数glGetShaderiv(..)
查询长度来获取信息日志GL\u info\u log\u length
- 然后使用
glGetShaderInfoLog
glGetProgramiv()
和GL\u link\u status
作为参数检查gllink\u()之后的链接状态
您会立即看到一个错误,如0(19):错误C1008:未定义变量“texture3d”
不必花费数小时来跟踪问题。是OpenGL还是OpenGL ES 2.0?如果是opengl,那么您的目标版本是什么?另外,请发布着色器的简化版本。@q\uuuuuuuuuub:OpenGL ES 2.0不支持3D纹理。@NicolBolas在某些设备上有一个扩展GL\u OES\u纹理\u 3D。“注意:我的OpenGL版本是3.5”不,不是。没有OpenGL 3.5。有一个OpenGL 1.5,但不是3.5.pff我讨厌OpenGL。。。谢谢你的回答,我已经寻找了几个小时的解决方案:/@CagkanToptas:那不是OpenGL。大多数编程语言都区分大小写。最好现在就习惯。
uniform sampler3D VolumeTexture;
void main()
{
float value = 0;
...
value = texture3d(VolumeTexture,vec3(0.2f,0.2f,0.2f);
...
gl_FragColor = IntersectRay(ray);
}