我正在使用OpenGL 3.3 GLSL 1.5兼容性。我的顶点数据出现了一个奇怪的问题。我正在尝试将索引值传递给片段着色器,但值似乎根据我的相机位置而改变。
这应该很简单:我将GLfloat通过顶点着色器传递给片段着色器。然后我将此值转换为无符号整数。除了片段的边缘外,大多数时间值都是正确的。无论我做什么,都会出现同样的失真。为什么我的相机位置会改变这个值?即使在下面的荒谬例子中,也不等于1.0以外的其他东西;
uint i;
if (tI == 1.0) i = 1;
else i = 0;
vec4 color = texture2D(tex[i], t) ;
如果我发送整数数据而不是浮点数据,我会得到完全相同的问题。我输入的顶点数据似乎并不重要。我输入数据的值在片段中不一致。每次失真看起来都完全相同。
答案 0 :(得分:1)
你在这里做的是在OpenGL / GLSL 3.30中无效。
让我引用GLSL 3.30 specification,4.1.7和#34;采样器" (强调我的):
采样器聚合到着色器内的数组中(使用方括号 [])只能使用整数常量表达式进行索引(请参阅 第4.3.3节“常量表达式”)。
使用变量作为纹理的索引并不代表规范定义的常量表达式。
从GL 4.0开始,这有点放松了。 GLSL 4.00 specification现在声明如下(仍然是我的重点):
采样器聚合到着色器内的数组中(使用方括号 [])只能使用动态统一积分进行索引 表达式,否则结果未定义。
动态统一的定义如下:
如果所有片段都是动态统一的片段着色器表达式 评估它得到相同的结果值。当涉及循环时, 这指的是同一循环迭代的表达式值。 涉及功能时,这指的是来自同一呼叫的呼叫 点。
所以现在这有点棘手。如果所有片段着色器调用实际上都获得了相同的变化值,我猜是允许的。但目前还不清楚你的代码是否能保证这一点。您还应该考虑到片段甚至可以在原语的外中进行采样。
但是,你应该从不检查浮动是否相等。会有数字问题。我不知道你在这里想要实现什么,但你可能会使用一些简单的舍入行为,或者使用整数变化。您还应该使用flat
限定符(无论如何都是整数情况所需)禁用值的插值,这应该会大大改善该结构的变化,使其变得动态均匀。