From 344ec2c1663399e6225015b46cebcc16c6704bb1 Mon Sep 17 00:00:00 2001 From: vladislavbelov Date: Tue, 11 Oct 2022 22:20:36 +0000 Subject: [PATCH] Reduces uniforms sizes for the minimap shader. This was SVN commit r27147. --- .../data/mods/public/shaders/arb/minimap.vp | 35 ++++++------- .../data/mods/public/shaders/arb/minimap.xml | 5 +- .../data/mods/public/shaders/glsl/minimap.vs | 19 ++++--- source/graphics/MiniMapTexture.cpp | 50 +++++++++++++------ 4 files changed, 64 insertions(+), 45 deletions(-) diff --git a/binaries/data/mods/public/shaders/arb/minimap.vp b/binaries/data/mods/public/shaders/arb/minimap.vp index 25cf42bda4..abe9194768 100644 --- a/binaries/data/mods/public/shaders/arb/minimap.vp +++ b/binaries/data/mods/public/shaders/arb/minimap.vp @@ -1,31 +1,28 @@ !!ARBvp1.0 -PARAM transform[4] = { program.local[0..3] }; -PARAM textureTransform[4] = { program.local[4..7] }; +PARAM transform = program.local[0]; +PARAM translation = program.local[1]; +PARAM textureTransform = program.local[2]; OUTPUT v_tex = result.texcoord[0]; TEMP position; -MOV position, vertex.position; -#if MINIMAP_POINT - MOV position.z, 0.0; -#endif +MUL position, transform, vertex.position.xyxy; +ADD position.x, position.x, position.y; +ADD position.y, position.z, position.w; +ADD position, position, translation.xyxy; +MOV position.z, 0.0; MOV position.w, 1.0; - -DP4 result.position.x, transform[0], position; -DP4 result.position.y, transform[1], position; -DP4 result.position.z, transform[2], position; -DP4 result.position.w, transform[3], position; +MOV result.position, position; #if MINIMAP_BASE || MINIMAP_LOS TEMP tex; - MOV tex, vertex.texcoord; -#endif - -#if MINIMAP_BASE || MINIMAP_LOS - DP4 v_tex.x, textureTransform[0], tex; - DP4 v_tex.y, textureTransform[1], tex; - DP4 v_tex.z, textureTransform[2], tex; - DP4 v_tex.w, textureTransform[3], tex; + MUL tex, textureTransform, vertex.texcoord.xyxy; + ADD tex.x, tex.x, tex.y; + ADD tex.y, tex.z, tex.w; + ADD tex, tex, translation.zwzw; + MOV tex.z, 0.0; + MOV tex.w, 1.0; + MOV v_tex, tex; #endif #if MINIMAP_POINT diff --git a/binaries/data/mods/public/shaders/arb/minimap.xml b/binaries/data/mods/public/shaders/arb/minimap.xml index 032b2a031f..a76541acd0 100644 --- a/binaries/data/mods/public/shaders/arb/minimap.xml +++ b/binaries/data/mods/public/shaders/arb/minimap.xml @@ -5,8 +5,9 @@ - - + + + diff --git a/binaries/data/mods/public/shaders/glsl/minimap.vs b/binaries/data/mods/public/shaders/glsl/minimap.vs index cd57a23338..6fdcef6672 100644 --- a/binaries/data/mods/public/shaders/glsl/minimap.vs +++ b/binaries/data/mods/public/shaders/glsl/minimap.vs @@ -1,18 +1,19 @@ #version 110 -uniform mat4 transform; -uniform mat4 textureTransform; +uniform vec4 transform; +uniform vec4 translation; +uniform vec4 textureTransform; #if MINIMAP_POINT && USE_GPU_INSTANCING uniform float width; #endif +attribute vec2 a_vertex; + #if MINIMAP_BASE || MINIMAP_LOS -attribute vec3 a_vertex; attribute vec2 a_uv0; #endif #if MINIMAP_POINT -attribute vec2 a_vertex; attribute vec3 a_color; #if USE_GPU_INSTANCING attribute vec2 a_uv1; @@ -30,16 +31,18 @@ varying vec3 color; void main() { #if MINIMAP_BASE || MINIMAP_LOS - gl_Position = transform * vec4(a_vertex, 1.0); - v_tex = (textureTransform * vec4(a_uv0, 0.0, 1.0)).xy; + vec2 position = a_vertex; + v_tex = mat2(textureTransform.xy, textureTransform.zw) * a_uv0 + translation.zw; #endif #if MINIMAP_POINT #if USE_GPU_INSTANCING - gl_Position = transform * vec4(a_vertex * width + a_uv1, 0.0, 1.0); + vec2 position = a_vertex * width + a_uv1; #else - gl_Position = transform * vec4(a_vertex, 0.0, 1.0); + vec2 position = a_vertex; #endif color = a_color; #endif // MINIMAP_POINT + + gl_Position = vec4(mat2(transform.xy, transform.zw) * position + translation.xy, 0.0, 1.0); } diff --git a/source/graphics/MiniMapTexture.cpp b/source/graphics/MiniMapTexture.cpp index 17fcd3c2e1..3bddaf3759 100644 --- a/source/graphics/MiniMapTexture.cpp +++ b/source/graphics/MiniMapTexture.cpp @@ -95,18 +95,18 @@ void DrawTexture( }; const float quadVertices[] = { - -1.0f, -1.0f, 0.0f, - 1.0f, -1.0f, 0.0f, - 1.0f, 1.0f, 0.0f, + -1.0f, -1.0f, + 1.0f, -1.0f, + 1.0f, 1.0f, - 1.0f, 1.0f, 0.0f, - -1.0f, 1.0f, 0.0f, - -1.0f, -1.0f, 0.0f + 1.0f, 1.0f, + -1.0f, 1.0f, + -1.0f, -1.0f, }; deviceCommandContext->SetVertexAttributeFormat( Renderer::Backend::VertexAttributeStream::POSITION, - Renderer::Backend::Format::R32G32B32_SFLOAT, 0, sizeof(float) * 3, + Renderer::Backend::Format::R32G32_SFLOAT, 0, sizeof(float) * 2, Renderer::Backend::VertexAttributeRate::PER_VERTEX, 0); deviceCommandContext->SetVertexAttributeFormat( Renderer::Backend::VertexAttributeStream::UV0, @@ -486,10 +486,16 @@ void CMiniMapTexture::RenderFinalTexture( CMatrix3D terrainTransform; terrainTransform.SetIdentity(); terrainTransform.Scale(texCoordMax, texCoordMax, 1.0f); + deviceCommandContext->SetUniform( - shader->GetBindingSlot(str_transform), baseTransform.AsFloatArray()); + shader->GetBindingSlot(str_transform), + baseTransform._11, baseTransform._21, baseTransform._12, baseTransform._22); deviceCommandContext->SetUniform( - shader->GetBindingSlot(str_textureTransform), terrainTransform.AsFloatArray()); + shader->GetBindingSlot(str_textureTransform), + terrainTransform._11, terrainTransform._21, terrainTransform._12, terrainTransform._22); + deviceCommandContext->SetUniform( + shader->GetBindingSlot(str_translation), + baseTransform._14, baseTransform._24, terrainTransform._14, terrainTransform._24); if (m_TerrainTexture) DrawTexture(deviceCommandContext); @@ -513,10 +519,15 @@ void CMiniMapTexture::RenderFinalTexture( deviceCommandContext->SetTexture( shader->GetBindingSlot(str_baseTex), territoryTexture.GetTexture()); deviceCommandContext->SetUniform( - shader->GetBindingSlot(str_transform), baseTransform.AsFloatArray()); + shader->GetBindingSlot(str_transform), + baseTransform._11, baseTransform._21, baseTransform._12, baseTransform._22); + const CMatrix3D& territoryTransform = territoryTexture.GetMinimapTextureMatrix(); deviceCommandContext->SetUniform( shader->GetBindingSlot(str_textureTransform), - territoryTexture.GetMinimapTextureMatrix().AsFloatArray()); + territoryTransform._11, territoryTransform._21, territoryTransform._12, territoryTransform._22); + deviceCommandContext->SetUniform( + shader->GetBindingSlot(str_translation), + baseTransform._14, baseTransform._24, territoryTransform._14, territoryTransform._24); DrawTexture(deviceCommandContext); deviceCommandContext->EndPass(); @@ -530,10 +541,15 @@ void CMiniMapTexture::RenderFinalTexture( deviceCommandContext->SetTexture( shader->GetBindingSlot(str_baseTex), losTexture.GetTexture()); deviceCommandContext->SetUniform( - shader->GetBindingSlot(str_transform), baseTransform.AsFloatArray()); + shader->GetBindingSlot(str_transform), + baseTransform._11, baseTransform._21, baseTransform._12, baseTransform._22); + const CMatrix3D& losTransform = losTexture.GetMinimapTextureMatrix(); deviceCommandContext->SetUniform( shader->GetBindingSlot(str_textureTransform), - losTexture.GetMinimapTextureMatrix().AsFloatArray()); + losTransform._11, losTransform._21, losTransform._12, losTransform._22); + deviceCommandContext->SetUniform( + shader->GetBindingSlot(str_translation), + baseTransform._14, baseTransform._24, losTransform._14, losTransform._24); DrawTexture(deviceCommandContext); @@ -723,8 +739,6 @@ void CMiniMapTexture::RenderFinalTexture( tech->GetGraphicsPipelineStateDesc()); deviceCommandContext->BeginPass(); shader = tech->GetShader(); - deviceCommandContext->SetUniform( - shader->GetBindingSlot(str_transform), baseTransform.AsFloatArray()); CMatrix3D unitMatrix; unitMatrix.SetIdentity(); @@ -734,7 +748,11 @@ void CMiniMapTexture::RenderFinalTexture( // Offset the coordinates to [-1, 1]. unitMatrix.Translate(CVector3D(-1.0f, -1.0f, 0.0f)); deviceCommandContext->SetUniform( - shader->GetBindingSlot(str_transform), unitMatrix.AsFloatArray()); + shader->GetBindingSlot(str_transform), + unitMatrix._11, unitMatrix._21, unitMatrix._12, unitMatrix._22); + deviceCommandContext->SetUniform( + shader->GetBindingSlot(str_translation), + unitMatrix._14, unitMatrix._24, 0.0f, 0.0f); Renderer::Backend::IDeviceCommandContext::Rect scissorRect; scissorRect.x = scissorRect.y = 1;