forked from townforge/Urho3D
239 lines
6.5 KiB
GLSL
239 lines
6.5 KiB
GLSL
#if defined (COMPILEVS) || defined(COMPILEHS) || defined(COMPILEDS) || defined(COMPILEGS)
|
|
|
|
// Silence WARNING: Shader ... does not use the define NOUV
|
|
#ifdef NOUV
|
|
#endif
|
|
|
|
// Silence GLSL 150 deprecation warnings
|
|
#ifdef GL3
|
|
#define attribute in
|
|
#define varying out
|
|
#endif
|
|
|
|
#ifndef COMPILEGS
|
|
attribute vec4 iPos;
|
|
attribute vec3 iNormal;
|
|
attribute vec4 iColor;
|
|
#if defined(POINTBILLBOARD) || defined(POINTDIRBILLBOARD)
|
|
attribute vec4 iTexCoord;
|
|
attribute vec4 iTexCoord1;
|
|
#else
|
|
attribute vec2 iTexCoord;
|
|
attribute vec2 iTexCoord1;
|
|
#endif
|
|
attribute vec4 iTangent;
|
|
attribute vec4 iBlendWeights;
|
|
attribute vec4 iBlendIndices;
|
|
attribute vec3 iCubeTexCoord;
|
|
attribute vec4 iCubeTexCoord1;
|
|
#ifdef INSTANCED
|
|
attribute vec4 iTexCoord4;
|
|
attribute vec4 iTexCoord5;
|
|
attribute vec4 iTexCoord6;
|
|
#endif
|
|
attribute float iObjectIndex;
|
|
#endif
|
|
|
|
#ifdef SKINNED
|
|
mat4 GetSkinMatrix(vec4 blendWeights, vec4 blendIndices)
|
|
{
|
|
ivec4 idx = ivec4(blendIndices) * 3;
|
|
const vec4 lastColumn = vec4(0.0, 0.0, 0.0, 1.0);
|
|
return mat4(cSkinMatrices[idx.x], cSkinMatrices[idx.x + 1], cSkinMatrices[idx.x + 2], lastColumn) * blendWeights.x +
|
|
mat4(cSkinMatrices[idx.y], cSkinMatrices[idx.y + 1], cSkinMatrices[idx.y + 2], lastColumn) * blendWeights.y +
|
|
mat4(cSkinMatrices[idx.z], cSkinMatrices[idx.z + 1], cSkinMatrices[idx.z + 2], lastColumn) * blendWeights.z +
|
|
mat4(cSkinMatrices[idx.w], cSkinMatrices[idx.w + 1], cSkinMatrices[idx.w + 2], lastColumn) * blendWeights.w;
|
|
}
|
|
#endif
|
|
|
|
#ifndef COMPILEGS
|
|
#ifdef INSTANCED
|
|
mat4 GetInstanceMatrix()
|
|
{
|
|
const vec4 lastColumn = vec4(0.0, 0.0, 0.0, 1.0);
|
|
return mat4(iTexCoord4, iTexCoord5, iTexCoord6, lastColumn);
|
|
}
|
|
#endif
|
|
#endif
|
|
|
|
mat3 GetNormalMatrix(mat4 modelMatrix)
|
|
{
|
|
return mat3(modelMatrix[0].xyz, modelMatrix[1].xyz, modelMatrix[2].xyz);
|
|
}
|
|
|
|
vec2 GetTexCoord(vec2 texCoord)
|
|
{
|
|
return vec2(dot(texCoord, cUOffset.xy) + cUOffset.w, dot(texCoord, cVOffset.xy) + cVOffset.w);
|
|
}
|
|
|
|
vec4 GetClipPos(vec3 worldPos)
|
|
{
|
|
vec4 ret = vec4(worldPos, 1.0) * cViewProj;
|
|
// While getting the clip coordinate, also automatically set gl_ClipVertex for user clip planes
|
|
#if !defined(GL_ES) && !defined(GL3)
|
|
gl_ClipVertex = ret;
|
|
#elif defined(GL3) && !defined(GL4)
|
|
gl_ClipDistance[0] = dot(cClipPlane, ret);
|
|
#endif
|
|
return ret;
|
|
}
|
|
|
|
float GetZonePos(vec3 worldPos)
|
|
{
|
|
return clamp((vec4(worldPos, 1.0) * cZone).z, 0.0, 1.0);
|
|
}
|
|
|
|
float GetDepth(vec4 clipPos)
|
|
{
|
|
return dot(clipPos.zw, cDepthMode.zw);
|
|
}
|
|
|
|
#if defined(BILLBOARD) || defined(POINTBILLBOARD)
|
|
vec3 GetBillboardPos(vec4 iPos, vec2 iSize, mat4 modelMatrix)
|
|
{
|
|
return (iPos * modelMatrix).xyz + vec3(iSize.x, iSize.y, 0.0) * cBillboardRot;
|
|
}
|
|
|
|
vec3 GetBillboardNormal()
|
|
{
|
|
return vec3(-cBillboardRot[0][2], -cBillboardRot[1][2], -cBillboardRot[2][2]);
|
|
}
|
|
#endif
|
|
|
|
#if defined(DIRBILLBOARD) || defined(POINTDIRBILLBOARD)
|
|
mat3 GetFaceCameraRotation(vec3 position, vec3 direction)
|
|
{
|
|
vec3 cameraDir = normalize(position - cCameraPos);
|
|
vec3 front = normalize(direction);
|
|
vec3 right = normalize(cross(front, cameraDir));
|
|
vec3 up = normalize(cross(front, right));
|
|
|
|
return mat3(
|
|
right.x, up.x, front.x,
|
|
right.y, up.y, front.y,
|
|
right.z, up.z, front.z
|
|
);
|
|
}
|
|
|
|
#ifndef POINTEXPAND
|
|
vec3 GetBillboardPos(vec4 iPos, vec3 iDirection, mat4 modelMatrix)
|
|
{
|
|
vec3 worldPos = (iPos * modelMatrix).xyz;
|
|
return worldPos + vec3(iTexCoord1.x, 0.0, iTexCoord1.y) * GetFaceCameraRotation(worldPos, iDirection);
|
|
}
|
|
#endif
|
|
|
|
vec3 GetBillboardNormal(vec4 iPos, vec3 iDirection, mat4 modelMatrix)
|
|
{
|
|
vec3 worldPos = (iPos * modelMatrix).xyz;
|
|
return vec3(0.0, 1.0, 0.0) * GetFaceCameraRotation(worldPos, iDirection);
|
|
}
|
|
#endif
|
|
|
|
#ifdef TRAILFACECAM
|
|
vec3 GetTrailPos(vec4 iPos, vec3 iFront, float iScale, mat4 modelMatrix)
|
|
{
|
|
vec3 up = normalize(cCameraPos - iPos.xyz);
|
|
vec3 right = normalize(cross(iFront, up));
|
|
return (vec4((iPos.xyz + right * iScale), 1.0) * modelMatrix).xyz;
|
|
}
|
|
|
|
vec3 GetTrailNormal(vec4 iPos)
|
|
{
|
|
return normalize(cCameraPos - iPos.xyz);
|
|
}
|
|
#endif
|
|
|
|
#ifdef TRAILBONE
|
|
vec3 GetTrailPos(vec4 iPos, vec3 iParentPos, float iScale, mat4 modelMatrix)
|
|
{
|
|
vec3 right = iParentPos - iPos.xyz;
|
|
return (vec4((iPos.xyz + right * iScale), 1.0) * modelMatrix).xyz;
|
|
}
|
|
|
|
vec3 GetTrailNormal(vec4 iPos, vec3 iParentPos, vec3 iForward)
|
|
{
|
|
vec3 left = normalize(iPos.xyz - iParentPos);
|
|
vec3 up = normalize(cross(normalize(iForward), left));
|
|
return up;
|
|
}
|
|
#endif
|
|
|
|
#if defined(SKINNED)
|
|
#define iModelMatrix GetSkinMatrix(iBlendWeights, iBlendIndices)
|
|
#elif defined(INSTANCED)
|
|
#define iModelMatrix GetInstanceMatrix()
|
|
#else
|
|
#define iModelMatrix cModel
|
|
#endif
|
|
|
|
#ifndef COMPILEGS
|
|
vec3 GetWorldPos(mat4 modelMatrix)
|
|
{
|
|
#if defined(BILLBOARD)
|
|
return GetBillboardPos(iPos, iTexCoord1, modelMatrix);
|
|
#elif defined(DIRBILLBOARD)
|
|
return GetBillboardPos(iPos, iNormal, modelMatrix);
|
|
#elif defined(TRAILFACECAM)
|
|
return GetTrailPos(iPos, iTangent.xyz, iTangent.w, modelMatrix);
|
|
#elif defined(TRAILBONE)
|
|
return GetTrailPos(iPos, iTangent.xyz, iTangent.w, modelMatrix);
|
|
#else
|
|
return (iPos * modelMatrix).xyz;
|
|
#endif
|
|
}
|
|
|
|
vec3 GetWorldNormal(mat4 modelMatrix)
|
|
{
|
|
#if defined(BILLBOARD)
|
|
return GetBillboardNormal();
|
|
#elif defined(DIRBILLBOARD)
|
|
return GetBillboardNormal(iPos, iNormal, modelMatrix);
|
|
#elif defined(TRAILFACECAM)
|
|
return GetTrailNormal(iPos);
|
|
#elif defined(TRAILBONE)
|
|
return GetTrailNormal(iPos, iTangent.xyz, iNormal);
|
|
#else
|
|
return normalize(iNormal * GetNormalMatrix(modelMatrix));
|
|
#endif
|
|
}
|
|
|
|
vec4 GetWorldTangent(mat4 modelMatrix)
|
|
{
|
|
#if defined(BILLBOARD)
|
|
return vec4(normalize(vec3(1.0, 0.0, 0.0) * cBillboardRot), 1.0);
|
|
#elif defined(DIRBILLBOARD)
|
|
return vec4(normalize(vec3(1.0, 0.0, 0.0) * GetNormalMatrix(modelMatrix)), 1.0);
|
|
#else
|
|
return vec4(normalize(iTangent.xyz * GetNormalMatrix(modelMatrix)), iTangent.w);
|
|
#endif
|
|
}
|
|
#endif
|
|
|
|
#else
|
|
|
|
// Silence GLSL 150 deprecation warnings
|
|
#ifdef GL3
|
|
#define varying in
|
|
|
|
#ifndef MRT_COUNT
|
|
|
|
#if defined(DEFERRED)
|
|
#define MRT_COUNT 4
|
|
#elif defined(PREPASS)
|
|
#define MRT_COUNT 2
|
|
#else
|
|
#define MRT_COUNT 1
|
|
#endif
|
|
|
|
#endif
|
|
|
|
out vec4 fragData[MRT_COUNT];
|
|
|
|
|
|
#define gl_FragColor fragData[0]
|
|
#define gl_FragData fragData
|
|
#endif
|
|
|
|
#endif
|