Files
MoGoEagleEye/libraries/mapmodule/src/main/assets/shaders/fSelfCar_Shader.glsl

128 lines
4.7 KiB
GLSL
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#version 300 es
precision mediump float;
uniform sampler2D texId;
uniform float colorFac;
uniform vec4 ambientColor; //环境光颜色
uniform vec4 diffuseColor; //漫反射光颜色
uniform vec4 specularColor; //高光颜色
uniform float specularPow; //高光光泽度
uniform vec4 replacedColor; //把元素替换为另外一种颜色
uniform bool isReplaceColor; //是否把元素替换为另外一种颜色
uniform int isMixColor;//是否混合颜色
in vec2 fragTexCoord;
in vec3 fragEyeNormal;
in vec3 fragEyePos;
in vec3 lightEyePos;
in float _changeColorCmd;
in float _changeColorRatio;
in float _changeColorOff;
in float distanceFromCamera;
uniform bool isFogEnable;
uniform vec3 fogColor;
uniform float fogStart;
uniform float fogEnd;
uniform float fogDensity;
uniform bool isBlurEnable;
uniform vec3 blurColor;
uniform float blurStart;
uniform float blurEnd;
uniform float blurDensity;
uniform vec3 cameraPos;
uniform float zoom;
uniform bool isIce;
uniform bool isUsePureColor;
uniform vec4 pureColor;
in vec3 posInEye;
layout(location = 0) out vec4 fragColor;
//锚点变色逻辑,高爽写得代码,逻辑没变,复制到这
//变色有两种策略一种是直接立刻变色s1另一种是缓慢变色s2。保持原色为s0
vec4 changeColorMethod(vec4 texColor){
vec4 retColor = vec4(0.0);
if(_changeColorCmd==0.0){
if(isReplaceColor){
if(isMixColor == 0){
retColor = mix(texColor,replacedColor,1.0); //s1
}else{
retColor = mix(texColor,replacedColor,0.5); //s1
}
}else
retColor = texColor; //s0
}else if(_changeColorCmd==5.0){
retColor = mix(texColor,replacedColor,_changeColorRatio);
}else if(_changeColorCmd==6.0){
retColor = mix(texColor,replacedColor,1.0-_changeColorRatio);
}else if(_changeColorRatio==0.0){
if(_changeColorCmd==1.0)
retColor = mix(texColor,replacedColor,0.5);
else
retColor = texColor;
}else{
float d = mod(abs(_changeColorCmd), 2.0);
vec4 tex_ = mix(texColor,replacedColor,0.5);
float t = _changeColorCmd > 0.0 ? (d==1.0?_changeColorRatio:1.0-_changeColorRatio) : (d==1.0?1.0-_changeColorRatio:_changeColorRatio);
if (t > _changeColorOff+0.2)
retColor = d==1.0 ? tex_ : texColor;
else if (t > _changeColorOff)
{
float k = d==1.0 ? 0.5-(_changeColorOff+0.2-t)/0.4 : (_changeColorOff+0.2-t)/0.4;
retColor = replacedColor*k + texColor*(1.0-k);
}
else
retColor = d==1.0 ? texColor : tex_;
}
return retColor;
}
void setLinearFog()
{
if(!isFogEnable)
return;
float distanceFromCamera = length(posInEye-cameraPos);
if(distanceFromCamera<fogStart)
return;
float fogAlpha=(distanceFromCamera-fogStart)/(fogEnd-fogStart);
fogAlpha=clamp(fogAlpha,0.0,1.0)*fogDensity;
fragColor.rgb = mix(fragColor.rgb,fogColor,fogAlpha);
}
void setBlur()
{
if(!isBlurEnable)
return;
float distanceFromOrigin = length(posInEye-vec3(0.0,0.0,0.0));
if(distanceFromOrigin<(blurStart*zoom))
return;
float blurAlpha= 1.0-exp(-(distanceFromOrigin/50.0));
// float blurAlpha = smoothstep(distanceFromOrigin,blurStart*zoom,blurEnd*zoom);
// float blurAlpha = (distanceFromOrigin - (blurStart*zoom)) / ((blurEnd*zoom) - (blurStart*zoom));
blurAlpha=clamp(blurAlpha,0.0,1.0)*blurDensity;
fragColor.rgb = mix(fragColor.rgb,blurColor,blurAlpha);
}
void main()
{
//点光源光照Blinn-Phong模型
fragColor = texture(texId,fragTexCoord);
return;
vec3 L = normalize(fragEyePos - lightEyePos); //光源到此片元的方向
vec3 N = normalize(fragEyeNormal); //此片元法线
vec3 V = normalize(fragEyePos); //眼睛观察此片元的方向
vec3 H = normalize(-L-V); //半向量
float diffuse = max(dot(-L,N),0.0); //漫反射系数
float specular = 0.0; //高光系数
if(diffuse!=0.0)
specular = pow(max(dot(H, N),0.0), specularPow); //高光系数
vec4 oriColor=vec4(0.0); //片元原来的颜色
vec4 baseColor=vec4(0.0);
if(isUsePureColor)
baseColor = pureColor;
else
baseColor = texture(texId,fragTexCoord);
oriColor = changeColorMethod(baseColor * colorFac);
fragColor = oriColor * (ambientColor + diffuseColor * diffuse) + specularColor * specular; //融合这几种颜色
fragColor+=oriColor*vec4(0.3)*max(dot(vec3(0,0,1),N),0.0); //罗欢说模型屁股那太黑,给屁股那增加点颜色
if(isIce)
fragColor+=vec4(.0,.0,0.2,0.0);
fragColor.a = oriColor.a;
setLinearFog();
setBlur();
}