Ber*_*tas 2 opengl textures glsl fragment-shader
我有3D体积纹理,我用下面的行初始化它:
glTexImage3D(GL_TEXTURE_3D, 0, GL_RED, numX, numY, numZ, 0, GL_RED, GL_UNSIGNED_BYTE, voldata);
Run Code Online (Sandbox Code Playgroud)
在片段着色器中,我想读取此纹理的值,但我无法用texture3d()函数读取.
下面的行在片段着色器中给出编译错误:(没有匹配为texture3d重载)
float value = texture3d(VolumeTexture,vec3(0.2f,0.2f,0.2f);
Run Code Online (Sandbox Code Playgroud)
如何从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);
....
}
Run Code Online (Sandbox Code Playgroud)
我的片段着色器:
uniform sampler3D VolumeTexture;
void main()
{
float value = 0;
...
value = texture3d(VolumeTexture,vec3(0.2f,0.2f,0.2f);
...
gl_FragColor = IntersectRay(ray);
}
Run Code Online (Sandbox Code Playgroud)
注意:我的OpenGL版本是3.3
我无法使用函数阅读
texture3d()。
尝试texture3D()。注意大写D。
将评论转移到正确的答案..
在加载,编译和链接着色器时,始终(没有例外)进行适当的错误检查.从长远来看,你将节省大量时间.即使您在外部程序中验证着色器,这也适用.
glCompileShader(..),通过glGetShaderiv(..)使用GL_COMPILE_STATUSas参数调用来获取编译状态.glGetShaderiv(..)参数查询长度来获取信息日志GL_INFO_LOG_LENGTH.glGetShaderInfoLog这需要在每个着色器类型(顶点,片段,地理...)中完成.
另外,您应该在glLinkProgram()使用glGetProgramiv()和GL_LINK_STATUS作为参数后检查链接状态.
您会立即看到一个错误,例如0(19) : error C1008: undefined variable "texture3d"无需花费数小时来追踪问题.
| 归档时间: |
|
| 查看次数: |
8282 次 |
| 最近记录: |