parent
d444c28183
commit
dd2626c560
@ -1,200 +0,0 @@ |
|||||||
#import "Common/ShaderLib/GLSLCompat.glsllib" |
|
||||||
#import "Common/ShaderLib/Lighting.glsllib" |
|
||||||
#import "Common/ShaderLib/InPassShadows.glsllib" |
|
||||||
#import "Common/ShaderLib/PBR.glsllib" |
|
||||||
|
|
||||||
#ifndef NUM_DIR_LIGHTS |
|
||||||
#define NUM_DIR_LIGHTS 0 |
|
||||||
#endif |
|
||||||
|
|
||||||
#ifndef NUM_POINT_LIGHTS |
|
||||||
#define NUM_POINT_LIGHTS 0 |
|
||||||
#endif |
|
||||||
|
|
||||||
#ifndef NUM_SPOT_LIGHTS |
|
||||||
#define NUM_SPOT_LIGHTS 0 |
|
||||||
#endif |
|
||||||
|
|
||||||
#define DIR_SHADOW_LIGHT_START (0) |
|
||||||
#define DIR_SHADOW_LIGHT_END (NUM_SHADOW_DIR_LIGHTS * 2) |
|
||||||
|
|
||||||
#define DIR_LIGHT_START (DIR_SHADOW_LIGHT_END) |
|
||||||
#define DIR_LIGHT_END (DIR_LIGHT_START + NUM_DIR_LIGHTS * 2) |
|
||||||
|
|
||||||
#define POINT_SHADOW_LIGHT_START (DIR_LIGHT_END) |
|
||||||
#define POINT_SHADOW_LIGHT_END (POINT_SHADOW_LIGHT_START + NUM_SHADOW_POINT_LIGHTS * 2) |
|
||||||
|
|
||||||
#define POINT_LIGHT_START (POINT_SHADOW_LIGHT_END) |
|
||||||
#define POINT_LIGHT_END (POINT_LIGHT_START + NUM_POINT_LIGHTS * 2) |
|
||||||
|
|
||||||
#define SPOT_SHADOW_LIGHT_START (POINT_LIGHT_END) |
|
||||||
#define SPOT_SHADOW_LIGHT_END (SPOT_SHADOW_LIGHT_START + NUM_SHADOW_SPOT_LIGHTS * 3) |
|
||||||
|
|
||||||
#define SPOT_LIGHT_START (SPOT_SHADOW_LIGHT_END) |
|
||||||
#define SPOT_LIGHT_END (SPOT_LIGHT_START + NUM_SPOT_LIGHTS * 3) |
|
||||||
|
|
||||||
#define LIGHT_DATA_SIZE (NUM_SHADOW_DIR_LIGHTS * 2 ) |
|
||||||
|
|
||||||
uniform vec3 g_CameraPosition; |
|
||||||
|
|
||||||
uniform sampler2D m_AmbientMap; |
|
||||||
uniform float m_AlphaDiscardThreshold; |
|
||||||
uniform float m_Shininess; |
|
||||||
uniform vec4 g_AmbientLightColor; |
|
||||||
|
|
||||||
#if LIGHT_DATA_SIZE > 0 |
|
||||||
uniform vec4 g_LightData[LIGHT_DATA_SIZE]; |
|
||||||
#else |
|
||||||
const vec4 g_LightData[1] = vec4[]( vec4(1.0) ); |
|
||||||
#endif |
|
||||||
|
|
||||||
varying vec3 vPos; |
|
||||||
varying vec3 vNormal; |
|
||||||
varying vec2 vTexCoord; |
|
||||||
|
|
||||||
struct surface_t { |
|
||||||
vec3 position; |
|
||||||
vec3 normal; |
|
||||||
vec3 viewDir; |
|
||||||
vec3 ambient; |
|
||||||
vec4 diffuse; |
|
||||||
vec4 specular; |
|
||||||
float roughness; |
|
||||||
float ndotv; |
|
||||||
}; |
|
||||||
|
|
||||||
void Lighting_Process(in int lightIndex, in surface_t surface, out vec3 outDiffuse, out vec3 outSpecular, inout int startProjIndex) { |
|
||||||
vec4 lightColor = g_LightData[lightIndex]; |
|
||||||
vec4 lightData1 = g_LightData[lightIndex + 1]; |
|
||||||
float shadowMapIndex = -1.0; |
|
||||||
|
|
||||||
if (lightColor.w < 0.0) { |
|
||||||
lightColor.w = -lightColor.w; |
|
||||||
shadowMapIndex = floor(lightColor.w); |
|
||||||
lightColor.w = lightColor.w - shadowMapIndex; |
|
||||||
} |
|
||||||
|
|
||||||
vec4 lightDir; |
|
||||||
vec3 lightVec; |
|
||||||
lightComputeDir(surface.position, lightColor.w, lightData1, lightDir, lightVec); |
|
||||||
|
|
||||||
if (shadowMapIndex >= 0.0) { |
|
||||||
lightDir.w *= Shadow_Process(lightColor.w, lightDir.xyz, shadowMapIndex, startProjIndex); |
|
||||||
} |
|
||||||
|
|
||||||
if (lightColor.w >= 0.5) { |
|
||||||
lightDir.w *= computeSpotFalloff(g_LightData[lightIndex + 2], lightDir.xyz); |
|
||||||
} |
|
||||||
|
|
||||||
lightColor.rgb *= lightDir.w; |
|
||||||
|
|
||||||
PBR_ComputeDirectLightSpecWF(surface.normal, lightDir.xyz, surface.viewDir, |
|
||||||
lightColor.rgb, surface.specular.rgb, surface.roughness, surface.ndotv, |
|
||||||
outDiffuse, outSpecular); |
|
||||||
} |
|
||||||
|
|
||||||
void Lighting_ProcessAll(surface_t surface, out vec3 ambient, out vec3 diffuse, out vec3 specular) { |
|
||||||
|
|
||||||
ambient = g_AmbientLightColor.rgb; |
|
||||||
diffuse = vec3(0.0); |
|
||||||
specular = vec3(0.0); |
|
||||||
|
|
||||||
Shadow_ProcessPssmSlice(); |
|
||||||
|
|
||||||
#if LIGHT_DATA_SIZE > 0 |
|
||||||
int projIndex = 0; |
|
||||||
|
|
||||||
for (int i = SPOT_SHADOW_LIGHT_START; i < SPOT_SHADOW_LIGHT_END; i += 3) { |
|
||||||
vec3 outDiffuse, outSpecular; |
|
||||||
Lighting_Process(i, surface, outDiffuse, outSpecular, projIndex); |
|
||||||
diffuse += outDiffuse; |
|
||||||
specular += outSpecular; |
|
||||||
} |
|
||||||
|
|
||||||
for (int i = SPOT_LIGHT_START; i < SPOT_LIGHT_END; i += 3) { |
|
||||||
vec3 outDiffuse, outSpecular; |
|
||||||
Lighting_Process(i, surface, outDiffuse, outSpecular, projIndex); |
|
||||||
diffuse += outDiffuse; |
|
||||||
specular += outSpecular; |
|
||||||
} |
|
||||||
|
|
||||||
for (int i = DIR_SHADOW_LIGHT_START; i < DIR_SHADOW_LIGHT_END; i += 2) { |
|
||||||
vec3 outDiffuse, outSpecular; |
|
||||||
Lighting_Process(i, surface, outDiffuse, outSpecular, projIndex); |
|
||||||
diffuse += outDiffuse; |
|
||||||
specular += outSpecular; |
|
||||||
} |
|
||||||
|
|
||||||
for (int i = DIR_LIGHT_START; i < DIR_LIGHT_END; i += 2) { |
|
||||||
vec3 outDiffuse, outSpecular; |
|
||||||
Lighting_Process(i, surface, outDiffuse, outSpecular, projIndex); |
|
||||||
diffuse += outDiffuse; |
|
||||||
specular += outSpecular; |
|
||||||
} |
|
||||||
|
|
||||||
for (int i = POINT_SHADOW_LIGHT_START; i < POINT_SHADOW_LIGHT_END; i += 2) { |
|
||||||
vec3 outDiffuse, outSpecular; |
|
||||||
Lighting_Process(i, surface, outDiffuse, outSpecular, projIndex); |
|
||||||
diffuse += outDiffuse; |
|
||||||
specular += outSpecular; |
|
||||||
} |
|
||||||
|
|
||||||
for (int i = POINT_LIGHT_START; i < POINT_LIGHT_END; i += 2) { |
|
||||||
vec3 outDiffuse, outSpecular; |
|
||||||
Lighting_Process(i, surface, outDiffuse, outSpecular, projIndex); |
|
||||||
diffuse += outDiffuse; |
|
||||||
specular += outSpecular; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif |
|
||||||
} |
|
||||||
|
|
||||||
surface_t getSurface() { |
|
||||||
surface_t s; |
|
||||||
s.position = vPos; |
|
||||||
s.normal = normalize(vNormal); |
|
||||||
if (!gl_FrontFacing) { |
|
||||||
s.normal = -s.normal; |
|
||||||
} |
|
||||||
s.viewDir = normalize(g_CameraPosition - s.position); |
|
||||||
#ifdef AMBIENTMAP |
|
||||||
s.ambient = texture2D(m_AmbientMap, vTexCoord).rgb; |
|
||||||
#else |
|
||||||
s.ambient = vec3(1.0); |
|
||||||
#endif |
|
||||||
s.diffuse = vec4(1.0); |
|
||||||
s.specular = vec4(0.04, 0.04, 0.04, 1.0); |
|
||||||
s.roughness = 0.1; |
|
||||||
s.ndotv = max(0.0, dot(s.viewDir, s.normal)); |
|
||||||
return s; |
|
||||||
} |
|
||||||
|
|
||||||
void main() { |
|
||||||
vec3 ambient, diffuse, specular; |
|
||||||
|
|
||||||
surface_t surface = getSurface(); |
|
||||||
Lighting_ProcessAll(surface, ambient, diffuse, specular); |
|
||||||
|
|
||||||
vec4 color = vec4(1.0); |
|
||||||
color.rgb = ambient * surface.ambient.rgb + |
|
||||||
diffuse * surface.diffuse.rgb + |
|
||||||
specular; |
|
||||||
|
|
||||||
#ifdef DISCARD_ALPHA |
|
||||||
if (color.a < m_AlphaDiscardThreshold) { |
|
||||||
discard; |
|
||||||
} |
|
||||||
#endif |
|
||||||
|
|
||||||
gl_FragColor = color; |
|
||||||
|
|
||||||
/* |
|
||||||
vec4 projCoord = vProjCoord[0]; |
|
||||||
projCoord.xyz /= projCoord.w; |
|
||||||
float shad = shadow2D(g_ShadowMapArray, vec4(projCoord.xy, 0.0, projCoord.z)).r; |
|
||||||
vec3 amb = texture2D(m_AmbientMap, vTexCoord).rgb; |
|
||||||
gl_FragColor = vec4(amb * vec3(shad), 1.0); |
|
||||||
*/ |
|
||||||
} |
|
@ -1,32 +0,0 @@ |
|||||||
#import "Common/ShaderLib/GLSLCompat.glsllib" |
|
||||||
#import "Common/ShaderLib/Skinning.glsllib" |
|
||||||
#import "Common/ShaderLib/Instancing.glsllib" |
|
||||||
#import "Common/ShaderLib/InPassShadows.glsllib" |
|
||||||
|
|
||||||
attribute vec3 inPosition; |
|
||||||
attribute vec3 inNormal; |
|
||||||
attribute vec2 inTexCoord; |
|
||||||
attribute vec4 inColor; |
|
||||||
|
|
||||||
varying vec3 vPos; |
|
||||||
varying vec3 vNormal; |
|
||||||
varying vec2 vTexCoord; |
|
||||||
|
|
||||||
void main() { |
|
||||||
vTexCoord = inTexCoord; |
|
||||||
|
|
||||||
vec4 modelSpacePos = vec4(inPosition, 1.0); |
|
||||||
vec3 modelSpaceNorm = inNormal; |
|
||||||
|
|
||||||
#ifdef NUM_BONES |
|
||||||
Skinning_Compute(modelSpacePos, modelSpaceNorm); |
|
||||||
#endif |
|
||||||
|
|
||||||
vPos = TransformWorld(modelSpacePos).xyz; |
|
||||||
vNormal = TransformWorldNormal(modelSpaceNorm); |
|
||||||
|
|
||||||
vec3 shadowPos = TransformWorld(modelSpacePos).xyz; |
|
||||||
Shadow_ProcessProjCoord(shadowPos); |
|
||||||
|
|
||||||
gl_Position = TransformWorldViewProjection(modelSpacePos); |
|
||||||
} |
|
Loading…
Reference in new issue