From b3b12bd2dc73f7a1215116b2407a1f92569e3c53 Mon Sep 17 00:00:00 2001 From: ericrius1 Date: Mon, 13 Jul 2015 08:54:53 -0700 Subject: [PATCH] adding custom shader for flipped normals --- examples/hydraPolyLinePaint.js | 2 +- libraries/entities-renderer/CMakeLists.txt | 2 + .../src/DeferredBufferWrite.slh | 54 +++++++++++++++++++ .../src/RenderablePolyLineEntityItem.cpp | 8 ++- .../entities-renderer/src/paintStroke.slf | 29 ++++++++++ .../entities-renderer/src/paintStroke.slv | 35 ++++++++++++ libraries/entities/src/PolyLineEntityItem.cpp | 2 + 7 files changed, 129 insertions(+), 3 deletions(-) create mode 100755 libraries/entities-renderer/src/DeferredBufferWrite.slh create mode 100644 libraries/entities-renderer/src/paintStroke.slf create mode 100644 libraries/entities-renderer/src/paintStroke.slv diff --git a/examples/hydraPolyLinePaint.js b/examples/hydraPolyLinePaint.js index b0336a48da..1c20655a03 100644 --- a/examples/hydraPolyLinePaint.js +++ b/examples/hydraPolyLinePaint.js @@ -28,7 +28,7 @@ var DRAWING_DEPTH = 2; var LINE_DIMENSIONS = 100; -var DISTANCE_FROM_HAND = 5; +var DISTANCE_FROM_HAND = 2; var MIN_POINT_DISTANCE = 0.01; var MIN_BRUSH_RADIUS = 0.04; diff --git a/libraries/entities-renderer/CMakeLists.txt b/libraries/entities-renderer/CMakeLists.txt index 40ca1ccbc9..8237121a20 100644 --- a/libraries/entities-renderer/CMakeLists.txt +++ b/libraries/entities-renderer/CMakeLists.txt @@ -1,5 +1,7 @@ set(TARGET_NAME entities-renderer) +AUTOSCRIBE_SHADER_LIB(gpu model render) + # use setup_hifi_library macro to setup our project and link appropriate Qt modules setup_hifi_library(Widgets OpenGL Network Script) diff --git a/libraries/entities-renderer/src/DeferredBufferWrite.slh b/libraries/entities-renderer/src/DeferredBufferWrite.slh new file mode 100755 index 0000000000..a7f4055bba --- /dev/null +++ b/libraries/entities-renderer/src/DeferredBufferWrite.slh @@ -0,0 +1,54 @@ + +<@if not DEFERRED_BUFFER_WRITE_SLH@> +<@def DEFERRED_BUFFER_WRITE_SLH@> + +// the glow intensity +uniform float glowIntensity; + +// the alpha threshold +uniform float alphaThreshold; + +float evalOpaqueFinalAlpha(float alpha, float mapAlpha) { + return mix(alpha * glowIntensity, 1.0 - alpha * glowIntensity, step(mapAlpha, alphaThreshold)); +} + +void packDeferredFragment(vec3 normal, float alpha, vec3 diffuse, vec3 specular, float shininess) { + if (alpha != glowIntensity) { + discard; + } + gl_FragData[0] = vec4(diffuse.rgb, alpha); + gl_FragData[1] = vec4(normal, 0.0) * 0.5 + vec4(0.5, 0.5, 0.5, 1.0); + gl_FragData[2] = vec4(specular, shininess / 128.0); +} + +void packDeferredFragmentLightmap(vec3 normal, float alpha, vec3 diffuse, vec3 specular, float shininess, vec3 emissive) { + if (alpha != glowIntensity) { + discard; + } + + gl_FragData[0] = vec4(diffuse.rgb, alpha); + //gl_FragData[1] = vec4(normal, 0.0) * 0.5 + vec4(0.5, 0.5, 0.5, 1.0); + gl_FragData[1] = vec4(normal, 0.0) * 0.5 + vec4(0.5, 0.5, 0.5, 0.5); + gl_FragData[2] = vec4(emissive, shininess / 128.0); +} + +void packDeferredFragmentTranslucent(vec3 normal, float alpha, vec3 diffuse, vec3 specular, float shininess) { + if (alpha <= alphaThreshold) { + discard; + } + + gl_FragData[0] = vec4(diffuse.rgb, alpha); + // gl_FragData[1] = vec4(normal, 0.0) * 0.5 + vec4(0.5, 0.5, 0.5, 1.0); + // gl_FragData[2] = vec4(specular, shininess / 128.0); +} + +<@endif@> diff --git a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp index d991d3193f..17d0c3dbda 100644 --- a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp @@ -19,6 +19,10 @@ #include "RenderablePolyLineEntityItem.h" +#include "paintStroke_vert.h" +#include "paintStroke_frag.h" + + EntityItemPointer RenderablePolyLineEntityItem::factory(const EntityItemID& entityID, const EntityItemProperties& properties) { return EntityItemPointer(new RenderablePolyLineEntityItem(entityID, properties)); @@ -41,8 +45,8 @@ void RenderablePolyLineEntityItem::createPipeline() { _format->setAttribute(gpu::Stream::NORMAL, 0, gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::XYZ), NORMAL_OFFSET); _format->setAttribute(gpu::Stream::COLOR, 0, gpu::Element(gpu::VEC4, gpu::UINT8, gpu::RGBA), COLOR_OFFSET); - auto VS = DependencyManager::get()->getSimpleVertexShader(); - auto PS = DependencyManager::get()->getSimplePixelShader(); + auto VS = gpu::ShaderPointer(gpu::Shader::createVertex(std::string(paintStroke_vert))); + auto PS = gpu::ShaderPointer(gpu::Shader::createPixel(std::string(paintStroke_frag))); gpu::ShaderPointer program = gpu::ShaderPointer(gpu::Shader::createProgram(VS, PS)); gpu::Shader::BindingSet slotBindings; diff --git a/libraries/entities-renderer/src/paintStroke.slf b/libraries/entities-renderer/src/paintStroke.slf new file mode 100644 index 0000000000..e09e81155a --- /dev/null +++ b/libraries/entities-renderer/src/paintStroke.slf @@ -0,0 +1,29 @@ +<@include gpu/Config.slh@> +<$VERSION_HEADER$> +// Generated on <$_SCRIBE_DATE$> +// +// paintStroke.frag +// fragment shader +// +// Created by Andrzej Kapolka on 9/15/14. +// Copyright 2014 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@> + +// the interpolated normal +varying vec4 interpolatedNormal; + + +void main(void) { + vec3 color = vec3(0.9, 0.2, 0.9); + packDeferredFragment( + normalize(interpolatedNormal.xyz), + glowIntensity, + gl_Color.rgb, + gl_FrontMaterial.specular.rgb, + gl_FrontMaterial.shininess); +} diff --git a/libraries/entities-renderer/src/paintStroke.slv b/libraries/entities-renderer/src/paintStroke.slv new file mode 100644 index 0000000000..d865a4651e --- /dev/null +++ b/libraries/entities-renderer/src/paintStroke.slv @@ -0,0 +1,35 @@ +<@include gpu/Config.slh@> +<$VERSION_HEADER$> +// Generated on <$_SCRIBE_DATE$> +// +// paintStroke.vert +// vertex shader +// +// Created by Andrzej Kapolka on 9/15/14. +// Copyright 2014 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 gpu/Transform.slh@> + +<$declareStandardTransform()$> + +// the interpolated normal +varying vec4 interpolatedNormal; + +void main(void) { + gl_TexCoord[0] = gl_MultiTexCoord0; + + // pass along the diffuse color + gl_FrontColor = gl_Color; + + // standard transform + TransformCamera cam = getTransformCamera(); + TransformObject obj = getTransformObject(); + <$transformModelToClipPos(cam, obj, gl_Vertex, gl_Position)$> + <$transformModelToEyeDir(cam, obj, gl_Normal, interpolatedNormal.xyz)$> + + interpolatedNormal = vec4(normalize(interpolatedNormal.xyz), 0.0); +} \ No newline at end of file diff --git a/libraries/entities/src/PolyLineEntityItem.cpp b/libraries/entities/src/PolyLineEntityItem.cpp index f25c40012c..a5d27d8f93 100644 --- a/libraries/entities/src/PolyLineEntityItem.cpp +++ b/libraries/entities/src/PolyLineEntityItem.cpp @@ -126,6 +126,8 @@ bool PolyLineEntityItem::setNormals(const QVector& normals) { if (_points.size () < 2 || _strokeWidths.size() < 2) { return false; } + +// int minArraySize = glm::min(_normals.size(), _points.size()) _vertices.clear(); //Go through and create vertices for triangle strip based on normalsa if (_normals.size() != _points.size()) {