Lens flare with occlusion testing.

This commit is contained in:
Lubos Lenco 2016-04-03 23:25:53 +02:00
parent 36bd1f4cfa
commit 358693f375
7 changed files with 132 additions and 55 deletions

BIN
Assets/checker.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

View file

@ -21,6 +21,11 @@ class Root {
Eg.addNodeTrait(sceneNode, physics);
App.requestRender(render);
// untyped loadScript('hdrload.js', null);
// var hdrbin = kha.Assets.blobs.test_hdr.bytes.getData();
// var hdrimage:Dynamic = null;
// untyped __js__("hdrimage = parseHdr(hdrbin);");
}
function render(g:kha.graphics4.Graphics) {

View file

@ -12,7 +12,8 @@ in vec2 texCoord;
// const float weight[5] = float[] (0.227027, 0.1945946, 0.1216216, 0.054054, 0.016216);
void main() {
vec2 step = dir / vec2(400, 300);
// vec2 step = dir / vec2(400, 300);
vec2 step = dir / vec2(960, 540);
// vec2 step = dir / vec2(800, 600);
// vec3 result = texture(tex, texCoord).rgb * weight[0];

View file

@ -10,26 +10,34 @@ uniform sampler2D gbuffer1;
uniform sampler2D gbuffer2;
uniform vec3 eye;
uniform vec3 light;
uniform mat4 V;
uniform mat4 P;
in vec2 texCoord;
const float focus_depth = 0.5;
const float vignout = 1.6; // vignetting outer border
const float vignout = 1.8; // vignetting outer border
const float vignin = 0.0; // vignetting inner border
const float vignfade = 90.0; // f-stops till vignete fades
const float fstop = 20; // f-stop value
// const vec3 fogColor = vec3(0.5, 0.6, 0.7);
const float aspectRatio = 800.0 / 600.0;
const vec3 fogColor = vec3(0.5, 0.6, 0.7);
// const float b = 0.01;
// const float c = 0.1;
const float b = 1.0;
const float c = 1.0;
// vec3 applyFog(vec3 rgb, // original color of the pixel
// float distance, // camera to point distance
// vec3 rayOri, // camera position
// vec3 rayDir) { // camera to point vector
// float fogAmount = c * exp(-rayOri.y * b) * (1.0 - exp(-distance * rayDir.y * b)) / rayDir.y;
// return mix(rgb, fogColor, fogAmount);
// }
vec3 applyFog(vec3 rgb, // original color of the pixel
float distance, // camera to point distance
vec3 rayOri, // camera position
vec3 rayDir) { // camera to point vector
float fogAmount = c * exp(-rayOri.y * b) * (1.0 - exp(-distance * rayDir.y * b)) / rayDir.y;
return mix(rgb, fogColor, fogAmount);
}
// vec3 applyFog(vec3 rgb, // original color of the pixel
// float distance) { // camera to point distance
// float fogAmount = 1.0 - exp(-distance * b);
@ -56,7 +64,42 @@ vec4 sampleBox(float size) {
return color;
}
float linearize(float depth, float znear, float zfar) {
return -zfar * znear / (depth * (zfar - znear) - zfar);
}
// Based on lense flare implementation by musk
// https://www.shadertoy.com/view/4sX3Rs
vec3 lensflare(vec2 uv, vec2 pos) {
vec2 uvd = uv * (length(uv));
float f2 = max(1.0/(1.0+32.0*pow(length(uvd+0.8*pos),2.0)),0.0)*0.25;
float f22 = max(1.0/(1.0+32.0*pow(length(uvd+0.85*pos),2.0)),0.0)*0.23;
float f23 = max(1.0/(1.0+32.0*pow(length(uvd+0.9*pos),2.0)),0.0)*0.21;
vec2 uvx = mix(uv, uvd, -0.5);
float f4 = max(0.01-pow(length(uvx+0.4*pos),2.4),0.0)*6.0;
float f42 = max(0.01-pow(length(uvx+0.45*pos),2.4),0.0)*5.0;
float f43 = max(0.01-pow(length(uvx+0.5*pos),2.4),0.0)*3.0;
uvx = mix(uv, uvd, -0.4);
float f5 = max(0.01-pow(length(uvx+0.2*pos),5.5),0.0)*2.0;
float f52 = max(0.01-pow(length(uvx+0.4*pos),5.5),0.0)*2.0;
float f53 = max(0.01-pow(length(uvx+0.6*pos),5.5),0.0)*2.0;
uvx = mix(uv, uvd, -0.5);
float f6 = max(0.01-pow(length(uvx-0.3*pos),1.6),0.0)*6.0;
float f62 = max(0.01-pow(length(uvx-0.325*pos),1.6),0.0)*3.0;
float f63 = max(0.01-pow(length(uvx-0.35*pos),1.6),0.0)*5.0;
vec3 c = vec3(0.0);
c.r += f2 + f4 + f5 + f6;
c.g += f22 + f42 + f52 + f62;
c.b += f23 + f43 + f53 + f63;
return c;
}
void main() {
// Blur
float depth = texture(gbuffer0, texCoord).a;
float blur_amount = abs(depth - focus_depth);
if (depth < depth - focus_depth) {
@ -77,6 +120,21 @@ void main() {
// col.rgb = applyFog(col.rgb, dist, eye, dir);
// col.rgb = applyFog(col.rgb, dist);
// Lens flare
// vec4 lndc = P * V * vec4(light, 1.0);
// lndc.xy /= lndc.w;
// float lightDistance = distance(eye, light);
// vec2 lss = lndc.xy * 0.5 + 0.5;
// float lssdepth = linearize(texture(gbuffer0, lss).a, 0.1, 1000.0);
// if (lssdepth >= lightDistance) {
// vec2 lensuv = (texCoord - 0.5) * 2.0;
// lensuv.x *= aspectRatio;
// vec3 lensflarecol = vec3(1.4, 1.2, 1.0) * lensflare(lensuv, lndc.xy);
// col.rgb += lensflarecol;
// }
// Vignetting
col *= vignette();

View file

@ -52,6 +52,18 @@
{
"id": "eye",
"link": "_cameraPosition"
},
{
"id": "light",
"link": "_lightPosition"
},
{
"id": "V",
"link": "_viewMatrix"
},
{
"id": "P",
"link": "_projectionMatrix"
}
],
"texture_params": [],

View file

@ -12,60 +12,60 @@ in vec2 pos;
out vec3 normal;
// out vec2 texCoord;
mat3 transpose_(mat3 m) {
return mat3(m[0][0], m[1][0], m[2][0],
m[0][1], m[1][1], m[2][1],
m[0][2], m[1][2], m[2][2]);
}
// mat3 transpose_(mat3 m) {
// return mat3(m[0][0], m[1][0], m[2][0],
// m[0][1], m[1][1], m[2][1],
// m[0][2], m[1][2], m[2][2]);
// }
mat4 inverse_(mat4 m) {
float
a00 = m[0][0], a01 = m[0][1], a02 = m[0][2], a03 = m[0][3],
a10 = m[1][0], a11 = m[1][1], a12 = m[1][2], a13 = m[1][3],
a20 = m[2][0], a21 = m[2][1], a22 = m[2][2], a23 = m[2][3],
a30 = m[3][0], a31 = m[3][1], a32 = m[3][2], a33 = m[3][3],
// mat4 inverse_(mat4 m) {
// float
// a00 = m[0][0], a01 = m[0][1], a02 = m[0][2], a03 = m[0][3],
// a10 = m[1][0], a11 = m[1][1], a12 = m[1][2], a13 = m[1][3],
// a20 = m[2][0], a21 = m[2][1], a22 = m[2][2], a23 = m[2][3],
// a30 = m[3][0], a31 = m[3][1], a32 = m[3][2], a33 = m[3][3],
b00 = a00 * a11 - a01 * a10,
b01 = a00 * a12 - a02 * a10,
b02 = a00 * a13 - a03 * a10,
b03 = a01 * a12 - a02 * a11,
b04 = a01 * a13 - a03 * a11,
b05 = a02 * a13 - a03 * a12,
b06 = a20 * a31 - a21 * a30,
b07 = a20 * a32 - a22 * a30,
b08 = a20 * a33 - a23 * a30,
b09 = a21 * a32 - a22 * a31,
b10 = a21 * a33 - a23 * a31,
b11 = a22 * a33 - a23 * a32,
// b00 = a00 * a11 - a01 * a10,
// b01 = a00 * a12 - a02 * a10,
// b02 = a00 * a13 - a03 * a10,
// b03 = a01 * a12 - a02 * a11,
// b04 = a01 * a13 - a03 * a11,
// b05 = a02 * a13 - a03 * a12,
// b06 = a20 * a31 - a21 * a30,
// b07 = a20 * a32 - a22 * a30,
// b08 = a20 * a33 - a23 * a30,
// b09 = a21 * a32 - a22 * a31,
// b10 = a21 * a33 - a23 * a31,
// b11 = a22 * a33 - a23 * a32,
det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;
// det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;
return mat4(
a11 * b11 - a12 * b10 + a13 * b09,
a02 * b10 - a01 * b11 - a03 * b09,
a31 * b05 - a32 * b04 + a33 * b03,
a22 * b04 - a21 * b05 - a23 * b03,
a12 * b08 - a10 * b11 - a13 * b07,
a00 * b11 - a02 * b08 + a03 * b07,
a32 * b02 - a30 * b05 - a33 * b01,
a20 * b05 - a22 * b02 + a23 * b01,
a10 * b10 - a11 * b08 + a13 * b06,
a01 * b08 - a00 * b10 - a03 * b06,
a30 * b04 - a31 * b02 + a33 * b00,
a21 * b02 - a20 * b04 - a23 * b00,
a11 * b07 - a10 * b09 - a12 * b06,
a00 * b09 - a01 * b07 + a02 * b06,
a31 * b01 - a30 * b03 - a32 * b00,
a20 * b03 - a21 * b01 + a22 * b00) / det;
}
// return mat4(
// a11 * b11 - a12 * b10 + a13 * b09,
// a02 * b10 - a01 * b11 - a03 * b09,
// a31 * b05 - a32 * b04 + a33 * b03,
// a22 * b04 - a21 * b05 - a23 * b03,
// a12 * b08 - a10 * b11 - a13 * b07,
// a00 * b11 - a02 * b08 + a03 * b07,
// a32 * b02 - a30 * b05 - a33 * b01,
// a20 * b05 - a22 * b02 + a23 * b01,
// a10 * b10 - a11 * b08 + a13 * b06,
// a01 * b08 - a00 * b10 - a03 * b06,
// a30 * b04 - a31 * b02 + a33 * b00,
// a21 * b02 - a20 * b04 - a23 * b00,
// a11 * b07 - a10 * b09 - a12 * b06,
// a00 * b09 - a01 * b07 + a02 * b06,
// a31 * b01 - a30 * b03 - a32 * b00,
// a20 * b03 - a21 * b01 + a22 * b00) / det;
// }
// const vec2 madd = vec2(0.5, 0.5);
void main() {
mat4 invP = inverse_(P);
mat4 invP = inverse(P);
// mat4 invP = inverse(P);
mat3 invMV = transpose_(mat3(V));
mat3 invMV = transpose(mat3(V));
vec4 p = vec4(pos.xy, 0.0, 1.0);
vec3 unprojected = (invP * p).xyz;

View file

@ -28,7 +28,8 @@ uniform sampler2D gbuffer2;
uniform sampler2D snoise;
const float PI = 3.1415926535;
const vec2 screenSize = vec2(800.0, 600.0);
// const vec2 screenSize = vec2(800.0, 600.0);
const vec2 screenSize = vec2(1920.0, 1080.0);
const float aoSize = 0.6;//0.43;
const int kernelSize = 8;
const float strength = 0.8;//0.55;