Files
Eclipse-Shader/shaders/dimensions/deferred1.fsh
T

79 lines
2.6 KiB
GLSL

#include "/lib/settings.glsl"
uniform sampler2D colortex4;
uniform sampler2D colortex1;
uniform sampler2D colortex12;
uniform vec2 texelSize;
uniform sampler2D depthtex0;
uniform sampler2D depthtex1;
#ifdef DISTANT_HORIZONS
uniform sampler2D dhDepthTex;
uniform sampler2D dhDepthTex1;
#define dhVoxyDepthTex dhDepthTex
#define dhVoxyDepthTex1 dhDepthTex1
#endif
#ifdef VOXY
uniform sampler2D vxDepthTexOpaque;
uniform sampler2D vxDepthTexTrans;
#define dhVoxyDepthTex vxDepthTexTrans
#define dhVoxyDepthTex1 vxDepthTexOpaque
#endif
uniform float near;
uniform float far;
uniform float dhVoxyFarPlane;
uniform float dhVoxyNearPlane;
float linZ(float depth) {
return (2.0 * near) / (far + near - depth * (far - near));
}
float DH_linZ(float dist) {
return (2.0 * dhVoxyNearPlane) / (dhVoxyFarPlane + dhVoxyNearPlane - dist * (dhVoxyFarPlane - dhVoxyNearPlane));
}
float DH_invLinZ (float lindepth){
return -((2.0*dhVoxyNearPlane/lindepth)-dhVoxyFarPlane-dhVoxyNearPlane)/(dhVoxyFarPlane-dhVoxyNearPlane);
}
float linearizeDepthFast(const in float depth, const in float near, const in float far) {
return (near * far) / (depth * (near - far) + far);
}
void convertHandDepth(inout float depth) {
float ndcDepth = depth * 2.0 - 1.0;
ndcDepth /= MC_HAND_DEPTH;
depth = ndcDepth * 0.5 + 0.5;
}
vec2 decodeVec2(float a){
const vec2 constant1 = 65535. / vec2( 256., 65536.);
const float constant2 = 256. / 255.;
return fract( a * constant1 ) * constant2 ;
}
//////////////////////////////VOID MAIN//////////////////////////////
//////////////////////////////VOID MAIN//////////////////////////////
//////////////////////////////VOID MAIN//////////////////////////////
//////////////////////////////VOID MAIN//////////////////////////////
//////////////////////////////VOID MAIN//////////////////////////////
void main() {
/* RENDERTARGETS:4 */
vec3 oldTex = texelFetch(colortex4, ivec2(gl_FragCoord.xy), 0).xyz;
float newTex = texelFetch(depthtex1, ivec2(gl_FragCoord.xy*4), 0).x;
float dataUnpacked = decodeVec2(texelFetch(colortex1,ivec2(gl_FragCoord.xy*4),0).w).y;
bool hand = abs(dataUnpacked-0.75) < 0.01;
if(hand) convertHandDepth(newTex);
// #if defined DISTANT_HORIZONS || defined VOXY
// float QuarterResDepth = texelFetch(dhVoxyDepthTex, ivec2(gl_FragCoord.xy*4), 0).x;
// QuarterResDepth = DH_linZ(QuarterResDepth);
// gl_FragData[1].a = QuarterResDepth*QuarterResDepth*65000.0;
// if(QuarterResDepth >= 1.0) gl_FragData[1].a = 66000.0;
// #endif
newTex = linZ(newTex);
gl_FragData[0] = vec4(oldTex, newTex*newTex*65000.0);
if(newTex >= 1.0) gl_FragData[0].a = 66000.0;
}