From dfd1fe9c5ee584016563c1f6e561a7a97d2bfff9 Mon Sep 17 00:00:00 2001 From: bloeys Date: Mon, 6 May 2024 22:55:57 +0400 Subject: [PATCH] Material settings+normal matrices on CPU --- main.go | 8 ++++++++ materials/material.go | 21 +++++++++++++++++++++ renderer/rend3dgl/rend3dgl.go | 9 ++++++++- res/shaders/debug-depth.glsl | 5 ----- res/shaders/simple-unlit.glsl | 9 --------- res/shaders/simple.glsl | 7 ++----- 6 files changed, 39 insertions(+), 20 deletions(-) diff --git a/main.go b/main.go index 6ef48ec..81b50ed 100755 --- a/main.go +++ b/main.go @@ -517,9 +517,11 @@ func (g *Game) Init() { screenQuadMat.SetUnifInt32("material.diffuse", int32(materials.TextureSlot_Diffuse)) unlitMat = materials.NewMaterial("Unlit mat", "./res/shaders/simple-unlit.glsl") + unlitMat.Settings.Set(materials.MaterialSettings_HasModelMat) unlitMat.SetUnifInt32("material.diffuse", int32(materials.TextureSlot_Diffuse)) whiteMat = materials.NewMaterial("White mat", "./res/shaders/simple.glsl") + whiteMat.Settings.Set(materials.MaterialSettings_HasModelMat | materials.MaterialSettings_HasNormalMat) whiteMat.Shininess = 64 whiteMat.DiffuseTex = whiteTex.TexID whiteMat.SpecularTex = blackTex.TexID @@ -539,6 +541,7 @@ func (g *Game) Init() { whiteMat.SetUnifInt32("spotLightShadowMaps", int32(materials.TextureSlot_ShadowMap_Array1)) containerMat = materials.NewMaterial("Container mat", "./res/shaders/simple.glsl") + containerMat.Settings.Set(materials.MaterialSettings_HasModelMat | materials.MaterialSettings_HasNormalMat) containerMat.Shininess = 64 containerMat.DiffuseTex = containerDiffuseTex.TexID containerMat.SpecularTex = containerSpecularTex.TexID @@ -558,6 +561,7 @@ func (g *Game) Init() { containerMat.SetUnifInt32("spotLightShadowMaps", int32(materials.TextureSlot_ShadowMap_Array1)) palleteMat = materials.NewMaterial("Pallete mat", "./res/shaders/simple.glsl") + palleteMat.Settings.Set(materials.MaterialSettings_HasModelMat | materials.MaterialSettings_HasNormalMat) palleteMat.Shininess = 64 palleteMat.DiffuseTex = palleteTex.TexID palleteMat.SpecularTex = blackTex.TexID @@ -576,12 +580,16 @@ func (g *Game) Init() { palleteMat.SetUnifInt32("spotLightShadowMaps", int32(materials.TextureSlot_ShadowMap_Array1)) debugDepthMat = materials.NewMaterial("Debug depth mat", "./res/shaders/debug-depth.glsl") + debugDepthMat.Settings.Set(materials.MaterialSettings_HasModelMat) depthMapMat = materials.NewMaterial("Depth Map mat", "./res/shaders/depth-map.glsl") + depthMapMat.Settings.Set(materials.MaterialSettings_HasModelMat) arrayDepthMapMat = materials.NewMaterial("Array Depth Map mat", "./res/shaders/array-depth-map.glsl") + arrayDepthMapMat.Settings.Set(materials.MaterialSettings_HasModelMat) omnidirDepthMapMat = materials.NewMaterial("Omnidirectional Depth Map mat", "./res/shaders/omnidirectional-depth-map.glsl") + omnidirDepthMapMat.Settings.Set(materials.MaterialSettings_HasModelMat) skyboxMat = materials.NewMaterial("Skybox mat", "./res/shaders/skybox.glsl") skyboxMat.CubemapTex = skyboxCmap.TexID diff --git a/materials/material.go b/materials/material.go index 63dcd99..1d8efdf 100755 --- a/materials/material.go +++ b/materials/material.go @@ -21,9 +21,30 @@ const ( TextureSlot_ShadowMap_Array1 TextureSlot = 13 ) +type MaterialSettings uint64 + +const ( + MaterialSettings_None MaterialSettings = iota + MaterialSettings_HasModelMat MaterialSettings = 1 << (iota - 1) + MaterialSettings_HasNormalMat +) + +func (ms *MaterialSettings) Set(flags MaterialSettings) { + *ms |= flags +} + +func (ms *MaterialSettings) Remove(flags MaterialSettings) { + *ms &= ^flags +} + +func (ms *MaterialSettings) Has(flags MaterialSettings) bool { + return *ms&flags == flags +} + type Material struct { Name string ShaderProg shaders.ShaderProgram + Settings MaterialSettings UnifLocs map[string]int32 AttribLocs map[string]int32 diff --git a/renderer/rend3dgl/rend3dgl.go b/renderer/rend3dgl/rend3dgl.go index aa2da34..cc7a46b 100755 --- a/renderer/rend3dgl/rend3dgl.go +++ b/renderer/rend3dgl/rend3dgl.go @@ -29,7 +29,14 @@ func (r *Rend3DGL) DrawMesh(mesh *meshes.Mesh, modelMat *gglm.TrMat, mat *materi r.BoundMat = mat } - mat.SetUnifMat4("modelMat", &modelMat.Mat4) + if mat.Settings.Has(materials.MaterialSettings_HasModelMat) { + mat.SetUnifMat4("modelMat", &modelMat.Mat4) + } + + if mat.Settings.Has(materials.MaterialSettings_HasNormalMat) { + normalMat := modelMat.Clone().InvertAndTranspose().ToMat3() + mat.SetUnifMat3("normalMat", &normalMat) + } for i := 0; i < len(mesh.SubMeshes); i++ { gl.DrawElementsBaseVertexWithOffset(gl.TRIANGLES, mesh.SubMeshes[i].IndexCount, gl.UNSIGNED_INT, uintptr(mesh.SubMeshes[i].BaseIndex), mesh.SubMeshes[i].BaseVertex) diff --git a/res/shaders/debug-depth.glsl b/res/shaders/debug-depth.glsl index 740a861..dbcd3ad 100755 --- a/res/shaders/debug-depth.glsl +++ b/res/shaders/debug-depth.glsl @@ -2,22 +2,18 @@ #version 410 layout(location=0) in vec3 vertPosIn; -layout(location=1) in vec3 vertNormalIn; layout(location=2) in vec2 vertUV0In; layout(location=3) in vec3 vertColorIn; -out vec3 vertNormal; out vec2 vertUV0; out vec3 vertColor; out vec3 fragPos; -//MVP = Model View Projection uniform mat4 modelMat; uniform mat4 projViewMat; void main() { - vertNormal = mat3(transpose(inverse(modelMat))) * vertNormalIn; vertUV0 = vertUV0In; vertColor = vertColorIn; @@ -31,7 +27,6 @@ void main() #version 410 in vec3 vertColor; -in vec3 vertNormal; in vec2 vertUV0; in vec3 fragPos; diff --git a/res/shaders/simple-unlit.glsl b/res/shaders/simple-unlit.glsl index e65c234..0ac27d4 100755 --- a/res/shaders/simple-unlit.glsl +++ b/res/shaders/simple-unlit.glsl @@ -6,23 +6,15 @@ layout(location=1) in vec3 vertNormalIn; layout(location=2) in vec2 vertUV0In; layout(location=3) in vec3 vertColorIn; -out vec3 vertNormal; out vec2 vertUV0; out vec3 vertColor; out vec3 fragPos; -//MVP = Model View Projection uniform mat4 modelMat; uniform mat4 projViewMat; void main() { - // @TODO: Calculate this on the CPU and send it as a uniform - // - // This produces the normal matrix that multiplies with the model normal to produce the - // world space normal. Based on 'One last thing' section from: https://learnopengl.com/Lighting/Basic-Lighting - vertNormal = mat3(transpose(inverse(modelMat))) * vertNormalIn; - vertUV0 = vertUV0In; vertColor = vertColorIn; @@ -41,7 +33,6 @@ struct Material { uniform Material material; in vec3 vertColor; -in vec3 vertNormal; in vec2 vertUV0; in vec3 fragPos; diff --git a/res/shaders/simple.glsl b/res/shaders/simple.glsl index 2bad562..742a7e8 100755 --- a/res/shaders/simple.glsl +++ b/res/shaders/simple.glsl @@ -7,6 +7,7 @@ layout(location=2) in vec2 vertUV0In; layout(location=3) in vec3 vertColorIn; uniform mat4 modelMat; +uniform mat3 normalMat; uniform mat4 projViewMat; uniform mat4 dirLightProjViewMat; @@ -22,11 +23,7 @@ out vec4 fragPosSpotLight[NUM_SPOT_LIGHTS]; void main() { - // @TODO: Calculate this on the CPU and send it as a uniform - // - // This produces the normal matrix that multiplies with the model normal to produce the - // world space normal. Based on 'One last thing' section from: https://learnopengl.com/Lighting/Basic-Lighting - vertNormal = mat3(transpose(inverse(modelMat))) * vertNormalIn; + vertNormal = normalMat * vertNormalIn; vertUV0 = vertUV0In; vertColor = vertColorIn;