forked from 0ad/0ad
75 lines
1.4 KiB
GLSL
75 lines
1.4 KiB
GLSL
#if USE_GPU_SKINNING
|
|
// Skinning requires GLSL 1.30 for ivec4 vertex attributes
|
|
#version 130
|
|
#else
|
|
#version 120
|
|
#endif
|
|
|
|
uniform mat4 transform;
|
|
uniform vec3 cameraPos;
|
|
uniform vec3 sunDir;
|
|
uniform vec3 sunColor;
|
|
uniform vec2 losTransform;
|
|
uniform mat4 shadowTransform;
|
|
uniform mat4 instancingTransform;
|
|
|
|
uniform float sim_time;
|
|
uniform vec2 translation;
|
|
|
|
#if USE_SHADOW_SAMPLER && USE_SHADOW_PCF
|
|
uniform vec4 shadowScale;
|
|
#endif
|
|
|
|
|
|
attribute vec3 a_vertex;
|
|
attribute vec3 a_normal;
|
|
#if USE_INSTANCING
|
|
attribute vec4 a_tangent;
|
|
#endif
|
|
attribute vec2 a_uv0;
|
|
attribute vec2 a_uv1;
|
|
|
|
#if USE_GPU_SKINNING
|
|
const int MAX_INFLUENCES = 4;
|
|
const int MAX_BONES = 64;
|
|
uniform mat4 skinBlendMatrices[MAX_BONES];
|
|
attribute ivec4 a_skinJoints;
|
|
attribute vec4 a_skinWeights;
|
|
#endif
|
|
|
|
|
|
varying vec4 worldPos;
|
|
varying vec4 v_tex;
|
|
varying vec4 v_shadow;
|
|
varying vec2 v_los;
|
|
|
|
|
|
vec4 fakeCos(vec4 x)
|
|
{
|
|
vec4 tri = abs(fract(x + 0.5) * 2.0 - 1.0);
|
|
return tri * tri *(3.0 - 2.0 * tri);
|
|
}
|
|
|
|
|
|
|
|
void main()
|
|
{
|
|
worldPos = instancingTransform * vec4(a_vertex, 1.0);
|
|
|
|
v_tex.xy = (a_uv0 + worldPos.xz) / 5.0 + sim_time * translation;
|
|
|
|
v_tex.zw = a_uv0;
|
|
|
|
#if USE_SHADOW
|
|
v_shadow = shadowTransform * worldPos;
|
|
#if USE_SHADOW_SAMPLER && USE_SHADOW_PCF
|
|
v_shadow.xy *= shadowScale.xy;
|
|
#endif
|
|
#endif
|
|
|
|
v_los = worldPos.xz * losTransform.x + losTransform.y;
|
|
|
|
gl_Position = transform * worldPos;
|
|
}
|
|
|