From e038f7844b00d0f339e2d7369740ba3608ecb18b Mon Sep 17 00:00:00 2001 From: vladislavbelov Date: Mon, 9 Nov 2020 18:50:40 +0000 Subject: [PATCH] Fixes terrain overlays by removing fixed pipeline dependency. Tested By: Freagarach, wraitii Differential Revision: https://code.wildfiregames.com/D3074 This was SVN commit r24154. --- .../mods/public/shaders/arb/debug_overlay.fp | 7 ++ .../mods/public/shaders/arb/debug_overlay.vp | 19 ++++++ .../mods/public/shaders/arb/debug_overlay.xml | 15 +++++ .../public/shaders/effects/debug_overlay.xml | 14 ++++ .../mods/public/shaders/glsl/debug_overlay.fs | 11 ++++ .../mods/public/shaders/glsl/debug_overlay.vs | 15 +++++ .../public/shaders/glsl/debug_overlay.xml | 13 ++++ source/ps/CStrInternStatic.h | 1 + source/renderer/TerrainOverlay.cpp | 2 +- source/renderer/TerrainRenderer.cpp | 64 +++++++++---------- source/renderer/TerrainRenderer.h | 2 +- 11 files changed, 126 insertions(+), 37 deletions(-) create mode 100644 binaries/data/mods/public/shaders/arb/debug_overlay.fp create mode 100644 binaries/data/mods/public/shaders/arb/debug_overlay.vp create mode 100644 binaries/data/mods/public/shaders/arb/debug_overlay.xml create mode 100644 binaries/data/mods/public/shaders/effects/debug_overlay.xml create mode 100644 binaries/data/mods/public/shaders/glsl/debug_overlay.fs create mode 100644 binaries/data/mods/public/shaders/glsl/debug_overlay.vs create mode 100644 binaries/data/mods/public/shaders/glsl/debug_overlay.xml diff --git a/binaries/data/mods/public/shaders/arb/debug_overlay.fp b/binaries/data/mods/public/shaders/arb/debug_overlay.fp new file mode 100644 index 0000000000..c19a8fb259 --- /dev/null +++ b/binaries/data/mods/public/shaders/arb/debug_overlay.fp @@ -0,0 +1,7 @@ +!!ARBfp1.0 + +ATTRIB v_tex = fragment.texcoord[0]; + +TEX result.color, v_tex, texture[0], 2D; + +END diff --git a/binaries/data/mods/public/shaders/arb/debug_overlay.vp b/binaries/data/mods/public/shaders/arb/debug_overlay.vp new file mode 100644 index 0000000000..c3561ff34a --- /dev/null +++ b/binaries/data/mods/public/shaders/arb/debug_overlay.vp @@ -0,0 +1,19 @@ +!!ARBvp1.0 + +PARAM transform[4] = { program.local[0..3] }; +PARAM textureTransform[4] = { program.local[4..7] }; + +ATTRIB position = vertex.position; +ATTRIB uv = vertex.texcoord[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; + +OUTPUT v_tex = result.texcoord[0]; + +DP4 v_tex.x, textureTransform[0], uv; +DP4 v_tex.y, textureTransform[1], uv; + +END diff --git a/binaries/data/mods/public/shaders/arb/debug_overlay.xml b/binaries/data/mods/public/shaders/arb/debug_overlay.xml new file mode 100644 index 0000000000..b6195fb47c --- /dev/null +++ b/binaries/data/mods/public/shaders/arb/debug_overlay.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/binaries/data/mods/public/shaders/effects/debug_overlay.xml b/binaries/data/mods/public/shaders/effects/debug_overlay.xml new file mode 100644 index 0000000000..8c1bb3ed42 --- /dev/null +++ b/binaries/data/mods/public/shaders/effects/debug_overlay.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/binaries/data/mods/public/shaders/glsl/debug_overlay.fs b/binaries/data/mods/public/shaders/glsl/debug_overlay.fs new file mode 100644 index 0000000000..ee06a1de2c --- /dev/null +++ b/binaries/data/mods/public/shaders/glsl/debug_overlay.fs @@ -0,0 +1,11 @@ +#version 110 + +uniform sampler2D baseTex; + +varying vec2 v_tex; + +void main() +{ + vec4 base = texture2D(baseTex, v_tex); + gl_FragColor = base; +} diff --git a/binaries/data/mods/public/shaders/glsl/debug_overlay.vs b/binaries/data/mods/public/shaders/glsl/debug_overlay.vs new file mode 100644 index 0000000000..1f00f98461 --- /dev/null +++ b/binaries/data/mods/public/shaders/glsl/debug_overlay.vs @@ -0,0 +1,15 @@ +#version 110 + +uniform mat4 transform; +uniform mat4 textureTransform; + +attribute vec3 a_vertex; +attribute vec3 a_uv0; + +varying vec2 v_tex; + +void main() +{ + v_tex = (textureTransform * vec4(a_uv0, 1.0)).xy; + gl_Position = transform * vec4(a_vertex, 1.0); +} diff --git a/binaries/data/mods/public/shaders/glsl/debug_overlay.xml b/binaries/data/mods/public/shaders/glsl/debug_overlay.xml new file mode 100644 index 0000000000..54d783961f --- /dev/null +++ b/binaries/data/mods/public/shaders/glsl/debug_overlay.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/source/ps/CStrInternStatic.h b/source/ps/CStrInternStatic.h index 0dad2f2303..c4ccaaee99 100644 --- a/source/ps/CStrInternStatic.h +++ b/source/ps/CStrInternStatic.h @@ -87,6 +87,7 @@ X(cameraPos) X(color) X(colorAdd) X(colorMul) +X(debug_overlay) X(delta) X(depthTex) X(foamTex) diff --git a/source/renderer/TerrainOverlay.cpp b/source/renderer/TerrainOverlay.cpp index 03591574bd..1ccfd4ebf8 100644 --- a/source/renderer/TerrainOverlay.cpp +++ b/source/renderer/TerrainOverlay.cpp @@ -309,7 +309,7 @@ void TerrainTextureOverlay::RenderAfterWater(int cullGroup) matrix._23 = m_TexelsPerTile / (m_TextureH * TERRAIN_TILE_SIZE); matrix._44 = 1; - g_Renderer.GetTerrainRenderer().RenderTerrainOverlayTexture(cullGroup, matrix); + g_Renderer.GetTerrainRenderer().RenderTerrainOverlayTexture(cullGroup, matrix, m_Texture); } SColor4ub TerrainTextureOverlay::GetColor(size_t idx, u8 alpha) const diff --git a/source/renderer/TerrainRenderer.cpp b/source/renderer/TerrainRenderer.cpp index 30c5c73981..f19ed35ee6 100644 --- a/source/renderer/TerrainRenderer.cpp +++ b/source/renderer/TerrainRenderer.cpp @@ -397,72 +397,66 @@ void TerrainRenderer::RenderTerrainFixed(int cullGroup) #endif } -void TerrainRenderer::RenderTerrainOverlayTexture(int cullGroup, CMatrix3D& textureMatrix) +void TerrainRenderer::RenderTerrainOverlayTexture(int cullGroup, CMatrix3D& textureMatrix, GLuint texture) { #if CONFIG2_GLES #warning TODO: implement TerrainRenderer::RenderTerrainOverlayTexture for GLES UNUSED2(cullGroup); UNUSED2(textureMatrix); + UNUSED2(texture); #else ENSURE(m->phase == Phase_Render); std::vector& visiblePatches = m->visiblePatches[cullGroup]; - glEnableClientState(GL_VERTEX_ARRAY); - glEnableClientState(GL_TEXTURE_COORD_ARRAY); - - pglActiveTextureARB(GL_TEXTURE0); glEnable(GL_TEXTURE_2D); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glDepthMask(0); glDisable(GL_DEPTH_TEST); - glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); + CShaderTechniquePtr debugOverlayTech = + g_Renderer.GetShaderManager().LoadEffect(str_debug_overlay); + debugOverlayTech->BeginPass(); + CShaderProgramPtr debugOverlayShader = debugOverlayTech->GetShader(); - glMatrixMode(GL_TEXTURE); - glLoadMatrixf(&textureMatrix._11); - glMatrixMode(GL_MODELVIEW); + debugOverlayShader->Bind(); + debugOverlayShader->BindTexture(str_baseTex, texture); + debugOverlayShader->Uniform(str_transform, g_Renderer.GetViewCamera().GetViewProjection()); + debugOverlayShader->Uniform(str_textureTransform, textureMatrix); + CPatchRData::RenderStreams(visiblePatches, debugOverlayShader, STREAM_POS | STREAM_POSTOUV0); - CShaderProgramPtr dummyShader = GetDummyShader(); - dummyShader->Bind(); - dummyShader->Uniform(str_transform, g_Renderer.GetViewCamera().GetViewProjection()); - dummyShader->Uniform(str_color, CColor(0.0f, 0.0f, 0.0f, 1.0f)); - CPatchRData::RenderStreams(visiblePatches, dummyShader, STREAM_POS | STREAM_POSTOUV0); - dummyShader->Unbind(); + glEnable(GL_DEPTH_TEST); // To make the overlay visible over water, render an additional map-sized - // water-height patch + // water-height patch. CBoundingBoxAligned waterBounds; - for (size_t i = 0; i < visiblePatches.size(); ++i) - { - CPatchRData* data = visiblePatches[i]; + for (CPatchRData* data : visiblePatches) waterBounds += data->GetWaterBounds(); - } if (!waterBounds.IsEmpty()) { - float h = g_Renderer.GetWaterManager()->m_WaterHeight + 0.05f; // add a delta to avoid z-fighting - float waterPos[] = { - waterBounds[0].X, h, waterBounds[0].Z, - waterBounds[1].X, h, waterBounds[0].Z, - waterBounds[0].X, h, waterBounds[1].Z, - waterBounds[1].X, h, waterBounds[1].Z + // Add a delta to avoid z-fighting. + const float height = g_Renderer.GetWaterManager()->m_WaterHeight + 0.05f; + const float waterPos[] = { + waterBounds[0].X, height, waterBounds[0].Z, + waterBounds[1].X, height, waterBounds[0].Z, + waterBounds[0].X, height, waterBounds[1].Z, + waterBounds[1].X, height, waterBounds[1].Z }; - glVertexPointer(3, GL_FLOAT, 3*sizeof(float), waterPos); - glTexCoordPointer(3, GL_FLOAT, 3*sizeof(float), waterPos); + + const GLsizei stride = sizeof(float) * 3; + debugOverlayShader->VertexPointer(3, GL_FLOAT, stride, waterPos); + debugOverlayShader->TexCoordPointer(GL_TEXTURE0, 3, GL_FLOAT, stride, waterPos); + debugOverlayShader->AssertPointersBound(); + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); } - glMatrixMode(GL_TEXTURE); - glLoadIdentity(); - glMatrixMode(GL_MODELVIEW); + debugOverlayShader->Unbind(); + debugOverlayTech->EndPass(); glDepthMask(1); - glEnable(GL_DEPTH_TEST); glDisable(GL_BLEND); - glDisableClientState(GL_COLOR_ARRAY); - glDisableClientState(GL_VERTEX_ARRAY); - glDisableClientState(GL_TEXTURE_COORD_ARRAY); #endif } diff --git a/source/renderer/TerrainRenderer.h b/source/renderer/TerrainRenderer.h index d63b531a6f..bb411f1c5f 100644 --- a/source/renderer/TerrainRenderer.h +++ b/source/renderer/TerrainRenderer.h @@ -145,7 +145,7 @@ public: * by the given texture matrix. * Intended for use by TerrainTextureOverlay. */ - void RenderTerrainOverlayTexture(int cullGroup, CMatrix3D& textureMatrix); + void RenderTerrainOverlayTexture(int cullGroup, CMatrix3D& textureMatrix, GLuint texture); private: TerrainRendererInternals* m;