mirror of
https://github.com/JulianGro/overte.git
synced 2025-04-07 23:02:24 +02:00
try to fix grid color issue
This commit is contained in:
parent
bb030660bd
commit
87947a7165
4 changed files with 76 additions and 36 deletions
|
@ -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<gpu::Buffer>(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<gpu::Buffer>(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<GridSchema>().period = glm::vec4(majorRows, majorCols, minorRows, minorCols);
|
||||
gridBuffer.edit<GridSchema>().offset.x = -(majorEdge / majorRows) / 2;
|
||||
gridBuffer.edit<GridSchema>().offset.y = -(majorEdge / majorCols) / 2;
|
||||
gridBuffer.edit<GridSchema>().offset.z = -(minorEdge / minorRows) / 2;
|
||||
gridBuffer.edit<GridSchema>().offset.w = -(minorEdge / minorCols) / 2;
|
||||
gridBuffer.edit<GridSchema>().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<GridSchema>().period = glm::vec4(majorRows, majorCols, minorRows, minorCols);
|
||||
gridBuffer.edit<GridSchema>().offset.x = -(majorEdge / majorRows) / 2;
|
||||
gridBuffer.edit<GridSchema>().offset.y = -(majorEdge / majorCols) / 2;
|
||||
gridBuffer.edit<GridSchema>().offset.z = -(minorEdge / minorRows) / 2;
|
||||
gridBuffer.edit<GridSchema>().offset.w = -(minorEdge / minorCols) / 2;
|
||||
gridBuffer.edit<GridSchema>().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<gpu::State>();
|
||||
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<gpu::State>();
|
||||
state->setDepthTest(true, true, gpu::LESS_EQUAL);
|
||||
state->setBlendFunction(true,
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
41
libraries/render-utils/src/grid_translucent.slf
Normal file
41
libraries/render-utils/src/grid_translucent.slf
Normal file
|
@ -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);
|
||||
}
|
|
@ -0,0 +1 @@
|
|||
VERTEX standardTransformPNTC
|
Loading…
Reference in a new issue