Here's my ssR code for anyone that can help me optimize whilst still keeping some plausible quality:
vec4 bColor = vec4(0.0);
vec4 N = normalize(fNorm);
mat3 tbn = mat3(tanMat*N.xyz, bitanMat*N.xyz, N.xyz);
vec4 bumpMap = texture(bumpTex, texRes*fTexCoord);
vec3 texN = (bumpMap.xyz*2.0 - 1.0);
vec3 bumpN = bumpOn == true ? normalize(tbn*texN) : N.xyz;
vec3 camSpaceNorm = vec3(view*(vec4(bumpN,N.w)));
vec3 camSpacePos = vec3(view*worldPos);
vec3 camSpaceViewDir = normalize(camSpacePos);
vec3 camSpaceVec = normalize(reflect(camSpaceViewDir,camSpaceNorm));
vec4 clipSpace = proj*vec4(camSpacePos,1);
vec3 NDCSpace = clipSpace.xyz/clipSpace.w;
vec3 screenSpacePos = 0.5*NDCSpace+0.5;
vec3 camSpaceVecPos = camSpacePos+camSpaceVec;
clipSpace = proj*vec4(camSpaceVecPos,1);
NDCSpace = clipSpace.xyz/clipSpace.w;
vec3 screenSpaceVecPos = 0.5*NDCSpace+0.5;
vec3 screenSpaceVec = 0.01*normalize(screenSpaceVecPos - screenSpacePos);
vec3 oldPos = screenSpacePos + screenSpaceVec;
vec3 currPos = oldPos + screenSpaceVec;
int count = 0;
int nRefine = 0;
float fade = 1.0;
float fadeScreen = 0.0;
float farPlane = 2.0;
float nearPlane = 0.1;
float cosAngInc = -dot(camSpaceViewDir,camSpaceNorm);
cosAngInc = clamp(1-cosAngInc,0.3,1.0);
if(specConeRatio <= 0.1 && ssrOn == true)
{
while(count < 50)
{
if(currPos.x < 0 || currPos.x > 1 || currPos.y < 0 || currPos.y > 1 || currPos.z < 0 || currPos.z > 1)
break;
vec2 ssPos = currPos.xy;
float currDepth = 2.0*nearPlane/(farPlane+nearPlane-currPos.z*(farPlane-nearPlane));
float sampleDepth = 2.0*nearPlane/(farPlane+nearPlane-texture(depthTex, ssPos).x*(farPlane-nearPlane));
float diff = currDepth - sampleDepth;
float error = length(screenSpaceVec);
if(diff >= 0 && diff < error)
{
screenSpaceVec *= 0.7;
currPos = oldPos;
nRefine++;
if(nRefine >= 3)
{
fade = float(count);
fade = clamp(fade*fade/100,1.0,40.0);
fadeScreen = distance(ssPos,vec2(0.5,0.5))*2;
bColor.xyz += texture(reflTex, ssPos).xyz/2/fade*cosAngInc*(1-clamp(fadeScreen,0.0,1.0));
break;
}
} else if(diff > error){
bColor.xyz = vec3(0);
sampleDepth = 2.0*nearPlane/(farPlane+nearPlane-texture(depthBTex, ssPos).x*(farPlane-nearPlane));
diff = currDepth - sampleDepth;
if(diff >= 0 && diff < error)
{
screenSpaceVec *= 0.7;
currPos = oldPos;
nRefine++;
if(nRefine >= 3)
{
fade = float(count);
fade = clamp(fade*fade/100,2.0,20.0);
bColor.xyz += texture(reflTex, ssPos).xyz/2/fade*cosAngInc;
break;
}
}
}
oldPos = currPos;
currPos = oldPos + screenSpaceVec;
count++;
}
}
Note that the second half of the code (after the else if(diff > error)) is where I cover the back face of models (depthBTex is a depth texture with frontface culling) so that the back of models are reflected.