Properly remove static pass

in-pass-shadows
Nehon 7 years ago
parent d444c28183
commit dd2626c560
  1. 21
      jme3-core/src/main/resources/Common/MatDefs/Light/Lighting.j3md
  2. 200
      jme3-core/src/main/resources/Common/MatDefs/Light/StaticLighting.frag
  3. 32
      jme3-core/src/main/resources/Common/MatDefs/Light/StaticLighting.vert

@ -128,27 +128,6 @@ MaterialDef Phong Lighting {
Boolean IsPointLight
}
Technique {
LightMode StaticPass
VertexShader GLSL100 GLSL150 : Common/MatDefs/Light/StaticLighting.vert
FragmentShader GLSL100 GLSL150 : Common/MatDefs/Light/StaticLighting.frag
WorldParameters {
WorldViewProjectionMatrix
NormalMatrix
WorldViewMatrix
ViewMatrix
CameraPosition
WorldMatrix
ViewProjectionMatrix
}
Defines {
AMBIENTMAP : AmbientMap
}
}
Technique {
LightMode SinglePass

@ -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…
Cancel
Save