写opengl shader 的时候有时候会有一下经过
WARNING: 0:27: Overflow in implicit constant conversion, minimum range for lowp float is (-2,2)
这是由于我们在shader 的变量的范围超过了规定的范围导致的.
举例
precision lowp float;
uniform vec3 lightPos; ///光源位置
uniform vec3 lightColor; ///光源颜色
uniform vec3 viewPos;
varying lowp vec3 normal;
varying lowp vec3 FragPos;
//varying lowp vec3 vary_vertexColor;
struct Material{
vec3 ambient;
vec3 diffuse;
vec3 specular;
float shininess;
};
uniform Material material;
struct Light{
vec3 lightPos;
vec3 ambient;
vec3 diffuse;
vec3 specular;
};
uniform Light light;
void main(){
// 环境光
Material materialTest;
materialTest.ambient = material.ambient;;
materialTest.diffuse = material.diffuse;
materialTest.specular = material.specular ;
materialTest.shininess = material.shininess *256.0;;
vec3 ambient = light.ambient * materialTest.ambient;
// 漫反射
vec3 norm = normalize(normal);
vec3 lightDir = normalize(light.lightPos - FragPos);
float diff = max(dot(norm, lightDir), 0.0);
vec3 diffuse = light.diffuse * (diff * materialTest.diffuse);
// 镜面光
vec3 viewDir = normalize(viewPos - FragPos);
vec3 reflectDir = reflect(-lightDir, norm);
float spec = pow(max(dot(viewDir, reflectDir), 0.0), materialTest.shininess);
vec3 specular = light.specular * (spec * materialTest.specular);
vec3 result = ambient + diffuse + specular;
gl_FragColor =vec4(result, 1.0);;
}
我们给float 声明的精度是 lowp .lowp的精度范围是[-2,-2]
而当我们计算 materialTest.shininess = material.shininess *256.0;;的时候, materialTest.shininess的值超过该范围就会报以上警告.因此这里我们需要更改其精度就可以了.
将precision lowp float; 改成precision mediump float;
我们也可以单独改该变量的精度.
这里贴上各种精度范围









网友评论