1
0
forked from 0ad/0ad

Reduces uniforms sizes for the minimap shader.

This was SVN commit r27147.
This commit is contained in:
Vladislav Belov 2022-10-11 22:20:36 +00:00
parent 1cd1715088
commit 344ec2c166
4 changed files with 64 additions and 45 deletions

View File

@ -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

View File

@ -5,8 +5,9 @@
<stream name="pos"/>
<stream name="uv0" if="MINIMAP_BASE || MINIMAP_LOS"/>
<stream name="color" if="MINIMAP_POINT"/>
<uniform name="transform" loc="0" type="mat4"/>
<uniform name="textureTransform" loc="4" type="mat4"/>
<uniform name="transform" loc="0" type="vec4"/>
<uniform name="translation" loc="1" type="vec4"/>
<uniform name="textureTransform" loc="2" type="vec4"/>
</vertex>
<fragment file="arb/minimap.fp">

View File

@ -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);
}

View File

@ -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;