128 lines
4.7 KiB
GLSL
128 lines
4.7 KiB
GLSL
#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();
|
||
} |