GLSL从Sampler3d纹理读取

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

gen*_*ult 5

我无法使用函数阅读texture3d()

尝试texture3D()。注意大写D

  • @CagkanToptas:那不是 OpenGL。大多数编程语言都区分大小写。最好现在就习惯了。 (14认同)

Gri*_*mmy 5

将评论转移到正确的答案..

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

  • 调用之后glCompileShader(..),通过glGetShaderiv(..)使用GL_COMPILE_STATUSas参数调用来获取编译状态.
  • 如果返回值为0,则出错
  • 通过使用glGetShaderiv(..)参数查询长度来获取信息日志GL_INFO_LOG_LENGTH.
  • 然后使用获取日志 glGetShaderInfoLog

这需要在每个着色器类型(顶点,片段,地理...)中完成.

另外,您应该在glLinkProgram()使用glGetProgramiv()GL_LINK_STATUS作为参数后检查链接状态.

您会立即看到一个错误,例如0(19) : error C1008: undefined variable "texture3d"无需花费数小时来追踪问题.