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

173 lines
4.5 KiB
GLSL

#version 300 es
precision highp float;
precision mediump int;
uniform mat4 modelMat;
uniform mat4 viewMat;
uniform mat4 projMat;
uniform mat4 mvMat;
uniform mat4 mvpMat;
uniform vec3 zebraPos0;
uniform vec3 zebraPos1;
uniform mat4 lightEyeMat; //光源的lookat矩阵
uniform mat4 lightProjMat;
uniform mat4 biasMat; //映射矩阵,将[-1,1]映射到[0,1]
uniform bool isRenderZebra; //斑马线渲染
uniform bool isShadow; //是否渲染阴影
uniform bool isSpotLight; //是否聚光灯
uniform bool isTex; //是否是纹理
uniform bool isWave; //流光效果
uniform bool isRenderSignalLine; //信号线
uniform float signalLineTime; //信号线时间
uniform int signalLineStep; //信号线阶段
uniform int signalLineObj; //信号线对象
uniform float signalScale; //信号线x方向缩放
uniform bool isWater; //水系
uniform float waterTime; //水系滚动时间
uniform bool isRenderDivider;
uniform vec3 dividerPos0;
uniform vec3 dividerPos1;
uniform bool isGuideLine; //引导线
uniform float guideLineTime;
uniform bool isLeadLine;
uniform float leadLineWaveTime;
uniform float leadLineArrowTime;
uniform float leadLineTotalUVY;
uniform bool isLeadLineUseWorldPos;
uniform bool isScaleInSkybox;
uniform bool isBuilding;
layout( location = 0 ) in vec4 pos;
layout(location = 1) in vec4 color;
layout(location = 2) in vec3 normal;
layout(location = 3) in vec2 uv;
out vec4 posInLight; //从光源位置看此片元的proj坐标
out vec4 _color;
out vec3 posInEye; //片元的view坐标
out vec3 worldPos; //片元的view坐标
out vec2 _uv;
out float signalLineTexY;
out float waveOff;
out float guideLineTexY;
out float leadLineWaveOff;
out float leadLineTexY;
out vec2 leadLineFlowLightUV;
out vec4 ndc;
void setZebra(){
vec4 pos0 = projMat*viewMat*modelMat * vec4(zebraPos0,1.0);
vec4 pos1 = projMat*viewMat*modelMat * vec4(zebraPos1,1.0);
float d = distance(pos0.xy/pos0.w,pos1.xy/pos1.w); //求出斑马线长边的长度
int cnt = 0; //根据长边的长度决定画几根斑马线
if(d<0.03)
cnt = 1;
else if(d<0.1)
cnt = 3;
else if(d<0.3)
cnt = 5;
else if(d<0.5)
cnt = 15;
else if(d < 1.4)
cnt = 30;
else
cnt = 30;
_uv = uv*float(cnt);
}
void setColor(){
_color = color;
}
void setTex(){
_uv = uv;
if(isScaleInSkybox){
_uv.y = (_uv.y-0.5)*2.0 + 0.5;
}
}
bool hasSetPosInEye = false;
void setPosInEye(){
if(!hasSetPosInEye){
posInEye = (viewMat * modelMat * pos).xyz;
hasSetPosInEye = true;
}
}
void setPosInLight(){
posInLight = biasMat*lightProjMat * lightEyeMat * modelMat * pos;
}
void setWater(){
_uv.x = _uv.x + waterTime;
}
void setWave(){
vec4 p = modelMat * pos;
waveOff = p.y/10.0;
}
void setLeadLine(){
leadLineWaveOff = smoothstep(0.0,leadLineTotalUVY/10.0,_uv.y/10.0);
leadLineTexY = _uv.y;
if(isLeadLineUseWorldPos){
vec4 p = modelMat * pos;
_uv.y = -p.y;
leadLineFlowLightUV.y = p.y/10.0/5.0;
}else{
_uv.y = -_uv.y;
leadLineFlowLightUV = _uv + vec2(0.0,1.0)*leadLineArrowTime*5.0;
}
}
void setSignalLine(){
if(signalLineObj==1 && signalLineStep>0){
_uv.x = uv.x;
_uv.y = uv.y;
signalLineTexY = _uv.y;
_uv = _uv + vec2(0.0,1.0);
}
}
void setGuideLine(){
_uv.x = uv.x;
_uv.y = -uv.y;
_uv = _uv + vec2(0.0,1.0)*guideLineTime;
guideLineTexY = uv.y;
}
void main()
{
if(isBuilding){
_uv = uv;
}
worldPos = (modelMat * pos).xyz;
setPosInEye();
if(isLeadLine){
setTex();
setColor();
setLeadLine();
gl_Position = projMat*viewMat*modelMat * pos;
ndc = gl_Position;
return;
}
if(isRenderDivider){
vec4 pos0 = projMat*viewMat*modelMat * vec4(dividerPos0,1.0);
vec4 pos1 = projMat*viewMat*modelMat * vec4(dividerPos1,1.0);
float d = distance(pos0.xy/pos0.w,pos1.xy/pos1.w); //求出车道线的宽度
if(d<0.001) //线宽小于阈值,丢弃
return;
}
if(isShadow){
setPosInLight();
setPosInEye();
}
if(isSpotLight){
setPosInEye();
}
if(isTex)
setTex();
else
setColor();
if(isRenderZebra)
setZebra();
if(isWave)
setWave();
if(isWater)
setWater();
if(isRenderSignalLine)
setSignalLine();
if(isGuideLine)
setGuideLine();
gl_Position = projMat*viewMat*modelMat * pos;
ndc = gl_Position;
gl_PointSize = (1.0-gl_Position.z/gl_Position.w)*70.0;
}