Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 从3D纹理中读取GLSL_Opengl_Glsl_Textures_Fragment Shader - Fatal编程技术网

Opengl 从3D纹理中读取GLSL

Opengl 从3D纹理中读取GLSL,opengl,glsl,textures,fragment-shader,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没有匹配重载) 如何从sampler3d获取数据 OpenGLPart: unsigned int texture; glGe

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

glTexImage3D(GL_TEXTURE_3D, 0, GL_RED, numX, numY, numZ, 0, GL_RED, GL_UNSIGNED_BYTE, voldata);
在片段着色器中,我想读取此纹理的值,但无法使用
texture3d()
函数读取

下一行给出片段着色器中的编译错误:(texture3d没有匹配重载)

如何从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);
                  ....
    }                
我的片段着色器:

    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

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


尝试
texture3D()
。请注意大写的
D

尝试不带3D后缀的纹理,他们不推荐使用OpenGL 4中指定尺寸的函数,而只是为不同的采样器重载纹理函数。此外,您的行中缺少一个括号。

将注释移动到正确的答案中

加载、编译和链接着色器时,始终(无例外)执行正确的错误检查。从长远来看,你会节省很多时间。即使在外部程序中验证着色器,这也适用

  • 调用
    glCompileShader(..)
    后,通过调用
    glGetShaderiv(..)
    GL\u compile\u status
    作为参数来获取编译状态
  • 如果返回值为0,则表示出现问题
  • 通过使用
    glGetShaderiv(..)
    参数
    GL\u info\u log\u length
    查询长度来获取信息日志
  • 然后使用
    glGetShaderInfoLog
这需要在每种着色器类型(顶点、片段、地理..)中完成

此外,应使用
glGetProgramiv()
GL\u link\u status
作为参数检查
gllink\u()之后的链接状态


您会立即看到一个错误,如
0(19):错误C1008:未定义变量“texture3d”
不必花费数小时来跟踪问题。

是OpenGL还是OpenGL ES 2.0?如果是opengl,那么您的目标版本是什么?另外,请发布着色器的简化版本。@q\uuuuuuuuuub:OpenGL ES 2.0不支持3D纹理。@NicolBolas在某些设备上有一个扩展GL\u OES\u纹理\u 3D。“注意:我的OpenGL版本是3.5”不,不是。没有OpenGL 3.5。有一个OpenGL 1.5,但不是3.5.pff我讨厌OpenGL。。。谢谢你的回答,我已经寻找了几个小时的解决方案:/@CagkanToptas:那不是OpenGL。大多数编程语言都区分大小写。最好现在就习惯。
    uniform sampler3D VolumeTexture;
    void main()
    {
        float value = 0;
                ...
        value = texture3d(VolumeTexture,vec3(0.2f,0.2f,0.2f);
                ...
    gl_FragColor = IntersectRay(ray);
    }