着色器引发运行时错误:验证失败(0):

2024-04-26 06:07:58 发布

您现在位置:Python中文网/ 问答频道 /正文

根据MAX_LIGHTS的值,以下着色器代码引发以下异常。知道为什么吗?我错过了什么?在

/usr/lib/python2.7/site-packages/OpenGL/GL/shaders.pyc in compileProgram(*shaders, **named)
    194     program = ShaderProgram( program )
    195     glLinkProgram(program)
--> 196     program.check_validate()
    197     program.check_linked()
    198     for shader in shaders:

/usr/lib/python2.7/site-packages/OpenGL/GL/shaders.pyc in check_validate(self)
    106                 """Validation failure (%s): %s"""%(
    107                 validation,
--> 108                 glGetProgramInfoLog( self ),
    109             ))
    110         return self

RuntimeError: Validation failure (0): 

顶点着色器代码:

^{pr2}$

碎片着色器代码:

#define MAX_LIGHTS 2


varying vec4 diffuse[MAX_LIGHTS], ambientGlobal[MAX_LIGHTS], ambient[MAX_LIGHTS];
varying vec3 normal[MAX_LIGHTS], lightDir[MAX_LIGHTS], halfVector[MAX_LIGHTS];
varying float dist[MAX_LIGHTS];


void main()
{
    vec3 n, halfV, viewV, ldir;
    float NdotL, NdotHV;
    vec4 color = ambientGlobal[0];
    float att;

    for (int i=0; i<MAX_LIGHTS; i++)
    {
        /* a fragment shader can't write a verying variable, hence we need
        a new variable to store the normalized interpolated normal */
        n = normalize(normal[i]);

        /* compute the dot product between normal and ldir */
        NdotL = max(dot(n, normalize(lightDir[i])), 0.0);

        if (NdotL > 0.0) {

            att = 1.0 / (gl_LightSource[i].constantAttenuation +
                    gl_LightSource[i].linearAttenuation * dist[i] +
                    gl_LightSource[i].quadraticAttenuation * dist[i] * dist[i]);
            color += att * (diffuse[i] * NdotL + ambient[i]);


            halfV = normalize(halfVector[i]);
            NdotHV = max(dot(n,halfV),0.0);
            color += att * gl_FrontMaterial.specular * gl_LightSource[i].specular * pow(NdotHV,gl_FrontMaterial.shininess);
        }
    }
    gl_FragColor = color;
}

Tags: 代码indistcheckprogrammaxattcolor