美文网首页
WARNING: 0:27: Overflow in impli

WARNING: 0:27: Overflow in impli

作者: 充满活力的早晨 | 来源:发表于2019-08-06 14:37 被阅读0次

写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;
我们也可以单独改该变量的精度.
这里贴上各种精度范围

相关文章

网友评论

      本文标题:WARNING: 0:27: Overflow in impli

      本文链接:https://www.haomeiwen.com/subject/donidctx.html