执行以下片段着色器时出错:
#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作为另一个纹理提取操作的坐标参数。
谁能告诉我问题出在哪里?
答案 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,解决了这个问题!
干杯, 马西莫