【问题标题】:GLSL Reading From Sampler3d texture从 Sampler3d 纹理读取 GLSL
【发布时间】:2015-04-15 07:32:25
【问题描述】:

我有 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

【问题讨论】:

  • 是 OpenGL 还是 OpenGL ES 2.0?如果是opengl,那么您的目标是什么版本?也请发布您的着色器的简化版本。
  • @q______b:OpenGL ES 2.0 不支持 3D 纹理。
  • @NicolBolas 在某些设备上有一个扩展 GL_OES_texture_3D。
  • "注意:我的 OpenGL 版本是 3.5" 不,不是。没有 OpenGL 3.5。有一个 OpenGL 1.5,但没有 3.5。

标签: opengl glsl textures fragment-shader


【解决方案1】:

将评论转化为正确的答案..

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

  • 调用glCompileShader(..)后,以GL_COMPILE_STATUS为参数调用glGetShaderiv(..)获取编译状态。
  • 如果返回值为 0,说明出错了
  • 使用glGetShaderiv(..)参数GL_INFO_LOG_LENGTH查询长度获取信息日志。
  • 然后用glGetShaderInfoLog获取日志

每个着色器类型(顶点、片段、地理..)都需要这样做。

此外,您应该使用glGetProgramiv()GL_LINK_STATUS 作为参数检查glLinkProgram() 之后的链接状态。

您会立即看到像 0(19) : error C1008: undefined variable "texture3d" 这样的错误,而不必花费数小时来追踪问题。

【讨论】:

    【解决方案2】:

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

    试试texture3D()。注意大写D

    【讨论】:

    • pff 我讨厌 opengl...谢谢你的回答我一直在寻找解决方案几个小时:/
    • @CagkanToptas:那不是 OpenGL。大多数编程语言都区分大小写。最好现在就习惯。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2017-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多