OpenGL纹理查找错误

时间:2013-04-12 17:05:17

标签: opengl textures

执行以下片段着色器时出错:

#version 430 core

in vec4 pos;           // <-- input (x,y,z) position normalized to [0, 1] 
in vec4 screenPos;     // <-- input screen position normalized to [-1, 1] 
out vec4 outColor;

uniform sampler3D volumeTex;    // <-- a volume
uniform sampler2D backFaceTex;  // <-- the backface of a cube previously saved to texture

void main()
{
    if(gl_FrontFacing) {
        vec4 front = pos;
        vec4 back = texture(backFaceTex, (screenPos.xy/screenPos.w+1.0)/2.0);

        // only one of the following 4 lines is uncommented at a time
        outColor = front;                          // <-- Ok
        outColor = back;                           // <-- Ok
        outColor = texture(volumeTex, front.xyz);  // <-- Ok
        outColor = texture(volumeTex, back.xyz);   // <-- Error
    }
    else {
        discard;
    }
}

正如你可以从我的评论中读到的那样,程序运行正常,在前三种情况下呈现我期望的图像,但在第四种情况下失败(我唯一需要的那种)。

没有渲染,我在主应用程序中从glGetError()收到错误。

似乎禁止使用texel作为另一个纹理提取操作的坐标参数。

谁能告诉我问题出在哪里?

2 个答案:

答案 0 :(得分:0)

使用纹理提取的结果作为另一个纹理提取的坐标称为从属纹理提取,并且完全有效(尽管与独立的fecth相比,它可能会对性能产生一些负面影响)。

您的代码中的问题很可能是

vec4 back = texture(backFaceTex, (screenPos.xy/screenPos.w+1.0)/2.0);

行,你基本上有一个(vec2(...)+ 1.0)操作,这是不允许的,应该导致编译错误。这也可以解释这样一个事实,即没有绘制任何东西,并且在尝试绘制时会出现错误(没有有效的程序)。

答案 1 :(得分:0)

谢谢derhass,

我发现问题出在哪里: 我对3D和2D采样器使用相同的纹理单元,这是非法的。 保持代码不变,简单地使用纹理单元0代表sampler3D,纹理单元1代替sampler2D,解决了这个问题!

干杯, 马西莫