Opengl GLSL循环错误行为

Opengl GLSL循环错误行为,opengl,for-loop,glsl,Opengl,For Loop,Glsl,我们有以下GLSL代码: #version 120 #define LIGHT_COUNT 2 ... varying vec3 v_light_tan[LIGHT_COUNT]; varying float v_attenuation[LIGHT_COUNT]; uniform vec3 light_position[LIGHT_COUNT]; void main(void) { ... for ( int index = 0; index < LIGHT_COUNT; inde

我们有以下GLSL代码:

#version 120
#define LIGHT_COUNT 2
...
varying vec3 v_light_tan[LIGHT_COUNT];
varying float v_attenuation[LIGHT_COUNT];

uniform vec3 light_position[LIGHT_COUNT];

void main(void) {
  ...
for ( int index = 0; index < LIGHT_COUNT; index++ )
{
    float distance = length( light_position[index] - world_pos );
    v_attenuation[index] = 1.0 / ( 1.0 + 0.05 * distance * distance);
    vec3 light_loc  = vec3(nv_m_model_inv * vec4 (light_position[index], 1.0) );
    vec3 light_dir_loc = normalize( nv_position - light_loc );
    v_light_tan[index] = vec3(
        dot( nv_tangent.xyz, light_dir_loc ),
        dot( bitangent, light_dir_loc ),
        dot( nv_normal, light_dir_loc )
    );  
}
。。。因此,两个独立的循环可以工作。添加
#pragma optionNV(全部展开)
同样有效

不过,这两种方法似乎都有问题,因为这是一个非常简单的循环示例。GLSL是否已损坏,或者我是否错过了编写GLSL循环的一些规则或指南

如果相关:

OpenGL Vendor       : NVIDIA Corporation
OpenGL Renderer     : GeForce GTX 690/PCIe/SSE2
OpenGL Version      : 4.4.0
OpenGL GLSL Version : 4.40 NVIDIA via Cg compiler

不应在片段着色器中写入输入变量。坦白地说,我甚至不知道你为什么要写
v_衰减[…]
首先,你粘贴的着色器中从来没有使用过这个值。你能发布你的顶点和片段着色器吗?在GLSL 1.20中,您可以在片段阶段使用非常量表达式(例如循环控制变量,因此
light\u position[index]
可以创建问题)遇到问题。在顶点阶段,它应该工作。“GLSL是否已损坏”。1.2版已经弃用6年了。所以是的,它可能坏了。我不知道你的目标是什么,在你的硬件相当先进的情况下,使用这么旧的GLSL版本。如果目标是嵌入式设备,它仍然是有缺陷的,因为OpenGL ES 2.0的唯一现有GLSL版本是1.0,它是桌面版本1.0、1.1和1.2.33的混合,我的潜在用户群仍然使用GL 2.1 max的硬件,所以我需要支持它。然而,即使创建3.3+上下文并将版本更改为330,仍然会产生相同的行为。我使用了GLE2.0和GL2.1的一个公共子集@科尔曼这是顶点着色器。你能发布片段着色器吗?NV分两个阶段编译着色器(其他实现可能也会,但我不能代表它们发言),第一次编译着色器是为了确定输入/输出,第二次是在链接期间。在链接时,编译器认为它足够聪明,可以消除未使用的变量,并在此基础上进行代码优化。如果顶点着色器和片段着色器都动态访问不同的数组,则可能会造成混乱。如果强制编译器展开修复了问题,那么这显然是代码优化的一个问题。
OpenGL Vendor       : NVIDIA Corporation
OpenGL Renderer     : GeForce GTX 690/PCIe/SSE2
OpenGL Version      : 4.4.0
OpenGL GLSL Version : 4.40 NVIDIA via Cg compiler