A few tweaks to SSR while I'm in the neighborhood.
Mostly just making it actually kind of work. Still needs a lot more tweaking - but can revisit later. SL-18332meow-7.2.2
parent
911aba0c1c
commit
07ada65df1
|
|
@ -44,8 +44,10 @@ VARYING vec3 camera_ray;
|
|||
|
||||
uniform sampler2D depthMap;
|
||||
uniform sampler2D normalMap;
|
||||
uniform sampler2D specularRect;
|
||||
uniform sampler2D sceneMap;
|
||||
uniform sampler2D diffuseRect;
|
||||
uniform sampler2D diffuseMap;
|
||||
|
||||
vec3 getNorm(vec2 screenpos);
|
||||
float getDepth(vec2 pos_screen);
|
||||
|
|
@ -54,45 +56,63 @@ float linearDepth01(float d, float znear, float zfar);
|
|||
|
||||
vec4 getPositionWithDepth(vec2 pos_screen, float depth);
|
||||
vec4 getPosition(vec2 pos_screen);
|
||||
|
||||
bool traceScreenRay(vec3 position, vec3 reflection, out vec3 hitColor, out float hitDepth, float depth, sampler2D textureFrame);
|
||||
vec4 getNormalEnvIntensityFlags(vec2 screenpos, out vec3 n, out float envIntensity);
|
||||
bool traceScreenRay(vec3 position, vec3 reflection, out vec4 hitColor, out float hitDepth, float depth, sampler2D textureFrame);
|
||||
float random (vec2 uv);
|
||||
void main() {
|
||||
vec2 tc = vary_fragcoord.xy;
|
||||
float depth = linearDepth01(getDepth(tc), zNear, zFar);
|
||||
vec3 n = vec3(0, 0, 1);
|
||||
float envIntensity;
|
||||
vec4 norm = getNormalEnvIntensityFlags(tc, n, envIntensity); // need `norm.w` for GET_GBUFFER_FLAG()
|
||||
vec3 pos = getPositionWithDepth(tc, getDepth(tc)).xyz;
|
||||
vec4 spec = texture2D(specularRect, tc);
|
||||
vec3 viewPos = camera_ray * depth;
|
||||
vec3 rayDirection = normalize(reflect(normalize(viewPos), getNorm(tc))) * -viewPos.z;
|
||||
vec3 rayDirection = normalize(reflect(normalize(viewPos), n)) * -viewPos.z;
|
||||
vec2 hitpixel;
|
||||
vec3 hitpoint;
|
||||
vec4 hitpoint;
|
||||
vec4 diffuse = texture2D(diffuseRect, tc);
|
||||
vec3 specCol = spec.rgb;
|
||||
|
||||
if (GET_GBUFFER_FLAG(GBUFFER_FLAG_HAS_PBR)) {
|
||||
vec3 orm = specCol.rgb;
|
||||
float perceptualRoughness = orm.g;
|
||||
float metallic = orm.b;
|
||||
vec3 f0 = vec3(0.04);
|
||||
vec3 baseColor = diffuse.rgb;
|
||||
|
||||
vec3 diffuseColor = baseColor.rgb*(vec3(1.0)-f0);
|
||||
|
||||
specCol = mix(f0, baseColor.rgb, metallic);
|
||||
}
|
||||
|
||||
vec2 uv2 = tc * screen_res;
|
||||
float c = (uv2.x + uv2.y) * 0.125;
|
||||
float jitter = mod( c, 1.0);
|
||||
|
||||
vec3 firstBasis = normalize(cross(vec3(0.f, 0.f, 1.f), rayDirection));
|
||||
vec3 firstBasis = normalize(cross(vec3(1.f, 1.f, 1.f), rayDirection));
|
||||
vec3 secondBasis = normalize(cross(rayDirection, firstBasis));
|
||||
|
||||
frag_color.rgb = texture(diffuseRect, tc).rgb;
|
||||
frag_color = texture(diffuseMap, tc);
|
||||
vec4 collectedColor;
|
||||
for (int i = 0; i < 1; i++) {
|
||||
vec2 coeffs = vec2(random(tc + vec2(0, i)) + random(tc + vec2(i, 0))) * 0.25;
|
||||
|
||||
vec2 screenpos = 1 - abs(tc * 2 - 1);
|
||||
float vignette = clamp((screenpos.x * screenpos.y) * 16,0, 1);
|
||||
vignette *= clamp((dot(normalize(viewPos), n) * 0.5 + 0.5 - 0.2) * 8, 0, 1);
|
||||
vignette *= min(linearDepth(getDepth(tc), zNear, zFar) / zFar, 1);
|
||||
int totalSamples = 4;
|
||||
for (int i = 0; i < totalSamples; i++) {
|
||||
vec2 coeffs = vec2(random(tc + vec2(0, i)) + random(tc + vec2(i, 0)));
|
||||
vec3 reflectionDirectionRandomized = rayDirection + firstBasis * coeffs.x + secondBasis * coeffs.y;
|
||||
|
||||
bool hit = traceScreenRay(pos, reflectionDirectionRandomized, hitpoint, depth, depth, diffuseRect);
|
||||
bool hit = traceScreenRay(pos, reflectionDirectionRandomized, hitpoint, depth, depth, diffuseMap);
|
||||
if (hit) {
|
||||
vec2 screenpos = tc * 2 - 1;
|
||||
float vignette = 1;// clamp((1 - dot(screenpos, screenpos)) * 4,0, 1);
|
||||
vignette *= dot(normalize(viewPos), getNorm(tc)) * 0.5 + 0.5;
|
||||
vignette *= min(linearDepth(getDepth(tc), zNear, zFar) / (zFar * 0.0125), 1);
|
||||
collectedColor.rgb = hitpoint * vignette * 0.25;
|
||||
frag_color.rgb = hitpoint;
|
||||
collectedColor += hitpoint;
|
||||
collectedColor.rgb *= specCol.rgb;
|
||||
}
|
||||
}
|
||||
|
||||
//frag_color.rgb = collectedColor.rgb;
|
||||
collectedColor *= vignette;
|
||||
|
||||
|
||||
|
||||
frag_color.a = 1.0;
|
||||
frag_color += collectedColor;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -52,28 +52,28 @@ vec2 generateProjectedPosition(vec3 pos){
|
|||
|
||||
bool isBinarySearchEnabled = true;
|
||||
bool isAdaptiveStepEnabled = true;
|
||||
bool isExponentialStepEnabled = false;
|
||||
bool isExponentialStepEnabled = true;
|
||||
bool debugDraw = false;
|
||||
int iterationCount = 100;
|
||||
float rayStep = 0.2;
|
||||
float distanceBias = 0.05;
|
||||
int iterationCount = 40;
|
||||
float rayStep = 0.1;
|
||||
float distanceBias = 0.02;
|
||||
float depthRejectBias = 0.001;
|
||||
float epsilon = 0.1;
|
||||
|
||||
bool traceScreenRay(vec3 position, vec3 reflection, out vec3 hitColor, out float hitDepth, float depth, sampler2D textureFrame) {
|
||||
bool traceScreenRay(vec3 position, vec3 reflection, out vec4 hitColor, out float hitDepth, float depth, sampler2D textureFrame) {
|
||||
vec3 step = rayStep * reflection;
|
||||
vec3 marchingPosition = position + step;
|
||||
float delta;
|
||||
float depthFromScreen;
|
||||
vec2 screenPosition;
|
||||
bool hit = false;
|
||||
hitColor = vec3(0);
|
||||
hitColor = vec4(0);
|
||||
|
||||
int i = 0;
|
||||
if (depth > depthRejectBias) {
|
||||
for (; i < iterationCount && !hit; i++) {
|
||||
screenPosition = generateProjectedPosition(marchingPosition);
|
||||
depthFromScreen = abs(getPositionWithDepth(screenPosition, linearDepth(getDepth(screenPosition), zNear, zFar)).z);
|
||||
depthFromScreen = linearDepth(getDepth(screenPosition), zNear, zFar);
|
||||
delta = abs(marchingPosition.z) - depthFromScreen;
|
||||
|
||||
if (depth < depthFromScreen + epsilon && depth > depthFromScreen - epsilon) {
|
||||
|
|
@ -81,10 +81,10 @@ bool traceScreenRay(vec3 position, vec3 reflection, out vec3 hitColor, out float
|
|||
}
|
||||
|
||||
if (abs(delta) < distanceBias) {
|
||||
vec3 color = vec3(1);
|
||||
vec4 color = vec4(1);
|
||||
if(debugDraw)
|
||||
color = vec3( 0.5+ sign(delta)/2,0.3,0.5- sign(delta)/2);
|
||||
hitColor = texture(textureFrame, screenPosition).xyz * color;
|
||||
color = vec4( 0.5+ sign(delta)/2,0.3,0.5- sign(delta)/2, 0);
|
||||
hitColor = texture(textureFrame, screenPosition) * color;
|
||||
hitDepth = depthFromScreen;
|
||||
hit = true;
|
||||
break;
|
||||
|
|
@ -114,7 +114,7 @@ bool traceScreenRay(vec3 position, vec3 reflection, out vec3 hitColor, out float
|
|||
marchingPosition = marchingPosition - step * sign(delta);
|
||||
|
||||
screenPosition = generateProjectedPosition(marchingPosition);
|
||||
depthFromScreen = abs(getPositionWithDepth(screenPosition, getDepth(screenPosition)).z);
|
||||
depthFromScreen = linearDepth(getDepth(screenPosition), zNear, zFar);
|
||||
delta = abs(marchingPosition.z) - depthFromScreen;
|
||||
|
||||
if (depth < depthFromScreen + epsilon && depth > depthFromScreen - epsilon) {
|
||||
|
|
@ -122,10 +122,10 @@ bool traceScreenRay(vec3 position, vec3 reflection, out vec3 hitColor, out float
|
|||
}
|
||||
|
||||
if (abs(delta) < distanceBias && depthFromScreen != (depth - distanceBias)) {
|
||||
vec3 color = vec3(1);
|
||||
vec4 color = vec4(1);
|
||||
if(debugDraw)
|
||||
color = vec3( 0.5+ sign(delta)/2,0.3,0.5- sign(delta)/2);
|
||||
hitColor = texture(textureFrame, screenPosition).xyz * color;
|
||||
color = vec4( 0.5+ sign(delta)/2,0.3,0.5- sign(delta)/2, 0);
|
||||
hitColor = texture(textureFrame, screenPosition) * color;
|
||||
hitDepth = depthFromScreen;
|
||||
hit = true;
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -7620,7 +7620,7 @@ void LLPipeline::renderFinalize()
|
|||
LLRenderTarget *screen_target = &mRT->screen;
|
||||
|
||||
screen_target->bindTarget();
|
||||
S32 channel = gPostScreenSpaceReflectionProgram.enableTexture(LLShaderMgr::DIFFUSE_MAP, mRT->fxaaBuffer.getUsage());
|
||||
S32 channel = gPostScreenSpaceReflectionProgram.enableTexture(LLShaderMgr::DIFFUSE_MAP, screen_target->getUsage());
|
||||
if (channel > -1)
|
||||
{
|
||||
screen_target->bindTexture(0, channel, LLTexUnit::TFO_POINT);
|
||||
|
|
@ -7628,8 +7628,9 @@ void LLPipeline::renderFinalize()
|
|||
}
|
||||
|
||||
{
|
||||
LLGLDisable blend(GL_BLEND);
|
||||
LLGLDisable blend(GL_BLEND);
|
||||
LLGLDepthTest depth(GL_TRUE, GL_FALSE, GL_ALWAYS);
|
||||
|
||||
stop_glerror();
|
||||
mDeferredVB->drawArrays(LLRender::TRIANGLES, 0, 3);
|
||||
stop_glerror();
|
||||
|
|
|
|||
Loading…
Reference in New Issue