58 lines
2.1 KiB
GLSL
58 lines
2.1 KiB
GLSL
#version 330 core
|
|
|
|
#pragma import org.openrndr.extra.shaderphrases.phrases.Depth.projectionToViewCoordinate;
|
|
#pragma import org.openrndr.extra.dnk3.cubemap.SphericalHarmonicsKt.glslFetchSH0;
|
|
#pragma import org.openrndr.extra.dnk3.cubemap.SphericalHarmonicsKt.glslGridCoordinates;
|
|
#pragma import org.openrndr.extra.dnk3.cubemap.SphericalHarmonicsKt.glslGridIndex;
|
|
#pragma import org.openrndr.extra.dnk3.cubemap.SphericalHarmonicsKt.glslGatherSH0;
|
|
#pragma import org.openrndr.extra.noise.phrases.NoisePhrasesKt.phraseHash22;
|
|
#pragma import org.openrndr.extra.noise.phrases.SimplexKt.phraseSimplex3;
|
|
|
|
in vec2 v_texCoord0;
|
|
uniform sampler2D tex0; // image
|
|
uniform sampler2D tex1; // projDepth
|
|
|
|
uniform samplerBuffer shMap;
|
|
uniform ivec3 shMapDimensions;
|
|
uniform vec3 shMapOffset;
|
|
uniform float shMapSpacing;
|
|
|
|
uniform mat4 projectionMatrixInverse;
|
|
uniform mat4 viewMatrixInverse;
|
|
uniform float stepLength;
|
|
|
|
out vec4 o_output;
|
|
|
|
void main() {
|
|
vec3 inputColor = texture(tex0, v_texCoord0).rgb;
|
|
float projDepth = texture(tex1, v_texCoord0).r;
|
|
vec3 viewCoordinate = projectionToViewCoordinate(v_texCoord0, projDepth, projectionMatrixInverse);
|
|
|
|
vec3 worldCoordinate = (viewMatrixInverse * vec4(viewCoordinate, 1.0)).xyz;
|
|
vec3 cameraPosition = (viewMatrixInverse * vec4(vec3(0.0), 1.0)).xyz;
|
|
|
|
// trace in world space
|
|
vec3 traverse = cameraPosition - worldCoordinate;
|
|
vec3 direction = normalize(traverse);
|
|
if (length(traverse) > 10.0) {
|
|
traverse = direction*10.0;
|
|
worldCoordinate = cameraPosition - traverse;
|
|
}
|
|
|
|
int steps = min(100, int(length(traverse) / 0.1));
|
|
vec3 step = traverse / steps;
|
|
|
|
vec3 marchPosition = worldCoordinate;
|
|
vec3 accumulated = inputColor;
|
|
float jitter = hash22(v_texCoord0).x;
|
|
marchPosition += jitter * step*0.5;
|
|
for (int stepIndex = 0; stepIndex < steps; ++stepIndex) {
|
|
float density = pow(abs(simplex31(marchPosition*0.25)), 4.0) * 0.1;
|
|
vec3 sh0;
|
|
gatherSH0(shMap, marchPosition, shMapDimensions, shMapOffset, shMapSpacing, sh0);
|
|
accumulated = accumulated * (1.0-density) + sh0 * density;
|
|
marchPosition += step;
|
|
}
|
|
o_output = vec4(accumulated, 1.0);
|
|
}
|