overte-AleziaKurdis/libraries/render-utils/src/subsurfaceScattering_drawScattering.slf
2018-10-29 16:42:46 -07:00

113 lines
3.3 KiB
Text

<@include gpu/Config.slh@>
<$VERSION_HEADER$>
// Generated on <$_SCRIBE_DATE$>
//
// subsurfaceScattering_drawScattering.frag
//
// Created by Sam Gateau on 6/8/16.
// Copyright 2016 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/ShaderConstants.h@>
<@include DeferredBufferRead.slh@>
<@include graphics/Light.slh@>
<$declareLightBuffer()$>
<$declareDeferredCurvature()$>
<@include SubsurfaceScattering.slh@>
<$declareSubsurfaceScatteringBRDF()$>
layout(location=0) in vec2 varTexCoord0;
layout(location=0) out vec4 _fragColor;
struct SSSDebugParams {
vec4 cursorTexCoordSpare2;
};
// Deferred frame transform uses slot 0
LAYOUT_STD140(binding=1) uniform sssDebugParamsBuffer {
SSSDebugParams sssDebugParams;
};
vec3 evalScatteringBRDF(vec2 texcoord) {
DeferredFragment fragment = unpackDeferredFragmentNoPosition(texcoord);
vec3 normal = fragment.normal; // .getWorldNormal(varTexCoord0);
vec4 blurredCurvature = fetchCurvature(texcoord);
vec4 diffusedCurvature = fetchDiffusedCurvature(texcoord);
vec3 midNormal = normalize((blurredCurvature.xyz - 0.5f) * 2.0f);
vec3 lowNormal = normalize((diffusedCurvature.xyz - 0.5f) * 2.0f);
float curvature = unpackCurvature(diffusedCurvature.w);
// Transform directions to worldspace
vec3 fragNormal = vec3((normal));
// Get light
Light light = getKeyLight();
vec3 fresnel = vec3(0.028); // Default Di-electric fresnel value for skin
float metallic = 0.0;
vec3 fragLightDir = -normalize(getLightDirection(light));
vec3 brdf = evalSkinBRDF(fragLightDir, fragNormal, midNormal, lowNormal, curvature);
return brdf;
}
vec3 drawScatteringTableUV(vec2 cursor, vec2 texcoord) {
DeferredFragment fragment = unpackDeferredFragmentNoPosition(cursor);
vec3 normal = fragment.normal; // .getWorldNormal(varTexCoord0);
vec4 blurredCurvature = fetchCurvature(cursor);
vec4 diffusedCurvature = fetchDiffusedCurvature(cursor);
vec3 midNormal = normalize((blurredCurvature.xyz - 0.5f) * 2.0f);
vec3 lowNormal = normalize((diffusedCurvature.xyz - 0.5f) * 2.0f);
float curvature = unpackCurvature(diffusedCurvature.w);
// Get light
Light light = getKeyLight();
vec3 fresnel = vec3(0.028); // Default Di-electric fresnel value for skin
vec3 fragLightDir = -normalize(getLightDirection(light));
vec3 bentNdotL = evalScatteringBentNdotL(normal, midNormal, lowNormal, fragLightDir);
vec3 distance = vec3(0.0);
for (int c = 0; c < 3; c++) {
vec2 BRDFuv = vec2(clamp(bentNdotL[c] * 0.5 + 0.5, 0.0, 1.0), clamp(2.0 * curvature, 0.0, 1.0));
vec2 delta = BRDFuv - texcoord;
distance[c] = 1.0 - dot(delta, delta);
}
distance *= distance;
float threshold = 0.999;
vec3 color = vec3(0.0);
bool keep = false;
for (int c = 0; c < 3; c++) {
bool check = distance[c] > threshold;
keep = keep || check;
color[c] += float(check);
}
if (!keep) {
discard;
}
return color;
}
void main(void) {
vec2 cursorTexcoord = sssDebugParams.cursorTexCoordSpare2.xy;
_fragColor = vec4(drawScatteringTableUV(cursorTexcoord, varTexCoord0), 1.0);
}