149 lines
4.1 KiB
GLSL
149 lines
4.1 KiB
GLSL
/********************Entrant********************/
|
|
#if FLAG_BILLBOARD
|
|
in vec3 InstanceData0; // center
|
|
in vec4 InstanceData1; // size | sin cos
|
|
in vec4 InstanceData2; // color
|
|
#else
|
|
in mat4 InstanceData0;
|
|
#endif
|
|
|
|
in vec4 VertexColor;
|
|
in vec3 VertexPosition;
|
|
in vec3 VertexNormal;
|
|
in vec3 VertexTangent;
|
|
in vec2 VertexTexCoord;
|
|
in vec4 VertexUserdata0;
|
|
|
|
/********************Sortant********************/
|
|
out vec4 vColor;
|
|
out vec4 vLightSpacePos[3];
|
|
out mat3 vLightToWorld;
|
|
out vec3 vNormal;
|
|
out vec2 vTexCoord;
|
|
out vec3 vViewDir;
|
|
out vec3 vWorldPos;
|
|
|
|
/********************Uniformes********************/
|
|
uniform vec3 EyePosition;
|
|
uniform mat4 InvViewMatrix;
|
|
uniform mat4 LightViewProjMatrix[3];
|
|
uniform float VertexDepth;
|
|
uniform mat4 ViewMatrix;
|
|
uniform mat4 ViewProjMatrix;
|
|
uniform mat4 WorldMatrix;
|
|
uniform mat4 WorldViewProjMatrix;
|
|
|
|
/********************Fonctions********************/
|
|
void main()
|
|
{
|
|
#if FLAG_VERTEXCOLOR
|
|
vec4 color = VertexColor;
|
|
#else
|
|
vec4 color = vec4(1.0);
|
|
#endif
|
|
|
|
vec2 texCoords;
|
|
|
|
#if FLAG_BILLBOARD
|
|
#if FLAG_INSTANCING
|
|
vec3 billboardCenter = InstanceData0;
|
|
vec2 billboardSize = InstanceData1.xy;
|
|
vec2 billboardSinCos = InstanceData1.zw;
|
|
vec4 billboardColor = InstanceData2;
|
|
|
|
vec2 rotatedPosition;
|
|
rotatedPosition.x = VertexPosition.x*billboardSinCos.y - VertexPosition.y*billboardSinCos.x;
|
|
rotatedPosition.y = VertexPosition.y*billboardSinCos.y + VertexPosition.x*billboardSinCos.x;
|
|
rotatedPosition *= billboardSize;
|
|
|
|
vec3 cameraRight = vec3(ViewMatrix[0][0], ViewMatrix[1][0], ViewMatrix[2][0]);
|
|
vec3 cameraUp = vec3(ViewMatrix[0][1], ViewMatrix[1][1], ViewMatrix[2][1]);
|
|
vec3 vertexPos = billboardCenter + cameraRight*rotatedPosition.x + cameraUp*rotatedPosition.y;
|
|
|
|
gl_Position = ViewProjMatrix * vec4(vertexPos, 1.0);
|
|
color = billboardColor;
|
|
texCoords = VertexPosition.xy + 0.5;
|
|
#else
|
|
vec2 billboardCorner = VertexTexCoord - 0.5;
|
|
vec2 billboardSize = VertexUserdata0.xy;
|
|
vec2 billboardSinCos = VertexUserdata0.zw;
|
|
|
|
vec2 rotatedPosition;
|
|
rotatedPosition.x = billboardCorner.x*billboardSinCos.y - billboardCorner.y*billboardSinCos.x;
|
|
rotatedPosition.y = billboardCorner.y*billboardSinCos.y + billboardCorner.x*billboardSinCos.x;
|
|
rotatedPosition *= billboardSize;
|
|
|
|
vec3 cameraRight = vec3(ViewMatrix[0][0], ViewMatrix[1][0], ViewMatrix[2][0]);
|
|
vec3 cameraUp = vec3(ViewMatrix[0][1], ViewMatrix[1][1], ViewMatrix[2][1]);
|
|
vec3 vertexPos = VertexPosition + cameraRight*rotatedPosition.x + cameraUp*rotatedPosition.y;
|
|
|
|
gl_Position = ViewProjMatrix * vec4(vertexPos, 1.0);
|
|
texCoords = VertexTexCoord;
|
|
#endif
|
|
texCoords.y = 1.0 - texCoords.y;
|
|
#else
|
|
#if FLAG_INSTANCING
|
|
#if TRANSFORM
|
|
gl_Position = ViewProjMatrix * InstanceData0 * vec4(VertexPosition, 1.0);
|
|
#else
|
|
#if UNIFORM_VERTEX_DEPTH
|
|
gl_Position = InstanceData0 * vec4(VertexPosition.xy, VertexDepth, 1.0);
|
|
#else
|
|
gl_Position = InstanceData0 * vec4(VertexPosition, 1.0);
|
|
#endif
|
|
#endif
|
|
#else
|
|
#if TRANSFORM
|
|
gl_Position = WorldViewProjMatrix * vec4(VertexPosition, 1.0);
|
|
#else
|
|
#if UNIFORM_VERTEX_DEPTH
|
|
gl_Position = vec4(VertexPosition.xy, VertexDepth, 1.0);
|
|
#else
|
|
gl_Position = vec4(VertexPosition, 1.0);
|
|
#endif
|
|
#endif
|
|
#endif
|
|
|
|
texCoords = VertexTexCoord;
|
|
#endif
|
|
|
|
vColor = color;
|
|
|
|
#if FLAG_INSTANCING
|
|
mat3 rotationMatrix = mat3(InstanceData0);
|
|
#else
|
|
mat3 rotationMatrix = mat3(WorldMatrix);
|
|
#endif
|
|
|
|
#if COMPUTE_TBNMATRIX
|
|
vec3 binormal = cross(VertexNormal, VertexTangent);
|
|
vLightToWorld[0] = normalize(rotationMatrix * VertexTangent);
|
|
vLightToWorld[1] = normalize(rotationMatrix * binormal);
|
|
vLightToWorld[2] = normalize(rotationMatrix * VertexNormal);
|
|
#else
|
|
vNormal = normalize(rotationMatrix * VertexNormal);
|
|
#endif
|
|
|
|
#if SHADOW_MAPPING
|
|
for (int i = 0; i < 3; ++i)
|
|
vLightSpacePos[i] = LightViewProjMatrix[i] * WorldMatrix * vec4(VertexPosition, 1.0);
|
|
#endif
|
|
|
|
#if TEXTURE_MAPPING
|
|
vTexCoord = VertexTexCoord;
|
|
#endif
|
|
|
|
#if PARALLAX_MAPPING
|
|
vViewDir = EyePosition - VertexPosition;
|
|
vViewDir *= vLightToWorld;
|
|
#endif
|
|
|
|
#if !FLAG_DEFERRED
|
|
#if FLAG_INSTANCING
|
|
vWorldPos = vec3(InstanceData0 * vec4(VertexPosition, 1.0));
|
|
#else
|
|
vWorldPos = vec3(WorldMatrix * vec4(VertexPosition, 1.0));
|
|
#endif
|
|
#endif
|
|
}
|