Index: ps/trunk/binaries/data/mods/public/shaders/glsl/overlayline.fs =================================================================== --- ps/trunk/binaries/data/mods/public/shaders/glsl/overlayline.fs +++ ps/trunk/binaries/data/mods/public/shaders/glsl/overlayline.fs @@ -0,0 +1,37 @@ +#version 120 + +uniform sampler2D baseTex; +uniform sampler2D maskTex; +uniform sampler2D losTex; + +#if USE_OBJECTCOLOR +uniform vec4 objectColor; +#else +varying vec4 v_color; +#endif + +varying vec2 v_tex; +varying vec2 v_los; + +void main() +{ +#if USE_OBJECTCOLOR + vec3 color = objectColor.rgb; + float alpha = objectColor.a; +#else + vec3 color = v_color.rgb; + float alpha = v_color.a; +#endif + + vec4 base = texture2D(baseTex, v_tex); + vec4 mask = texture2D(maskTex, v_tex); + color = mix(base.rgb, color, mask.r); + +#if !IGNORE_LOS + float los = texture2D(losTex, v_los).a; + los = los < 0.03 ? 0.0 : los; + color *= los; +#endif + + gl_FragColor = vec4(color, alpha * base.a); +} Index: ps/trunk/binaries/data/mods/public/shaders/glsl/overlayline.vs =================================================================== --- ps/trunk/binaries/data/mods/public/shaders/glsl/overlayline.vs +++ ps/trunk/binaries/data/mods/public/shaders/glsl/overlayline.vs @@ -0,0 +1,24 @@ +#version 120 + +uniform vec2 losTransform; + +attribute vec3 a_vertex; +attribute vec2 a_uv0; + +#if !USE_OBJECTCOLOR +attribute vec4 a_color; +varying vec4 v_color; +#endif + +varying vec2 v_tex; +varying vec2 v_los; + +void main() +{ + v_tex = a_uv0; + v_los = a_vertex.xz * losTransform.x + losTransform.yy; +#if !USE_OBJECTCOLOR + v_color = a_color; +#endif + gl_Position = gl_ModelViewProjectionMatrix * vec4(a_vertex, 1.0); +} Index: ps/trunk/binaries/data/mods/public/shaders/glsl/overlayline.xml =================================================================== --- ps/trunk/binaries/data/mods/public/shaders/glsl/overlayline.xml +++ ps/trunk/binaries/data/mods/public/shaders/glsl/overlayline.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + Index: ps/trunk/source/renderer/OverlayRenderer.cpp =================================================================== --- ps/trunk/source/renderer/OverlayRenderer.cpp +++ ps/trunk/source/renderer/OverlayRenderer.cpp @@ -1,4 +1,4 @@ -/* Copyright (C) 2019 Wildfire Games. +/* Copyright (C) 2020 Wildfire Games. * This file is part of 0 A.D. * * 0 A.D. is free software: you can redistribute it and/or modify @@ -425,7 +425,12 @@ const char* shaderName; if (g_RenderingOptions.GetRenderPath() == RenderPath::SHADER) - shaderName = "arb/overlayline"; + { + if (g_RenderingOptions.GetPreferGLSL()) + shaderName = "glsl/overlayline"; + else + shaderName = "arb/overlayline"; + } else shaderName = "fixed:overlayline"; @@ -500,77 +505,76 @@ if (m->quadBatchMap.empty()) return; - ogl_WarnIfError(); - - pglActiveTextureARB(GL_TEXTURE0); - glEnable(GL_TEXTURE_2D); - glEnable(GL_BLEND); - glDepthMask(0); - const char* shaderName; if (g_RenderingOptions.GetRenderPath() == RenderPath::SHADER) - shaderName = "arb/overlayline"; + { + if (g_RenderingOptions.GetPreferGLSL()) + shaderName = "glsl/overlayline"; + else + shaderName = "arb/overlayline"; + } else shaderName = "fixed:overlayline"; - CLOSTexture& los = g_Renderer.GetScene().GetLOSTexture(); - CShaderManager& shaderManager = g_Renderer.GetShaderManager(); CShaderProgramPtr shader(shaderManager.LoadProgram(shaderName, m->defsQuadOverlay)); - // ---------------------------------------------------------------------------------------- + if (!shader) + return; - if (shader) - { - shader->Bind(); - shader->BindTexture(str_losTex, los.GetTexture()); - shader->Uniform(str_losTransform, los.GetTextureMatrix()[0], los.GetTextureMatrix()[12], 0.f, 0.f); - - // Base offsets (in bytes) of the two backing stores relative to their owner VBO - u8* indexBase = m->quadIndices.Bind(); - u8* vertexBase = m->quadVertices.Bind(); - GLsizei indexStride = m->quadIndices.GetStride(); - GLsizei vertexStride = m->quadVertices.GetStride(); + pglActiveTextureARB(GL_TEXTURE0); + glEnable(GL_TEXTURE_2D); + glEnable(GL_BLEND); + glDepthMask(0); - for (OverlayRendererInternals::QuadBatchMap::iterator it = m->quadBatchMap.begin(); it != m->quadBatchMap.end(); ++it) - { - QuadBatchData& batchRenderData = it->second; - const size_t batchNumQuads = batchRenderData.m_NumRenderQuads; + CLOSTexture& los = g_Renderer.GetScene().GetLOSTexture(); - // Careful; some drivers don't like drawing calls with 0 stuff to draw. - if (batchNumQuads == 0) - continue; + shader->Bind(); + shader->BindTexture(str_losTex, los.GetTexture()); + shader->Uniform(str_losTransform, los.GetTextureMatrix()[0], los.GetTextureMatrix()[12], 0.f, 0.f); + + // Base offsets (in bytes) of the two backing stores relative to their owner VBO + u8* indexBase = m->quadIndices.Bind(); + u8* vertexBase = m->quadVertices.Bind(); + GLsizei indexStride = m->quadIndices.GetStride(); + GLsizei vertexStride = m->quadVertices.GetStride(); - const QuadBatchKey& maskPair = it->first; + for (OverlayRendererInternals::QuadBatchMap::iterator it = m->quadBatchMap.begin(); it != m->quadBatchMap.end(); ++it) + { + QuadBatchData& batchRenderData = it->second; + const size_t batchNumQuads = batchRenderData.m_NumRenderQuads; - shader->BindTexture(str_baseTex, maskPair.m_Texture->GetHandle()); - shader->BindTexture(str_maskTex, maskPair.m_TextureMask->GetHandle()); + // Careful; some drivers don't like drawing calls with 0 stuff to draw. + if (batchNumQuads == 0) + continue; - int streamflags = shader->GetStreamFlags(); + const QuadBatchKey& maskPair = it->first; - if (streamflags & STREAM_POS) - shader->VertexPointer(m->quadAttributePos.elems, m->quadAttributePos.type, vertexStride, vertexBase + m->quadAttributePos.offset); + shader->BindTexture(str_baseTex, maskPair.m_Texture->GetHandle()); + shader->BindTexture(str_maskTex, maskPair.m_TextureMask->GetHandle()); - if (streamflags & STREAM_UV0) - shader->TexCoordPointer(GL_TEXTURE0, m->quadAttributeUV.elems, m->quadAttributeUV.type, vertexStride, vertexBase + m->quadAttributeUV.offset); + int streamflags = shader->GetStreamFlags(); - if (streamflags & STREAM_UV1) - shader->TexCoordPointer(GL_TEXTURE1, m->quadAttributeUV.elems, m->quadAttributeUV.type, vertexStride, vertexBase + m->quadAttributeUV.offset); + if (streamflags & STREAM_POS) + shader->VertexPointer(m->quadAttributePos.elems, m->quadAttributePos.type, vertexStride, vertexBase + m->quadAttributePos.offset); - if (streamflags & STREAM_COLOR) - shader->ColorPointer(m->quadAttributeColor.elems, m->quadAttributeColor.type, vertexStride, vertexBase + m->quadAttributeColor.offset); + if (streamflags & STREAM_UV0) + shader->TexCoordPointer(GL_TEXTURE0, m->quadAttributeUV.elems, m->quadAttributeUV.type, vertexStride, vertexBase + m->quadAttributeUV.offset); - shader->AssertPointersBound(); - glDrawElements(GL_TRIANGLES, (GLsizei)(batchNumQuads * 6), GL_UNSIGNED_SHORT, indexBase + indexStride * batchRenderData.m_IndicesBase); + if (streamflags & STREAM_UV1) + shader->TexCoordPointer(GL_TEXTURE1, m->quadAttributeUV.elems, m->quadAttributeUV.type, vertexStride, vertexBase + m->quadAttributeUV.offset); - g_Renderer.GetStats().m_DrawCalls++; - g_Renderer.GetStats().m_OverlayTris += batchNumQuads*2; - } + if (streamflags & STREAM_COLOR) + shader->ColorPointer(m->quadAttributeColor.elems, m->quadAttributeColor.type, vertexStride, vertexBase + m->quadAttributeColor.offset); - shader->Unbind(); + shader->AssertPointersBound(); + glDrawElements(GL_TRIANGLES, (GLsizei)(batchNumQuads * 6), GL_UNSIGNED_SHORT, indexBase + indexStride * batchRenderData.m_IndicesBase); + + g_Renderer.GetStats().m_DrawCalls++; + g_Renderer.GetStats().m_OverlayTris += batchNumQuads*2; } - // ---------------------------------------------------------------------------------------- + shader->Unbind(); // TODO: the shader should probably be responsible for unbinding its textures g_Renderer.BindTexture(1, 0);