环境:
GLSL来源:
#version 460 core
in vec4 vPos;
void
main()
{
float coeff[];
int i,j;
coeff[7] = 2.38;
i=coeff.length();
coeff[9] = 4.96;
j=coeff.length();
if(i<j)
gl_Position = vPos;
}
我的期望是i
是8而j
是10,因此应该执行gl_Position = vPos;
,但是使用Nsight进行的着色器调试显示i
和{{1 }}为10,因此j
被所有顶点忽略。有什么事?与编译器优化有关吗?如果我希望按预期的方式编译GLSL(gl_Position = vPos;
是i<j
),如何修复代码?谢谢。
答案 0 :(得分:0)
这既是对您的错误使用,又是编译器错误(因为在适当的时候它不会中断)。
看看规范怎么说:
声明一个没有大小(未大小)的数组是合法的,然后在以后重新声明与相同类型的数组相同的名称并指定大小,或仅使用整数常量表达式(隐式大小)对其进行索引。
好的,到目前为止,这就是您正在做的。但是现在...
声明一个具有大小的数组,然后(在同一着色器中)随后使用整数常量表达式大于或等于声明的大小的同一索引对同一数组进行索引,这是编译时错误。
这也是 您正在做什么。首先,将大小设置为7,然后设置为9。这是不允许的,这是在编译时检测到的错误。因此,这个“有效”的事实(即没有编译器错误)是编译器错误。
现在为什么看到10号呢?别问我,谁知道...我的最佳猜测是nVidia编译器在这种情况下通过执行“某些操作”起作用,无论它是什么。可以使它无论如何都可以工作的东西,尽管它是错误的。