134 lines
4.4 KiB
GLSL
134 lines
4.4 KiB
GLSL
#define NETHER_PORTAL_VARIATION 1 //[1 2]
|
|
//#define NETHER_PORTAL_NOISE
|
|
|
|
#if NETHER_PORTAL_VARIATION == 1
|
|
lmCoordM = vec2(0.0);
|
|
color = vec4(0.0);
|
|
|
|
int sampleCount = 8;
|
|
|
|
float multiplier = 0.4 / (-viewVector.z * sampleCount);
|
|
vec2 interval = viewVector.xy * multiplier;
|
|
vec2 coord = signMidCoordPos * 0.5 + 0.5;
|
|
vec2 absMidCoordPos2 = absMidCoordPos * 2.0;
|
|
vec2 midCoord = texCoord - absMidCoordPos * signMidCoordPos;
|
|
vec2 minimumMidCoordPos = midCoord - absMidCoordPos;
|
|
|
|
for (int i = 0; i < sampleCount; i++) {
|
|
float portalStep = (i + dither) / sampleCount;
|
|
coord += interval * portalStep;
|
|
vec2 sampleCoord = fract(coord) * absMidCoordPos2 + minimumMidCoordPos;
|
|
vec4 psample = texture2DLod(tex, sampleCoord, 0);
|
|
|
|
float factor = 1.0 - portalStep;
|
|
psample *= pow(factor, 0.1);
|
|
|
|
emission = max(emission, psample.r);
|
|
|
|
color += psample;
|
|
}
|
|
color /= sampleCount;
|
|
|
|
color.rgb *= color.rgb * vec3(1.25, 1.0, 0.65);
|
|
color.a = sqrt1(color.a) * 0.8;
|
|
|
|
emission *= emission;
|
|
emission *= emission;
|
|
emission *= emission;
|
|
emission = clamp(emission * 120.0, 0.03, 1.2) * 8.0;
|
|
#else
|
|
#ifdef GENERATED_NORMALS
|
|
noGeneratedNormals = true;
|
|
#endif
|
|
vec3 wpos = normalize((gbufferModelViewInverse * vec4(viewPos * 1000.0, 1.0)).xyz);
|
|
wpos.xz /= wpos.y;
|
|
|
|
vec2 wind = vec2(0.0, frameTimeCounter * 0.03);
|
|
|
|
float noise = texture2DLod(noisetex, wpos.xz * 0.20 + wind * 0.2, 0.0).r * 0.01;
|
|
noise+= texture2DLod(noisetex, wpos.xz * 0.15 + wind * 0.15, 0.0).r * 0.02;
|
|
noise+= texture2DLod(noisetex, wpos.xz * 0.10 + wind * 0.10, 0.0).r * 0.06;
|
|
noise+= texture2DLod(noisetex, wpos.xz * 0.05 + wind * 0.05, 0.0).r * 0.12;
|
|
|
|
color.rgb = vec3(0.4431, 0.102, 0.6118) * noise * 3.0;
|
|
color.rgb *= color.rgb * 24.0;
|
|
|
|
float fogFactor = smoothstep(0.0, 1.0, 0.03 / -wpos.y);
|
|
fogFactor += smoothstep(0.0, 1.0, 0.03 / wpos.y);
|
|
|
|
vec3 fogColor = vec3(0.3373, 0.0431, 0.1176) * 25.0;
|
|
color.rgb = mix(color.rgb, fogColor, fogFactor);
|
|
color.a = 0.7;
|
|
#endif
|
|
|
|
#ifdef NETHER_PORTAL_NOISE
|
|
vec2 portalUV;
|
|
if (abs(worldGeoNormal.x) > 0.5) {
|
|
portalUV = worldPos.yz;
|
|
} else {
|
|
portalUV = worldPos.yx;
|
|
}
|
|
|
|
float baseNoise = texture2DLod(noisetex, portalUV * 0.03 + frameTimeCounter * 0.01, 0.0).b;
|
|
vec2 timeWaves = vec2(
|
|
sin(frameTimeCounter * 0.7 + portalUV.x * 2.0),
|
|
cos(frameTimeCounter * 0.5 + portalUV.y * 2.0)
|
|
);
|
|
|
|
vec2 warpedUV = portalUV * 0.1 + baseNoise * 0.05 * timeWaves + frameTimeCounter * 0.0083;
|
|
float portalNoise = 1.0 - texture2DLod(noisetex, warpedUV, 0.0).g;
|
|
|
|
color.rgb = mix(color.rgb * 0.66, color.rgb * 0.66 + pow2(vec3(portalNoise * 1.2)), portalNoise);
|
|
emission = mix(0, emission, portalNoise);
|
|
noGeneratedNormals = portalNoise > 0.25;
|
|
#endif
|
|
|
|
#define PORTAL_REDUCE_CLOSEUP
|
|
#ifdef PORTAL_REDUCE_CLOSEUP
|
|
color.a *= min1(lViewPos - 0.2);
|
|
if (color.a < 0.101) {
|
|
if (color.a < 0.101 * dither) discard;
|
|
else color.a = 0.101;
|
|
}
|
|
#endif
|
|
|
|
#ifdef PORTAL_EDGE_EFFECT
|
|
vec3 playerPosCurved = playerPos;
|
|
|
|
#ifdef WORLD_CURVATURE
|
|
playerPosCurved.y += doWorldCurvature(playerPosCurved.xz);
|
|
#endif
|
|
vec3 voxelPos = SceneToVoxel(playerPosCurved);
|
|
|
|
if (CheckInsideVoxelVolume(voxelPos)) {
|
|
float portalOffset = 0.0625 * dither;
|
|
vec3[6] portalOffsets = vec3[](
|
|
vec3( portalOffset, 0, 0),
|
|
vec3(-portalOffset, 0, 0),
|
|
vec3( 0, portalOffset, 0),
|
|
vec3( 0,-portalOffset, 0),
|
|
vec3( 0, 0, portalOffset),
|
|
vec3( 0, 0,-portalOffset)
|
|
);
|
|
|
|
float edge = 0.0;
|
|
for (int i = 0; i < 6; i++) {
|
|
uint voxel = GetVoxelVolume(ivec3(voxelPos + portalOffsets[i]));
|
|
if (voxel != uint(25)) {
|
|
edge = 1.0; break;
|
|
}
|
|
}
|
|
|
|
vec4 edgeColor = vec4(normalize(color.rgb), 1.0);
|
|
edgeColor.b *= 0.8;
|
|
color = mix(color, edgeColor, edge);
|
|
emission = mix(emission, 5.0, edge);
|
|
}
|
|
#endif
|
|
#if defined NETHER && defined BIOME_COLORED_NETHER_PORTALS
|
|
color.rgb = normalize(netherColor) * GetLuminance(color.rgb) * 2.5;
|
|
#endif
|
|
|
|
// color.rgb = vec3(0);
|
|
// emission = 0;
|