diff options
Diffstat (limited to 'source/blender/draw/engines/eevee/shaders')
7 files changed, 69 insertions, 5 deletions
diff --git a/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl b/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl index 5aac853da00..ceed99a7b80 100644 --- a/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl +++ b/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl @@ -10,12 +10,26 @@ uniform mat4 ProjectionMatrix; uniform mat4 ViewMatrixInverse; -uniform mat4 ViewMatrix; uniform vec4 viewvecs[2]; +#ifndef SHADOW_SHADER +uniform mat4 ViewMatrix; +#else +layout(std140) uniform shadow_render_block { + mat4 ShadowMatrix[6]; + mat4 FaceViewMatrix[6]; + vec4 lampPosition; + int layer; + float exponent; +}; + +flat in int shFace; /* Shadow layer we are rendering to. */ +#define ViewMatrix FaceViewMatrix[shFace] +#endif #define cameraForward normalize(ViewMatrixInverse[2].xyz) #define cameraPos ViewMatrixInverse[3].xyz + /* ------- Structures -------- */ #ifdef VOLUMETRICS diff --git a/source/blender/draw/engines/eevee/shaders/prepass_frag.glsl b/source/blender/draw/engines/eevee/shaders/prepass_frag.glsl index f921d56e3bc..cf59b29548a 100644 --- a/source/blender/draw/engines/eevee/shaders/prepass_frag.glsl +++ b/source/blender/draw/engines/eevee/shaders/prepass_frag.glsl @@ -62,6 +62,10 @@ float hashed_alpha_threshold(vec3 co) uniform float alphaThreshold; #endif +#ifdef SHADOW_SHADER +out vec4 FragColor; +#endif + void main() { /* For now do nothing. @@ -82,4 +86,9 @@ void main() discard; #endif #endif + +#ifdef SHADOW_SHADER + float dist = distance(lampPosition.xyz, worldPosition.xyz); + FragColor = vec4(dist, 0.0, 0.0, 1.0); +#endif } diff --git a/source/blender/draw/engines/eevee/shaders/shadow_frag.glsl b/source/blender/draw/engines/eevee/shaders/shadow_frag.glsl index 3fc3c146c66..df6fbc4c2fe 100644 --- a/source/blender/draw/engines/eevee/shaders/shadow_frag.glsl +++ b/source/blender/draw/engines/eevee/shaders/shadow_frag.glsl @@ -1,6 +1,7 @@ layout(std140) uniform shadow_render_block { mat4 ShadowMatrix[6]; + mat4 FaceViewMatrix[6]; vec4 lampPosition; int layer; float exponent; diff --git a/source/blender/draw/engines/eevee/shaders/shadow_geom.glsl b/source/blender/draw/engines/eevee/shaders/shadow_geom.glsl index afc78c4a8f8..d9d30c4d9e6 100644 --- a/source/blender/draw/engines/eevee/shaders/shadow_geom.glsl +++ b/source/blender/draw/engines/eevee/shaders/shadow_geom.glsl @@ -1,6 +1,7 @@ layout(std140) uniform shadow_render_block { mat4 ShadowMatrix[6]; + mat4 FaceViewMatrix[6]; vec4 lampPosition; int layer; float exponent; @@ -12,15 +13,36 @@ layout(triangle_strip, max_vertices=3) out; in vec4 vPos[]; flat in int face[]; +#ifdef MESH_SHADER +in vec3 vNor[]; +in vec3 vNor[]; +#endif + out vec3 worldPosition; +#ifdef MESH_SHADER +out vec3 viewPosition; /* Required. otherwise generate linking error. */ +out vec3 worldNormal; /* Required. otherwise generate linking error. */ +out vec3 viewNormal; /* Required. otherwise generate linking error. */ +flat out int shFace; +#else +int shFace; +#endif void main() { - int f = face[0]; - gl_Layer = f; + shFace = face[0]; + gl_Layer = shFace; for (int v = 0; v < 3; ++v) { - gl_Position = ShadowMatrix[f] * vPos[v]; + gl_Position = ShadowMatrix[shFace] * vPos[v]; worldPosition = vPos[v].xyz; +#ifdef MESH_SHADER + worldNormal = vNor[v]; + viewPosition = (FaceViewMatrix[shFace] * vec4(worldPosition, 1.0)).xyz; + viewNormal = (FaceViewMatrix[shFace] * vec4(worldNormal, 0.0)).xyz; +#ifdef ATTRIB + pass_attrib(v); +#endif +#endif EmitVertex(); } diff --git a/source/blender/draw/engines/eevee/shaders/shadow_store_frag.glsl b/source/blender/draw/engines/eevee/shaders/shadow_store_frag.glsl index 40b980b3904..6782922a2e4 100644 --- a/source/blender/draw/engines/eevee/shaders/shadow_store_frag.glsl +++ b/source/blender/draw/engines/eevee/shaders/shadow_store_frag.glsl @@ -1,6 +1,7 @@ layout(std140) uniform shadow_render_block { mat4 ShadowMatrix[6]; + mat4 FaceViewMatrix[6]; vec4 lampPosition; int layer; float exponent; diff --git a/source/blender/draw/engines/eevee/shaders/shadow_store_geom.glsl b/source/blender/draw/engines/eevee/shaders/shadow_store_geom.glsl index 1d456095e02..78ccb025ce6 100644 --- a/source/blender/draw/engines/eevee/shaders/shadow_store_geom.glsl +++ b/source/blender/draw/engines/eevee/shaders/shadow_store_geom.glsl @@ -1,6 +1,7 @@ layout(std140) uniform shadow_render_block { mat4 ShadowMatrix[6]; + mat4 FaceViewMatrix[6]; vec4 lampPosition; int layer; float exponent; diff --git a/source/blender/draw/engines/eevee/shaders/shadow_vert.glsl b/source/blender/draw/engines/eevee/shaders/shadow_vert.glsl index 288098ba771..777902ccba8 100644 --- a/source/blender/draw/engines/eevee/shaders/shadow_vert.glsl +++ b/source/blender/draw/engines/eevee/shaders/shadow_vert.glsl @@ -1,13 +1,29 @@ uniform mat4 ShadowModelMatrix; +#ifdef MESH_SHADER +uniform mat3 WorldNormalMatrix; +#endif in vec3 pos; +#ifdef MESH_SHADER +in vec3 nor; +#endif out vec4 vPos; +#ifdef MESH_SHADER +out vec3 vNor; +#endif flat out int face; void main() { vPos = ShadowModelMatrix * vec4(pos, 1.0); face = gl_InstanceID; -}
\ No newline at end of file + +#ifdef MESH_SHADER + vNor = WorldNormalMatrix * nor; +#ifdef ATTRIB + pass_attrib(pos); +#endif +#endif +} |