155 lines
6.0 KiB
JavaScript
Executable File
155 lines
6.0 KiB
JavaScript
Executable File
import framebuffer from '../framebuffer.js';
|
|
import sampler2D from '../sampler2D.js';
|
|
import {math, vector3, matrix4} from '../math.js';
|
|
import samplerCube from '../samplerCube.js';
|
|
import shader from '../shader.js';
|
|
|
|
|
|
class ssao {
|
|
|
|
constructor( ) {
|
|
this.realtime = true;
|
|
}
|
|
|
|
setViewport( viewport ){
|
|
|
|
this.viewport = viewport;
|
|
this.gl = viewport.gl;
|
|
}
|
|
|
|
prepare() {
|
|
|
|
this.framebuffer = new framebuffer();
|
|
this.framebuffer.width = this.viewport.width;
|
|
this.framebuffer.height = this.viewport.height;
|
|
|
|
var ambientOcclusionSampler = new sampler2D();
|
|
ambientOcclusionSampler.type = this.gl.FLOAT;
|
|
|
|
this.framebuffer.setViewport( this.viewport );
|
|
this.framebuffer.addSampler( ambientOcclusionSampler );
|
|
|
|
this.framebuffer.create();
|
|
|
|
var randomImage2 = new Uint8Array ( [149,123,253,255, 126,3,96,255, 164,246,98,255, 154,177,13,255,
|
|
52,83,220,255, 1,142,142,255, 32,57,79,255, 48,159,32,255,
|
|
56,232,114,255, 177,216,203,255, 69,196,217,255, 240,165,81,255,
|
|
224,56,85,255, 232,89,189,255, 143,25,202,255, 117,73,12,255] );
|
|
|
|
|
|
var diffuseTexture = kepler.textureFromTypedArray( randomImage2, 4, 4 );
|
|
var randomSampler = new sampler2D();
|
|
randomSampler.texture = diffuseTexture;
|
|
|
|
this.shader = new shader();
|
|
this.shader.createFromFile("shaders/ambientOcclusion.shader");
|
|
this.shader.setUniform("viewProjection", this.viewport.quad.viewProjection );
|
|
|
|
this.shader.setUniform("screenWidth", this.viewport.width );
|
|
this.shader.setUniform("screenHeight", this.viewport.height );
|
|
this.shader.setUniform("far", this.viewport.mainCamera.far );
|
|
|
|
|
|
this.shader.setUniform("randomSampler", randomSampler);
|
|
|
|
var radius = 0.1;
|
|
|
|
var scale = [ vector3.scale( new vector3(-0.556641,-0.037109,-0.654297), radius ),
|
|
vector3.scale( new vector3(0.173828,0.111328,0.064453), radius ),
|
|
vector3.scale( new vector3(0.001953,0.082031,-0.060547), radius ),
|
|
vector3.scale( new vector3(0.220703,-0.359375,-0.062500), radius ),
|
|
vector3.scale( new vector3(0.242188,0.126953,-0.250000), radius ),
|
|
vector3.scale( new vector3(0.070313,-0.025391,0.148438), radius ),
|
|
vector3.scale( new vector3(-0.078125,0.013672,-0.314453), radius ),
|
|
vector3.scale( new vector3(0.117188,-0.140625,-0.199219), radius ),
|
|
vector3.scale( new vector3(-0.251953,-0.558594,0.082031), radius ),
|
|
vector3.scale( new vector3(0.308594,0.193359,0.324219), radius ),
|
|
vector3.scale( new vector3(0.173828,-0.140625,0.031250), radius ),
|
|
vector3.scale( new vector3(0.179688,-0.044922,0.046875), radius ),
|
|
vector3.scale( new vector3(-0.146484,-0.201172,-0.029297), radius ),
|
|
vector3.scale( new vector3(-0.300781,0.234375,0.539063), radius ),
|
|
vector3.scale( new vector3(0.228516,0.154297,-0.119141), radius ),
|
|
vector3.scale( new vector3(-0.119141,-0.003906,-0.066406), radius ),
|
|
vector3.scale( new vector3(-0.218750,0.214844,-0.250000), radius ),
|
|
vector3.scale( new vector3(0.113281,-0.091797,0.212891), radius ),
|
|
vector3.scale( new vector3(0.105469,-0.039063,-0.019531), radius ),
|
|
vector3.scale( new vector3(-0.705078,-0.060547,0.023438), radius ),
|
|
vector3.scale( new vector3(0.021484,0.326172,0.115234), radius ),
|
|
vector3.scale( new vector3(0.353516,0.208984,-0.294922), radius ),
|
|
vector3.scale( new vector3(-0.029297,-0.259766,0.089844), radius ),
|
|
vector3.scale( new vector3(-0.240234,0.146484,-0.068359), radius ),
|
|
vector3.scale( new vector3(-0.296875,0.410156,-0.291016), radius ),
|
|
vector3.scale( new vector3(0.078125,0.113281,-0.126953), radius ),
|
|
vector3.scale( new vector3(-0.152344,-0.019531,0.142578), radius ),
|
|
vector3.scale( new vector3(-0.214844,-0.175781,0.191406), radius ),
|
|
vector3.scale( new vector3(0.134766,0.414063,-0.707031), radius ),
|
|
vector3.scale( new vector3(0.291016,-0.833984,-0.183594), radius ),
|
|
vector3.scale( new vector3(-0.058594,-0.111328,0.457031), radius ),
|
|
vector3.scale( new vector3(-0.115234,-0.287109,-0.259766), radius ) ];
|
|
|
|
var kernelRad = [[1.163003/radius,4.624262/radius,9.806342/radius,2.345541/radius],
|
|
[2.699039/radius,6.016871/radius,3.083554/radius,3.696197/radius],
|
|
[1.617461/radius,2.050939/radius,4.429457/radius,5.234036/radius],
|
|
[3.990876/radius,1.514475/radius,3.329241/radius,7.328508/radius],
|
|
[2.527725/radius,3.875453/radius,8.760140/radius,1.412308/radius],
|
|
[2.885205/radius,1.977866/radius,3.617674/radius,3.453552/radius],
|
|
[1.712336/radius,5.341163/radius,4.771728/radius,2.965737/radius],
|
|
[1.204293/radius,1.108428/radius,2.109570/radius,2.475453/radius] ];
|
|
|
|
|
|
//this.shader.setUniform("scale", scale );
|
|
//this.shader.setUniform("kernelRad", kernelRad );
|
|
|
|
//this.shader.setUniform("kernel", scale );
|
|
//this.shader.setUniform("kernelRad", kernelRad );
|
|
|
|
this.shader.setUniform("far", this.viewport.mainCamera.far );
|
|
console.log("this.viewport.mainCamera.far", this.viewport.mainCamera.far);
|
|
//this.shader.setUniform("positionSampler", this.infoSampler );
|
|
//this.shader.setUniform("positionSampler", this.infoSampler );
|
|
|
|
|
|
|
|
// ssaoConvolutionFinalSampler );
|
|
|
|
var ssaoKernel = [];
|
|
for (var i = 0; i < 64; ++i)
|
|
{
|
|
var sample = [
|
|
Math.random() * 2.0 - 1.0,
|
|
Math.random() * 2.0 - 1.0,
|
|
Math.random()
|
|
];
|
|
|
|
sample = vector3.normalize(sample);
|
|
sample *= Math.random();
|
|
|
|
scale = i / 64.0;
|
|
|
|
ssaoKernel.push(sample);
|
|
}
|
|
|
|
this.shader.setUniform("samples", ssaoKernel );
|
|
|
|
|
|
this.shader.setUniform("parameters", [0.6, 0.075, 1.0, 1.0] );
|
|
}
|
|
|
|
|
|
render() {
|
|
|
|
if(this.renderToViewport)
|
|
this.gl.bindFramebuffer(this.gl.FRAMEBUFFER, null );
|
|
else
|
|
this.gl.bindFramebuffer(this.gl.FRAMEBUFFER, this.framebuffer.glFramebuffer );
|
|
|
|
this.gl.clear(this.gl.COLOR_BUFFER_BIT | this.gl.DEPTH_BUFFER_BIT);
|
|
this.gl.clearColor( 0, 0, 0, 1 );
|
|
this.gl.viewport(0, 0, this.viewport.width, this.viewport.height);
|
|
|
|
this.viewport.quad.draw( this.shader, null );
|
|
|
|
}
|
|
}
|
|
|
|
export {ssao as default}; |