2

我有 3D 体积纹理,我用下面的行初始化它:

glTexImage3D(GL_TEXTURE_3D, 0, GL_RED, numX, numY, numZ, 0, GL_RED, GL_UNSIGNED_BYTE, voldata);

在片段着色器中,我想读取这个纹理的值,但我不能用texture3d()函数读取。

下面的行在片段着色器中给出编译错误:(没有匹配的重载纹理3d)

float value = texture3d(VolumeTexture,vec3(0.2f,0.2f,0.2f);

如何从 sampler3d 获取数据?

OpenGL部分:

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

4

3 回答 3

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"不必花费数小时来追踪问题。

于 2013-06-14T00:47:12.610 回答
4

我无法阅读texture3d()功能。

试试texture3D()。注意大写D

于 2013-06-13T17:13:44.953 回答
2

尝试不带 3D 后缀的纹理,它们弃用了 OpenGL 4 中指定尺寸的函数,只是为不同的采样器重载了纹理函数。您的线路也缺少一个大括号。

于 2013-06-13T17:15:29.443 回答