GLSL中length()的奇怪行为

GLSL中length()的奇怪行为,glsl,compiler-optimization,Glsl,Compiler Optimization,环境: Windows10版本1803 英伟达GeForce GTX 780钛 已安装最新的驱动程序398.36 Visual Studio 2015更新3 OpenGL 4.6 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

环境:

  • Windows10版本1803
  • 英伟达GeForce GTX 780钛
  • 已安装最新的驱动程序398.36
  • Visual Studio 2015更新3
  • OpenGL 4.6
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;
}
#版本460核心
在vec4 VPO中;
无效的
main()
{
浮动系数[];
int i,j;
系数[7]=2.38;
i=系数长度();
系数[9]=4.96;
j=系数长度();

if(i这既是对您的错误使用,也是一个编译器错误(因为它不会在应该的时候中断)

请参见规范中的说明:

合法的做法是声明一个没有大小(未大小)的数组,然后重新声明与相同类型数组相同的名称并指定大小,或者仅使用整型常量表达式(隐式大小)对其进行索引

好的,到目前为止,这就是你正在做的。但是现在

声明大小为的数组,然后(在同一着色器中)使用大于或等于声明大小的整型常量表达式对同一数组进行索引,这是编译时错误

这也是您正在做的。首先,您将大小设置为7,然后设置为9。这是不允许的,这是一个在编译时检测到的错误。因此,这个“有效”的事实(即没有编译器错误)是一个编译器错误

<>你为什么要看到10的大小?不要问我,谁知道…我最好的猜测是英伟达编译器在这种情况下,做什么“什么”,不管它是什么。