我编写了一个 GLSL 片段程序,它可以绘制多个灯光,其中一些带有聚光灯效果(即,带有 GL_SPOT_DIRECTION 的 glLightfv 和带有 GL_SPOT_EXPONENT 的 glLightf)。该计划的相关摘录如下:
float light_spot(gl_LightSourceParameters light) {
float dot_LD = dot( normalize(vec_vertex_eye_i-light.position.xyz), normalize(light.spotDirection) );
float coeff = 1.0 - (1.0-dot_LD)/(1.0-light.spotCosCutoff);
return (dot_LD>light.spotCosCutoff) ? pow(coeff,light.spotExponent) : 0.0;
}
除了“vec_vertex_eye_i”之外,所有变量都是不言自明或记录在案的,它是来自顶点着色器的不同 vec3,其中它设置为 (gl_ModelViewMatrix*gl_Vertex).xyz。
该程序在 NVIDIA 硬件上完美运行(在 NVIDIA GeForce 8400M GS 和 NVIDIA GeForce GTX 580M 上测试),但在 AMD 卡(特别是 ATI Mobility Radeon HD 4250)上给出错误结果。
我的问题是,在 glEnable 或其他需要做的特殊配置方面,我是否可能缺少任何东西。AMD 卡有新的驱动程序,我宁愿认为聚光灯是一个不太可能被破坏的相当重要的功能。着色器编译得很好。我在这里想念什么?