2016-03-26 12:53:25 +01:00
|
|
|
// Alchemy AO
|
|
|
|
// Compute kernel
|
|
|
|
// var kernel:Array<Float> = [];
|
|
|
|
// var kernelSize = 8;
|
|
|
|
// for (i in 0...kernelSize) {
|
|
|
|
// var angle = i / kernelSize;
|
|
|
|
// angle *= 3.1415926535 * 2.0;
|
|
|
|
// var x1 = Math.cos(angle);
|
|
|
|
// var y1 = Math.sin(angle);
|
|
|
|
// x1 = Std.int(x1 * 10000000) / 10000000;
|
|
|
|
// y1 = Std.int(y1 * 10000000) / 10000000;
|
|
|
|
// trace(x1, y1);
|
|
|
|
// }
|
2016-03-15 11:29:53 +01:00
|
|
|
#version 450
|
|
|
|
|
2017-12-13 14:21:42 +01:00
|
|
|
#include "compiled.glsl"
|
|
|
|
#include "std/gbuffer.glsl"
|
2016-07-17 20:29:53 +02:00
|
|
|
|
2016-05-13 00:08:11 +02:00
|
|
|
uniform sampler2D gbufferD;
|
2016-03-22 12:04:08 +01:00
|
|
|
uniform sampler2D gbuffer0;
|
2016-03-26 12:53:25 +01:00
|
|
|
uniform sampler2D snoise;
|
2016-06-21 13:29:27 +02:00
|
|
|
|
2016-04-20 19:35:22 +02:00
|
|
|
uniform mat4 invVP;
|
2016-04-17 16:07:54 +02:00
|
|
|
uniform vec3 eye;
|
2016-08-07 23:12:14 +02:00
|
|
|
// uniform vec3 eyeLook;
|
2016-06-21 13:29:27 +02:00
|
|
|
uniform vec2 screenSize;
|
|
|
|
uniform vec2 aspectRatio;
|
2016-03-26 12:53:25 +01:00
|
|
|
|
2016-03-15 11:29:53 +01:00
|
|
|
in vec2 texCoord;
|
2016-08-07 23:12:14 +02:00
|
|
|
// in vec3 viewRay;
|
2016-10-12 17:52:27 +02:00
|
|
|
out vec4 fragColor;
|
2016-03-15 11:29:53 +01:00
|
|
|
|
2017-03-12 17:29:22 +01:00
|
|
|
float doAO(vec2 kernelVec, vec2 randomVec, mat2 rotMat, vec3 currentPos, vec3 n, float currentDistance) {
|
2016-04-20 19:35:22 +02:00
|
|
|
kernelVec.xy *= aspectRatio;
|
2016-07-17 20:29:53 +02:00
|
|
|
float radius = ssaoSize * randomVec.y;
|
2016-04-20 19:35:22 +02:00
|
|
|
kernelVec.xy = ((rotMat * kernelVec.xy) / currentDistance) * radius;
|
|
|
|
vec2 coord = texCoord + kernelVec.xy;
|
2016-05-13 00:08:11 +02:00
|
|
|
float depth = texture(gbufferD, coord).r * 2.0 - 1.0;
|
2016-10-17 17:39:40 +02:00
|
|
|
vec3 pos = getPos2NoEye(eye, invVP, depth, coord) - currentPos;
|
2016-04-20 19:35:22 +02:00
|
|
|
|
2017-03-12 17:29:22 +01:00
|
|
|
float angle = dot(pos, n);
|
2016-08-09 23:51:40 +02:00
|
|
|
// angle *= step(0.3, angle / length(pos)); // Fix intersect
|
|
|
|
angle *= step(0.1, angle / length(pos));
|
2016-04-20 19:35:22 +02:00
|
|
|
angle -= currentDistance * 0.001;
|
|
|
|
angle = max(0.0, angle);
|
2016-08-09 23:51:40 +02:00
|
|
|
// angle /= dot(pos, pos) / min(currentDistance * 0.25, 1.0) + 0.00001; // Fix darkening
|
|
|
|
angle /= dot(pos, pos) / min(currentDistance * 0.25, 1.0) + 0.001;
|
2016-04-20 19:35:22 +02:00
|
|
|
return angle;
|
|
|
|
}
|
2016-04-17 16:07:54 +02:00
|
|
|
|
2016-04-20 19:35:22 +02:00
|
|
|
void main() {
|
2016-05-13 00:08:11 +02:00
|
|
|
float depth = texture(gbufferD, texCoord).r * 2.0 - 1.0;
|
|
|
|
if (depth == 1.0) {
|
2017-03-12 17:29:22 +01:00
|
|
|
fragColor.r = 1.0;
|
2016-04-20 19:35:22 +02:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2016-08-07 23:12:14 +02:00
|
|
|
const int kernelSize = 12;
|
|
|
|
const vec2 kernel0 = vec2(1.0, 0.0);
|
|
|
|
const vec2 kernel1 = vec2(0.8660254, 0.4999999);
|
|
|
|
const vec2 kernel2 = vec2(0.5, 0.8660254);
|
|
|
|
const vec2 kernel3 = vec2(0.0, 1.0);
|
|
|
|
const vec2 kernel4 = vec2(-0.4999999, 0.8660254);
|
|
|
|
const vec2 kernel5 = vec2(-0.8660254, 0.5);
|
|
|
|
const vec2 kernel6 = vec2(-1.0, 0.0);
|
|
|
|
const vec2 kernel7 = vec2(-0.8660254, -0.4999999);
|
|
|
|
const vec2 kernel8 = vec2(-0.5, -0.8660254);
|
|
|
|
const vec2 kernel9 = vec2(0.0, -1.0);
|
|
|
|
const vec2 kernel10 = vec2(0.4999999, -0.8660254);
|
|
|
|
const vec2 kernel11 = vec2(0.8660254, -0.5);
|
|
|
|
|
2016-04-20 19:35:22 +02:00
|
|
|
vec2 enc = texture(gbuffer0, texCoord).rg;
|
2017-03-12 17:29:22 +01:00
|
|
|
vec3 n;
|
|
|
|
n.z = 1.0 - abs(enc.x) - abs(enc.y);
|
|
|
|
n.xy = n.z >= 0.0 ? enc.xy : octahedronWrap(enc.xy);
|
|
|
|
n = normalize(n);
|
2016-04-16 13:19:03 +02:00
|
|
|
|
2016-10-17 17:39:40 +02:00
|
|
|
vec3 currentPos = getPos2NoEye(eye, invVP, depth, texCoord);
|
2016-04-20 19:35:22 +02:00
|
|
|
float currentDistance = length(currentPos);
|
2016-03-26 12:53:25 +01:00
|
|
|
|
2016-04-20 19:35:22 +02:00
|
|
|
vec2 randomVec = texture(snoise, (texCoord * screenSize) / 8.0).xy;
|
|
|
|
randomVec = randomVec * 2.0 - 1.0;
|
|
|
|
mat2 rotMat = mat2(vec2(cos(randomVec.x * PI), -sin(randomVec.x * PI)),
|
|
|
|
vec2(sin(randomVec.x * PI), cos(randomVec.x * PI)));
|
2016-03-26 12:53:25 +01:00
|
|
|
|
2017-11-25 20:09:55 +01:00
|
|
|
fragColor.r = doAO(kernel0, randomVec, rotMat, currentPos, n, currentDistance);
|
|
|
|
fragColor.r += doAO(kernel1, randomVec, rotMat, currentPos, n, currentDistance);
|
|
|
|
fragColor.r += doAO(kernel2, randomVec, rotMat, currentPos, n, currentDistance);
|
|
|
|
fragColor.r += doAO(kernel3, randomVec, rotMat, currentPos, n, currentDistance);
|
|
|
|
fragColor.r += doAO(kernel4, randomVec, rotMat, currentPos, n, currentDistance);
|
|
|
|
fragColor.r += doAO(kernel5, randomVec, rotMat, currentPos, n, currentDistance);
|
|
|
|
fragColor.r += doAO(kernel6, randomVec, rotMat, currentPos, n, currentDistance);
|
|
|
|
fragColor.r += doAO(kernel7, randomVec, rotMat, currentPos, n, currentDistance);
|
|
|
|
fragColor.r += doAO(kernel8, randomVec, rotMat, currentPos, n, currentDistance);
|
|
|
|
fragColor.r += doAO(kernel9, randomVec, rotMat, currentPos, n, currentDistance);
|
|
|
|
fragColor.r += doAO(kernel10, randomVec, rotMat, currentPos, n, currentDistance);
|
|
|
|
fragColor.r += doAO(kernel11, randomVec, rotMat, currentPos, n, currentDistance);
|
2016-03-26 12:53:25 +01:00
|
|
|
|
2017-03-12 17:29:22 +01:00
|
|
|
fragColor.r *= ssaoStrength / kernelSize;
|
|
|
|
fragColor.r = max(0.0, 1.0 - fragColor.r);
|
2016-03-15 11:29:53 +01:00
|
|
|
}
|