我有3D体积纹理,我用下面的行初始化它:
glTexImage3D(GL_TEXTURE_3D, 0, GL_RED, numX, numY, numZ, 0, GL_RED, GL_UNSIGNED_BYTE, voldata);
在片段着色器中,我想读取此纹理的值,但我无法使用texture3d()
函数读取。
下面的行在片段着色器中给出编译错误:(没有匹配为texture3d重载)
float value = texture3d(VolumeTexture,vec3(0.2f,0.2f,0.2f);
如何从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);
....
}
My Fragment Shader:
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
答案 0 :(得分:5)
将评论转移到正确的答案中。
在加载,编译和链接着色器时,始终(没有例外)进行正确的错误检查。从长远来看,你将节省大量时间。即使您在外部程序中验证着色器,这也适用。
glCompileShader(..)
后,请以glGetShaderiv(..)
作为参数调用GL_COMPILE_STATUS
来获取编译状态。glGetShaderiv(..)
参数GL_INFO_LOG_LENGTH
查询长度来获取信息日志。glGetShaderInfoLog
这需要在每个着色器类型(顶点,片段,地理...)中完成。
另外,您应该使用glLinkProgram()
和glGetProgramiv()
作为参数,在GL_LINK_STATUS
之后检查链接状态。
您会立即看到0(19) : error C1008: undefined variable "texture3d"
之类的错误,而不必花费数小时来追踪问题。
答案 1 :(得分:4)
我无法阅读
texture3d()
函数。
试试texture3D()
。注意大写D
。
答案 2 :(得分:2)
尝试没有3D后缀的纹理,他们不赞成在OpenGL 4中指定尺寸的函数,只是为不同的采样器重载纹理函数。你的线也缺少一个支撑。