78 lines
2.5 KiB
GLSL
78 lines
2.5 KiB
GLSL
void Outline(vec3 color, bool secondPass, out vec4 outerOutline, out vec4 innerOutline) {
|
|
float ph = ceil(viewHeight / 1440.0) / viewHeight;
|
|
float pw = ph / aspectRatio;
|
|
|
|
float oOutlineMask = 1.0, iOutlineMask = 1.0, iBevel = 1.0;
|
|
vec3 oOutlineColor = vec3(0.0), iOutlineColor = color;
|
|
|
|
float z = texture2D(depthtex0, texCoord).r;
|
|
float linZ = GetLinearDepth(z);
|
|
float minZ = z, maxZ = z;
|
|
|
|
int sampleCount = viewHeight >= 720.0 ? 12 : 4;
|
|
|
|
#ifdef RETRO_FILTER
|
|
ph = RETRO_FILTER_SIZE / viewHeight;
|
|
pw = ph / aspectRatio;
|
|
sampleCount = 4;
|
|
#endif
|
|
|
|
for (int i = 0; i < sampleCount; i++) {
|
|
vec2 offset = vec2(pw, ph) * outlineOffsets[i];
|
|
float linSampleZSum = 0.0, linSampleZDiff = 0.0;
|
|
|
|
for (int j = 0; j < 2; j++) {
|
|
float sampleZ = texture2D(depthtex0, texCoord + offset).r;
|
|
float linSampleZ = GetLinearDepth(sampleZ);
|
|
|
|
#ifdef OUTLINE_OUTER_COLOR
|
|
if((GetLinearDepth(minZ) - 0.125 / far) > linSampleZ) {
|
|
oOutlineColor = texture2D(colortex0, texCoord + offset).rgb;
|
|
}
|
|
#endif
|
|
|
|
linSampleZSum += linSampleZ;
|
|
if(j == 0) linSampleZDiff = linSampleZ;
|
|
else linSampleZDiff -= linSampleZ;
|
|
|
|
minZ = min(minZ, sampleZ);
|
|
maxZ = max(maxZ, sampleZ);
|
|
offset = -offset;
|
|
}
|
|
|
|
#ifdef OUTLINE_OUTER
|
|
oOutlineMask *= clamp(1.0 - (linZ * 2.0 - linSampleZSum) * far * 0.25, 0.0, 1.0);
|
|
#endif
|
|
|
|
#ifdef OUTLINE_INNER
|
|
linSampleZSum -= abs(linSampleZDiff) * 0.5;
|
|
iOutlineMask *= clamp(1.125 + (linZ * 2.0 - linSampleZSum) * 32.0 * far, 0.0, 1.0);
|
|
#endif
|
|
}
|
|
|
|
#if ALPHA_BLEND == 0
|
|
oOutlineColor *= oOutlineColor;
|
|
#endif
|
|
|
|
oOutlineColor = sqrt(oOutlineColor) * 0.35;
|
|
oOutlineColor *= oOutlineColor;
|
|
oOutlineMask = 1.0 - oOutlineMask;
|
|
|
|
iOutlineColor = sqrt(iOutlineColor) * 1.2;
|
|
iOutlineColor *= iOutlineColor;
|
|
iOutlineMask = 1.0 - iOutlineMask;
|
|
|
|
vec4 viewPos = gbufferProjectionInverse * (vec4(texCoord.x, texCoord.y, minZ, 1.0) * 2.0 - 1.0);
|
|
viewPos /= viewPos.w;
|
|
|
|
if (oOutlineMask > 0.001) {
|
|
Fog(oOutlineColor, viewPos.xyz);
|
|
if (isEyeInWater == 1.0 && secondPass) {
|
|
vec4 waterFog = GetWaterFog(viewPos.xyz);
|
|
oOutlineColor = mix(oOutlineColor, waterFog.rgb, waterFog.a);
|
|
}
|
|
}
|
|
|
|
outerOutline = vec4(oOutlineColor, oOutlineMask);
|
|
innerOutline = vec4(iOutlineColor, iOutlineMask);
|
|
} |