我用android opengl es 2.0编写游戏,我在一些不同的设备上遇到亮度问题。我使用这个公式来计算片段着色器中的光:
float shineDamper = 0.0;
float reflectivity = 0.001;
float ambient = 0.5;
vec3 unitNormal = normalize(surfaceNormal);
vec3 unitVectorToCamera = normalize(toCameraVector);
vec3 lightColor = vec3(0.5,0.5,0.5);
vec3 unitLightVector = normalize(toLightVector);
float nDot1 = dot(unitNormal,unitLightVector);
float brightness = max(nDot1,0.0);
vec3 lightDirection = -unitLightVector;
vec3 reflectedLightDirection = reflect(lightDirection,unitNormal);
float specularFactor = dot(reflectedLightDirection,unitVectorToCamera);
specularFactor = max(specularFactor,0.0);
float dampedFactor = pow(specularFactor,shineDamper);
vec3 diffuse = brightness * lightColor;
diffuse = max(diffuse,ambient);
vec3 finalSpecular = dampedFactor * reflectivity * lightColor;
gl_FragColor =vec4(diffuse,1.0) * text + vec4(finalSpecular,1.0);
问题是某些旧设备上的灯光非常暗,但是如果我将灯光颜色改为10,那么在旧设备上就可以了,但在另一部手机上灯光非常亮。 Light pos离模特很远,因为我想得到太阳效果。
解决!!。 我只是将光计算放到顶点着色器中。
答案 0 :(得分:0)
最有可能的原因是,一些较旧的Android设备仅在片段着色器中支持mediump,该片段着色器近似为半精度浮点数。可能它正在努力执行某些计算或以有限的精度保持一些值。
非标准化向量toCameraVector
和toLightVector
是最可能的罪魁祸首。
一个不错的修复方法是在顶点着色器上对它们进行标准化(并且仍然在片段着色器中进行标准化,以最大限度地减少插值过程中非规范化造成的伪像)。
如果你通过在顶点着色器中进行计算获得了良好的视觉效果,那么这是理想的,因为你可能也大大提高了性能。