GLSL从Sampler3d纹理读取

时间:2013-06-13 17:05:28

标签: 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重载)

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

3 个答案:

答案 0 :(得分:5)

将评论转移到正确的答案中。

在加载,编译和链接着色器时,始终(没有例外)进行正确的错误检查。从长远来看,你将节省大量时间。即使您在外部程序中验证着色器,这也适用。

  • 致电glCompileShader(..)后,请以glGetShaderiv(..)作为参数调用GL_COMPILE_STATUS来获取编译状态。
  • 如果返回值为0,则出现问题
  • 使用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中指定尺寸的函数,只是为不同的采样器重载纹理函数。你的线也缺少一个支撑。