Opengl AMD硬件上的基本聚光GLSL片段程序

Opengl AMD硬件上的基本聚光GLSL片段程序,opengl,glsl,gpu,amd-processor,Opengl,Glsl,Gpu,Amd Processor,我已经编写了一个GLSL片段程序,可以绘制多个灯光,其中一些灯光具有聚光灯效果(即glLightfv具有GL_SPOT_方向,glLightf具有GL_SPOT_指数)。节目的相关摘录如下: float light_spot(gl_LightSourceParameters light) { float dot_LD = dot( normalize(vec_vertex_eye_i-light.position.xyz), normalize(light.spotDirection)

我已经编写了一个GLSL片段程序,可以绘制多个灯光,其中一些灯光具有聚光灯效果(即glLightfv具有GL_SPOT_方向,glLightf具有GL_SPOT_指数)。节目的相关摘录如下:

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卡有了新的驱动程序,我认为聚光灯是一个相当重要的功能,不太可能被破坏。着色器编译得很好。我在这里遗漏了什么?

“我认为聚光灯是一个相当重要的功能,不太可能被破坏。”但您没有使用OpenGL的固定功能聚光灯。您可以使用OpenGL的固定函数状态来进行自己的聚光灯计算。这是一个几乎肯定不会像用自己的制服手动实现的代码路径。我只是说——我在这里尝试的,访问一个非常常见的GLSL结构的字段,不会那么不寻常。AMD OpenGL支持很差,特别是在低端移动性上。正如@Nicol Bolas所建议的,试着穿上自己的制服,就像测试一样。你会对AMD驱动程序的不同寻常之处感到惊讶。。。(不是巨魔,只是客观地说我自己的经历)“我只是说——我在这里尝试的,访问一个非常常见的GLSL结构的字段,不会那么不寻常。”是的,它可以。通常,人们会做两件事之一:使用固定函数(即:不使用着色器),或者只使用着色器。它们通常不使用具有固定函数数据结构的着色器。所以那个代码路径并没有经常被测试。@imallett:甚至不清楚这是否是AMD方面的一个bug。代码的其余部分可能依赖于恰好在nvidia上工作的未定义行为。我认为在客户机上粘贴属性指针设置会有所帮助。“错误的结果”是什么意思?你能更准确地说明发生了什么吗?