From 87947a7165d9bef9b9ed8da835dee12b0c75b8ef Mon Sep 17 00:00:00 2001 From: SamGondelman Date: Sat, 22 Dec 2018 03:31:38 -0500 Subject: [PATCH] try to fix grid color issue --- libraries/render-utils/src/GeometryCache.cpp | 54 ++++++++++--------- libraries/render-utils/src/grid.slf | 16 ++---- .../render-utils/src/grid_translucent.slf | 41 ++++++++++++++ .../src/render-utils/grid_translucent.slp | 1 + 4 files changed, 76 insertions(+), 36 deletions(-) create mode 100644 libraries/render-utils/src/grid_translucent.slf create mode 100644 libraries/render-utils/src/render-utils/grid_translucent.slp diff --git a/libraries/render-utils/src/GeometryCache.cpp b/libraries/render-utils/src/GeometryCache.cpp index f11478f7e1..d6d6f4903e 100644 --- a/libraries/render-utils/src/GeometryCache.cpp +++ b/libraries/render-utils/src/GeometryCache.cpp @@ -944,42 +944,44 @@ void GeometryCache::renderWireSphere(gpu::Batch& batch, const glm::vec4& color) } void GeometryCache::renderGrid(gpu::Batch& batch, const glm::vec2& minCorner, const glm::vec2& maxCorner, - int majorRows, int majorCols, float majorEdge, - int minorRows, int minorCols, float minorEdge, - const glm::vec4& color, int id) { - static const glm::vec2 MIN_TEX_COORD(0.0f, 0.0f); - static const glm::vec2 MAX_TEX_COORD(1.0f, 1.0f); - - bool registered = (id != UNKNOWN_ID); + int majorRows, int majorCols, float majorEdge, int minorRows, int minorCols, float minorEdge, + const glm::vec4& color, int id) { Vec2FloatPair majorKey(glm::vec2(majorRows, majorCols), majorEdge); Vec2FloatPair minorKey(glm::vec2(minorRows, minorCols), minorEdge); Vec2FloatPairPair key(majorKey, minorKey); // Make the gridbuffer - if (registered && (!_registeredGridBuffers.contains(id) || _lastRegisteredGridBuffer[id] != key)) { - GridSchema gridSchema; - GridBuffer gridBuffer = std::make_shared(sizeof(GridSchema), (const gpu::Byte*) &gridSchema); - - if (registered && _registeredGridBuffers.contains(id)) { - gridBuffer = _registeredGridBuffers[id]; + GridBuffer gridBuffer; + if (id != UNKNOWN_ID) { + auto gridBufferIter = _registeredGridBuffers.find(id); + bool hadGridBuffer = gridBufferIter != _registeredGridBuffers.end(); + if (hadGridBuffer) { + gridBuffer = gridBufferIter.value(); + } else { + GridSchema gridSchema; + gridBuffer = std::make_shared(sizeof(GridSchema), (const gpu::Byte*)&gridSchema); } - _registeredGridBuffers[id] = gridBuffer; - _lastRegisteredGridBuffer[id] = key; + if (!hadGridBuffer || _lastRegisteredGridBuffer[id] != key) { + _registeredGridBuffers[id] = gridBuffer; + _lastRegisteredGridBuffer[id] = key; - gridBuffer.edit().period = glm::vec4(majorRows, majorCols, minorRows, minorCols); - gridBuffer.edit().offset.x = -(majorEdge / majorRows) / 2; - gridBuffer.edit().offset.y = -(majorEdge / majorCols) / 2; - gridBuffer.edit().offset.z = -(minorEdge / minorRows) / 2; - gridBuffer.edit().offset.w = -(minorEdge / minorCols) / 2; - gridBuffer.edit().edge = glm::vec4(glm::vec2(majorEdge), - // If rows or columns are not set, do not draw minor gridlines - glm::vec2((minorRows != 0 && minorCols != 0) ? minorEdge : 0.0f)); + gridBuffer.edit().period = glm::vec4(majorRows, majorCols, minorRows, minorCols); + gridBuffer.edit().offset.x = -(majorEdge / majorRows) / 2; + gridBuffer.edit().offset.y = -(majorEdge / majorCols) / 2; + gridBuffer.edit().offset.z = -(minorEdge / minorRows) / 2; + gridBuffer.edit().offset.w = -(minorEdge / minorCols) / 2; + gridBuffer.edit().edge = glm::vec4(glm::vec2(majorEdge), + // If rows or columns are not set, do not draw minor gridlines + glm::vec2((minorRows != 0 && minorCols != 0) ? minorEdge : 0.0f)); + } } // Set the grid pipeline - useGridPipeline(batch, _registeredGridBuffers[id], color.a < 1.0f); + useGridPipeline(batch, gridBuffer, color.a < 1.0f); + static const glm::vec2 MIN_TEX_COORD(0.0f, 0.0f); + static const glm::vec2 MAX_TEX_COORD(1.0f, 1.0f); renderQuad(batch, minCorner, maxCorner, MIN_TEX_COORD, MAX_TEX_COORD, color, id); } @@ -2117,10 +2119,11 @@ void GeometryCache::useSimpleDrawPipeline(gpu::Batch& batch, bool noBlend) { void GeometryCache::useGridPipeline(gpu::Batch& batch, GridBuffer gridBuffer, bool transparent) { if (!_gridPipelineOpaque || !_gridPipelineTransparent) { - auto program = gpu::Shader::createProgram(shader::render_utils::program::grid); const float DEPTH_BIAS = 0.001f; + // FIXME: need forward pipelines { + auto program = gpu::Shader::createProgram(shader::render_utils::program::grid); auto state = std::make_shared(); state->setDepthTest(true, true, gpu::LESS_EQUAL); state->setBlendFunction(false, @@ -2133,6 +2136,7 @@ void GeometryCache::useGridPipeline(gpu::Batch& batch, GridBuffer gridBuffer, bo } { + auto program = gpu::Shader::createProgram(shader::render_utils::program::grid_translucent); auto state = std::make_shared(); state->setDepthTest(true, true, gpu::LESS_EQUAL); state->setBlendFunction(true, diff --git a/libraries/render-utils/src/grid.slf b/libraries/render-utils/src/grid.slf index 408a9ca190..50c420bc10 100644 --- a/libraries/render-utils/src/grid.slf +++ b/libraries/render-utils/src/grid.slf @@ -1,8 +1,6 @@ <@include gpu/Config.slh@> <$VERSION_HEADER$> // Generated on <$_SCRIBE_DATE$> -// grid.frag -// fragment shader // // Created by Zach Pomerantz on 2/16/2016. // Copyright 2016 High Fidelity, Inc. @@ -11,6 +9,8 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // +<@include DeferredBufferWrite.slh@> + <@include gpu/ShaderConstants.h@> <@include gpu/Paint.slh@> @@ -21,26 +21,20 @@ struct Grid { }; LAYOUT(binding=0) uniform gridBuffer { - Grid grid; + Grid grid; }; -Grid getGrid() { return grid; } - layout(location=GPU_ATTR_TEXCOORD0) in vec2 varTexCoord0; layout(location=GPU_ATTR_COLOR) in vec4 varColor; -layout(location=0) out vec4 outFragColor; - void main(void) { - Grid grid = getGrid(); - float alpha = mix(paintGridMajorMinor(varTexCoord0, grid.offset, grid.period, grid.edge), paintGrid(varTexCoord0, grid.offset.xy, grid.period.xy, grid.edge.xy), float(grid.edge.z == 0.0)); - if (alpha == 0.0) { + if (alpha < 0.0001) { discard; } - outFragColor = vec4(varColor.xyz, varColor.w * alpha); + packDeferredFragmentUnlit(vec3(1.0, 0.0, 0.0), 1.0, varColor.xyz); } diff --git a/libraries/render-utils/src/grid_translucent.slf b/libraries/render-utils/src/grid_translucent.slf new file mode 100644 index 0000000000..bb61126991 --- /dev/null +++ b/libraries/render-utils/src/grid_translucent.slf @@ -0,0 +1,41 @@ +<@include gpu/Config.slh@> +<$VERSION_HEADER$> +// Generated on <$_SCRIBE_DATE$> +// +// Created by Sam Gondelman on 12/22/18 +// Copyright 2018 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +<@include DeferredBufferWrite.slh@> + +<@include gpu/ShaderConstants.h@> +<@include gpu/Paint.slh@> + +struct Grid { + vec4 period; + vec4 offset; + vec4 edge; +}; + +LAYOUT(binding=0) uniform gridBuffer { + Grid grid; +}; + +layout(location=GPU_ATTR_TEXCOORD0) in vec2 varTexCoord0; +layout(location=GPU_ATTR_COLOR) in vec4 varColor; + +void main(void) { + float alpha = mix(paintGridMajorMinor(varTexCoord0, grid.offset, grid.period, grid.edge), + paintGrid(varTexCoord0, grid.offset.xy, grid.period.xy, grid.edge.xy), + float(grid.edge.z == 0.0)); + alpha *= varColor.w; + + if (alpha < 0.0001) { + discard; + } + + packDeferredFragmentTranslucent(vec3(1.0, 0.0, 0.0), alpha, varColor.xyz, DEFAULT_ROUGHNESS); +} diff --git a/libraries/render-utils/src/render-utils/grid_translucent.slp b/libraries/render-utils/src/render-utils/grid_translucent.slp new file mode 100644 index 0000000000..c81b208f63 --- /dev/null +++ b/libraries/render-utils/src/render-utils/grid_translucent.slp @@ -0,0 +1 @@ +VERTEX standardTransformPNTC