librw/src/gl/shaders/header.vert

129 lines
2.9 KiB
GLSL
Raw Normal View History

#define DIRECTIONALS
//#define POINTLIGHTS
//#define SPOTLIGHTS
#define ATTRIB_POS 0
#define ATTRIB_NORMAL 1
#define ATTRIB_COLOR 2
#define ATTRIB_WEIGHTS 3
#define ATTRIB_INDICES 4
#define ATTRIB_TEXCOORDS0 5
#define ATTRIB_TEXCOORDS1 6
VSIN(ATTRIB_NORMAL) vec3 in_normal;
VSIN(ATTRIB_COLOR) vec4 in_color;
VSIN(ATTRIB_WEIGHTS) vec4 in_weights;
VSIN(ATTRIB_INDICES) vec4 in_indices;
VSIN(ATTRIB_TEXCOORDS0) vec2 in_tex0;
VSIN(ATTRIB_TEXCOORDS1) vec2 in_tex1;
#ifdef USE_UBOS
2020-04-26 19:33:43 +02:00
layout(std140) uniform State
{
vec2 u_alphaRef;
2020-05-15 00:00:13 +02:00
vec4 u_fogData;
2020-04-26 19:33:43 +02:00
vec4 u_fogColor;
};
#else
uniform vec2 u_alphaRef;
2020-05-15 00:00:13 +02:00
uniform vec4 u_fogData;
uniform vec4 u_fogColor;
#endif
2020-05-15 00:00:13 +02:00
#define u_fogStart (u_fogData.x)
#define u_fogEnd (u_fogData.y)
#define u_fogRange (u_fogData.z)
#define u_fogDisable (u_fogData.w)
#ifdef USE_UBOS
2020-04-26 19:33:43 +02:00
layout(std140) uniform Scene
{
mat4 u_proj;
mat4 u_view;
};
#else
uniform mat4 u_proj;
uniform mat4 u_view;
#endif
2020-04-26 19:33:43 +02:00
#define MAX_LIGHTS 8
#ifdef USE_UBOS
2020-04-26 19:33:43 +02:00
layout(std140) uniform Object
{
mat4 u_world;
vec4 u_ambLight;
vec4 u_lightParams[MAX_LIGHTS]; // type, radius, minusCosAngle, hardSpot
vec4 u_lightPosition[MAX_LIGHTS];
vec4 u_lightDirection[MAX_LIGHTS];
vec4 u_lightColor[MAX_LIGHTS];
2020-04-26 19:33:43 +02:00
};
#else
uniform mat4 u_world;
uniform vec4 u_ambLight;
uniform vec4 u_lightParams[MAX_LIGHTS]; // type, radius, minusCosAngle, hardSpot
uniform vec4 u_lightPosition[MAX_LIGHTS];
uniform vec4 u_lightDirection[MAX_LIGHTS];
uniform vec4 u_lightColor[MAX_LIGHTS];
#endif
2020-04-26 19:33:43 +02:00
uniform vec4 u_matColor;
uniform vec4 u_surfProps; // amb, spec, diff, extra
#define surfAmbient (u_surfProps.x)
#define surfSpecular (u_surfProps.y)
#define surfDiffuse (u_surfProps.z)
vec3 DoDynamicLight(vec3 V, vec3 N)
2020-04-26 19:33:43 +02:00
{
vec3 color = vec3(0.0, 0.0, 0.0);
for(int i = 0; i < MAX_LIGHTS; i++){
if(u_lightParams[i].x == 0.0)
break;
#ifdef DIRECTIONALS
if(u_lightParams[i].x == 1.0){
// direct
float l = max(0.0, dot(N, -u_lightDirection[i].xyz));
color += l*u_lightColor[i].rgb;
}else
#endif
#ifdef POINTLIGHTS
if(u_lightParams[i].x == 2.0){
// point
vec3 dir = V - u_lightPosition[i].xyz;
float dist = length(dir);
float atten = max(0.0, (1.0 - dist/u_lightParams[i].y));
float l = max(0.0, dot(N, -normalize(dir)));
color += l*u_lightColor[i].rgb*atten;
}else
#endif
#ifdef SPOTLIGHTS
if(u_lightParams[i].x == 3.0){
// spot
vec3 dir = V - u_lightPosition[i].xyz;
float dist = length(dir);
float atten = max(0.0, (1.0 - dist/u_lightParams[i].y));
dir /= dist;
float l = max(0.0, dot(N, -dir));
float pcos = dot(dir, u_lightDirection[i].xyz); // cos to point
float ccos = -u_lightParams[i].z;
float falloff = (pcos-ccos)/(1.0-ccos);
if(falloff < 0.0) // outside of cone
l = 0.0;
l *= max(falloff, u_lightParams[i].w);
return l*u_lightColor[i].rgb*atten;
}else
#endif
;
}
return color;
2020-04-26 19:33:43 +02:00
}
float DoFog(float w)
{
return clamp((w - u_fogEnd)*u_fogRange, u_fogDisable, 1.0);
}