From cdc3754449da5cf8c83843f395dd97e71a7eba30 Mon Sep 17 00:00:00 2001 From: raysan5 Date: Wed, 31 Mar 2021 20:44:16 +0200 Subject: [PATCH] ADDED: Support model normal matrix location #1691 --- .../resources/shaders/glsl330/base_lighting.vs | 5 ++--- .../shaders/glsl330/base_lighting_instanced.vs | 12 ++++++------ src/core.c | 7 ++++--- src/models.c | 3 +++ src/raylib.h | 3 ++- src/rlgl.h | 1 + 6 files changed, 18 insertions(+), 13 deletions(-) diff --git a/examples/shaders/resources/shaders/glsl330/base_lighting.vs b/examples/shaders/resources/shaders/glsl330/base_lighting.vs index f1b75d79a..f8ec45f19 100644 --- a/examples/shaders/resources/shaders/glsl330/base_lighting.vs +++ b/examples/shaders/resources/shaders/glsl330/base_lighting.vs @@ -9,6 +9,7 @@ in vec4 vertexColor; // Input uniform values uniform mat4 mvp; uniform mat4 matModel; +uniform mat4 matNormal; // Output vertex attributes (to fragment shader) out vec3 fragPosition; @@ -24,9 +25,7 @@ void main() fragPosition = vec3(matModel*vec4(vertexPosition, 1.0)); fragTexCoord = vertexTexCoord; fragColor = vertexColor; - - mat3 normalMatrix = transpose(inverse(mat3(matModel))); - fragNormal = normalize(normalMatrix*vertexNormal); + fragNormal = normalize(vec3(matNormal*vec4(vertexNormal, 1.0))); // Calculate final vertex position gl_Position = mvp*vec4(vertexPosition, 1.0); diff --git a/examples/shaders/resources/shaders/glsl330/base_lighting_instanced.vs b/examples/shaders/resources/shaders/glsl330/base_lighting_instanced.vs index 7b7090942..d198efe1f 100644 --- a/examples/shaders/resources/shaders/glsl330/base_lighting_instanced.vs +++ b/examples/shaders/resources/shaders/glsl330/base_lighting_instanced.vs @@ -10,6 +10,7 @@ in mat4 instanceTransform; // Input uniform values uniform mat4 mvp; +uniform mat4 matNormal; // Output vertex attributes (to fragment shader) out vec3 fragPosition; @@ -21,15 +22,14 @@ out vec3 fragNormal; void main() { + // Compute MVP for current instance + mat4 mvpi = mvp*instanceTransform; + // Send vertex attributes to fragment shader - fragPosition = vec3(vec4(vertexPosition, 1.0)); + fragPosition = vec3(mvpi*vec4(vertexPosition, 1.0)); fragTexCoord = vertexTexCoord; fragColor = vertexColor; - - mat3 normalMatrix = transpose(inverse(mat3(instanceTransform))); - fragNormal = normalize(normalMatrix*vertexNormal); - - mat4 mvpi = mvp*instanceTransform; + fragNormal = normalize(vec3(matNormal*vec4(vertexNormal, 1.0))); // Calculate final vertex position gl_Position = mvpi*vec4(vertexPosition, 1.0); diff --git a/src/core.c b/src/core.c index 943523478..07de73655 100644 --- a/src/core.c +++ b/src/core.c @@ -2055,9 +2055,10 @@ Shader LoadShader(const char *vsFileName, const char *fsFileName) shader.locs[SHADER_LOC_VERTEX_COLOR] = rlGetLocationAttrib(shader.id, DEFAULT_SHADER_ATTRIB_NAME_COLOR); // Get handles to GLSL uniform locations (vertex shader) - shader.locs[SHADER_LOC_MATRIX_MVP] = rlGetLocationUniform(shader.id, "mvp"); - shader.locs[SHADER_LOC_MATRIX_PROJECTION] = rlGetLocationUniform(shader.id, "projection"); - shader.locs[SHADER_LOC_MATRIX_VIEW] = rlGetLocationUniform(shader.id, "view"); + shader.locs[SHADER_LOC_MATRIX_MVP] = rlGetLocationUniform(shader.id, "mvp"); + shader.locs[SHADER_LOC_MATRIX_VIEW] = rlGetLocationUniform(shader.id, "view"); + shader.locs[SHADER_LOC_MATRIX_PROJECTION] = rlGetLocationUniform(shader.id, "projection"); + shader.locs[SHADER_LOC_MATRIX_NORMAL] = rlGetLocationUniform(shader.id, "matNormal"); // Get handles to GLSL uniform locations (fragment shader) shader.locs[SHADER_LOC_COLOR_DIFFUSE] = rlGetLocationUniform(shader.id, "colDiffuse"); diff --git a/src/models.c b/src/models.c index 9dfdc0ea9..b0b54a213 100644 --- a/src/models.c +++ b/src/models.c @@ -1058,6 +1058,9 @@ void DrawMeshInstanced(Mesh mesh, Material material, Matrix *transforms, int ins // transform: function parameter transformation matModelView = MatrixMultiply(transforms[0], MatrixMultiply(rlGetMatrixTransform(), matView)); } + + // Upload model normal matrix (if locations available) + if (material.shader.locs[SHADER_LOC_MATRIX_NORMAL] != -1) rlSetUniformMatrix(material.shader.locs[SHADER_LOC_MATRIX_NORMAL], MatrixTranspose(MatrixInvert(matModelView))); //----------------------------------------------------- // Bind active texture maps (if available) diff --git a/src/raylib.h b/src/raylib.h index 44adb35af..aac17098e 100644 --- a/src/raylib.h +++ b/src/raylib.h @@ -739,9 +739,10 @@ typedef enum { SHADER_LOC_VERTEX_TANGENT, SHADER_LOC_VERTEX_COLOR, SHADER_LOC_MATRIX_MVP, - SHADER_LOC_MATRIX_MODEL, SHADER_LOC_MATRIX_VIEW, SHADER_LOC_MATRIX_PROJECTION, + SHADER_LOC_MATRIX_MODEL, + SHADER_LOC_MATRIX_NORMAL, SHADER_LOC_VECTOR_VIEW, SHADER_LOC_COLOR_DIFFUSE, SHADER_LOC_COLOR_SPECULAR, diff --git a/src/rlgl.h b/src/rlgl.h index 7010c433b..a6b53848b 100644 --- a/src/rlgl.h +++ b/src/rlgl.h @@ -417,6 +417,7 @@ typedef enum { SHADER_LOC_MATRIX_MVP, SHADER_LOC_MATRIX_MODEL, SHADER_LOC_MATRIX_VIEW, + SHADER_LOC_MATRIX_NORMAL, SHADER_LOC_MATRIX_PROJECTION, SHADER_LOC_VECTOR_VIEW, SHADER_LOC_COLOR_DIFFUSE,