173 lines
4.5 KiB
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;
|
|
} |