0

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

#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() 收到错误。

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

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

4

2 回答 2

0

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

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

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

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

于 2013-04-28T13:02:23.320 回答
0

谢谢derhass,

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

干杯,马西莫

于 2013-04-29T13:25:43.077 回答