diff --git a/libraries/entities-renderer/src/DeferredBufferWrite.slh b/libraries/entities-renderer/src/DeferredBufferWrite.slh index a7f4055bba..293d38096f 100755 --- a/libraries/entities-renderer/src/DeferredBufferWrite.slh +++ b/libraries/entities-renderer/src/DeferredBufferWrite.slh @@ -11,44 +11,68 @@ <@if not DEFERRED_BUFFER_WRITE_SLH@> <@def DEFERRED_BUFFER_WRITE_SLH@> +layout(location = 0) out vec4 _fragColor0; +layout(location = 1) out vec4 _fragColor1; +layout(location = 2) out vec4 _fragColor2; + // the glow intensity uniform float glowIntensity; // the alpha threshold uniform float alphaThreshold; +uniform sampler2D normalFittingMap; + +vec3 bestFitNormal(vec3 normal) { + vec3 absNorm = abs(normal); + float maxNAbs = max(absNorm.z, max(absNorm.x, absNorm.y)); + + vec2 texcoord = (absNorm.z < maxNAbs ? + (absNorm.y < maxNAbs ? absNorm.yz : absNorm.xz) : + absNorm.xy); + texcoord = (texcoord.x < texcoord.y ? texcoord.yx : texcoord.xy); + texcoord.y /= texcoord.x; + vec3 cN = normal / maxNAbs; + float fittingScale = texture(normalFittingMap, texcoord).a; + cN *= fittingScale; + return (cN * 0.5 + 0.5); +} + float evalOpaqueFinalAlpha(float alpha, float mapAlpha) { return mix(alpha * glowIntensity, 1.0 - alpha * glowIntensity, step(mapAlpha, alphaThreshold)); } +const vec3 DEFAULT_SPECULAR = vec3(0.1); +const float DEFAULT_SHININESS = 10; + 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); + _fragColor0 = vec4(diffuse.rgb, alpha); + _fragColor1 = vec4(bestFitNormal(normal), 1.0); + _fragColor2 = 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); + + _fragColor0 = vec4(diffuse.rgb, alpha); + //_fragColor1 = vec4(normal, 0.0) * 0.5 + vec4(0.5, 0.5, 0.5, 1.0); + _fragColor1 = vec4(bestFitNormal(normal), 0.5); + _fragColor2 = 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); + } + + _fragColor0 = vec4(diffuse.rgb, alpha); + // _fragColor1 = vec4(normal, 0.0) * 0.5 + vec4(0.5, 0.5, 0.5, 1.0); + // _fragColor2 = vec4(specular, shininess / 128.0); } <@endif@> diff --git a/libraries/entities-renderer/src/paintStroke.slf b/libraries/entities-renderer/src/paintStroke.slf index 4d54f68865..70ddb41b4c 100644 --- a/libraries/entities-renderer/src/paintStroke.slf +++ b/libraries/entities-renderer/src/paintStroke.slf @@ -19,9 +19,9 @@ uniform sampler2D originalTexture; // the interpolated normal -varying vec4 interpolatedNormal; -varying vec4 modelPosition; -varying vec2 varTexcoord; +in vec3 interpolatedNormal; +in vec2 varTexcoord; +in vec4 varColor; float rand(vec2 point){ return fract(sin(dot(point.xy ,vec2(12.9898,78.233))) * 43758.5453); @@ -31,14 +31,13 @@ float rand(vec2 point){ void main(void) { - vec3 newNormal = normalize(interpolatedNormal.xyz); - vec4 texel = texture2D(originalTexture, varTexcoord); + vec4 texel = texture(originalTexture, varTexcoord); int frontCondition = 1 -int(gl_FrontFacing) * 2; - vec3 color = gl_Color.rgb; + vec3 color = varColor.rgb; //vec3 normal, float alpha, vec3 diffuse, vec3 specular, float shininess packDeferredFragmentTranslucent( - newNormal * frontCondition, + interpolatedNormal * frontCondition, texel.a, color *texel.rgb, vec3(0.01, 0.01, 0.01), diff --git a/libraries/entities-renderer/src/paintStroke.slv b/libraries/entities-renderer/src/paintStroke.slv index ca4e86139f..7d7523deb9 100644 --- a/libraries/entities-renderer/src/paintStroke.slv +++ b/libraries/entities-renderer/src/paintStroke.slv @@ -12,30 +12,29 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // +<@include gpu/Inputs.slh@> <@include gpu/Transform.slh@> <$declareStandardTransform()$> // the interpolated normal -varying vec4 interpolatedNormal; -varying vec4 modelPosition; +out vec3 interpolatedNormal; //the diffuse texture -varying vec2 varTexcoord; +out vec2 varTexcoord; + +out vec4 varColor; void main(void) { - varTexcoord = gl_MultiTexCoord0.st; + varTexcoord = inTexCoord0.st; // pass along the diffuse color - gl_FrontColor = gl_Color; - + varColor = inColor; + // standard transform TransformCamera cam = getTransformCamera(); TransformObject obj = getTransformObject(); - <$transformModelToClipPos(cam, obj, gl_Vertex, gl_Position)$> - <$transformModelToEyeDir(cam, obj, gl_Normal, interpolatedNormal.xyz)$> - - modelPosition = gl_Vertex; - interpolatedNormal = vec4(normalize(interpolatedNormal.xyz), 0.0); + <$transformModelToClipPos(cam, obj, inPosition, gl_Position)$> + <$transformModelToEyeDir(cam, obj, inNormal.xyz, interpolatedNormal)$> } \ No newline at end of file diff --git a/tests/shaders/src/main.cpp b/tests/shaders/src/main.cpp index c514532eac..dde7419264 100644 --- a/tests/shaders/src/main.cpp +++ b/tests/shaders/src/main.cpp @@ -109,6 +109,8 @@ #include "sdf_text3D_vert.h" #include "sdf_text3D_frag.h" +#include "paintStroke_vert.h" +#include "paintStroke_frag.h" class RateCounter { std::vector times; @@ -324,6 +326,8 @@ void QTestWindow::draw() { testShaderBuild(SkyFromAtmosphere_vert, SkyFromAtmosphere_frag); testShaderBuild(Skybox_vert, Skybox_frag); + + testShaderBuild(paintStroke_vert,paintStroke_frag); });