37 lines
1.0 KiB
GLSL
37 lines
1.0 KiB
GLSL
// MinecraftPT — Parallax Occlusion Mapping
|
|
// Steep parallax mapping with PCF soft shadows.
|
|
|
|
#ifndef PARALLAX_GLSL
|
|
#define PARALLAX_GLSL
|
|
|
|
// Steep parallax mapping
|
|
vec2 ParallaxMapping(vec2 texcoord, vec3 viewDir){
|
|
float height = texture(tex, texcoord).a;
|
|
vec2 delta = viewDir.xy / viewDir.z * PARALLAX_DEPTH;
|
|
|
|
int numLayers = max(1, int(PARALLAX_QUALITY));
|
|
float layerDepth = 1.0 / float(numLayers);
|
|
float currentDepth = 0.0;
|
|
vec2 currentCoord = texcoord;
|
|
|
|
for (int i = 0; i < numLayers; i++){
|
|
currentCoord -= delta * layerDepth;
|
|
height = texture(tex, currentCoord).a;
|
|
currentDepth += layerDepth;
|
|
if (height < currentDepth) break;
|
|
}
|
|
|
|
// Parallax shadow
|
|
float shadow = 1.0;
|
|
#ifdef PARALLAX_SHADOW
|
|
// PCF shadow
|
|
for (int i = 0; i < PARALLAX_SHADOW_QUALITY; i++){
|
|
vec2 shadowCoord = currentCoord + delta * float(i) / float(PARALLAX_SHADOW_QUALITY);
|
|
shadow *= step(currentDepth - layerDepth * float(i) / float(PARALLAX_SHADOW_QUALITY), texture(tex, shadowCoord).a);
|
|
}
|
|
#endif
|
|
|
|
return currentCoord;
|
|
}
|
|
|
|
#endif |