aboutsummaryrefslogtreecommitdiff
path: root/js/helper-classes/RDGE/src/core/script/fx/ssao.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/helper-classes/RDGE/src/core/script/fx/ssao.js')
-rw-r--r--js/helper-classes/RDGE/src/core/script/fx/ssao.js116
1 files changed, 116 insertions, 0 deletions
diff --git a/js/helper-classes/RDGE/src/core/script/fx/ssao.js b/js/helper-classes/RDGE/src/core/script/fx/ssao.js
new file mode 100644
index 00000000..05793594
--- /dev/null
+++ b/js/helper-classes/RDGE/src/core/script/fx/ssao.js
@@ -0,0 +1,116 @@
1/* <copyright>
2This file contains proprietary software owned by Motorola Mobility, Inc.<br/>
3No rights, expressed or implied, whatsoever to this software are provided by Motorola Mobility, Inc. hereunder.<br/>
4(c) Copyright 2011 Motorola Mobility, Inc. All Rights Reserved.
5</copyright> */
6
7
8/**
9 * Implements SSAO.
10 * See http://www.gamedev.net/page/resources/_/reference/programming/140/lighting-and-shading/a-simple-and-practical-approach-to-ssao-r2753
11 * @param v2ScreenSize - size of the viewport in window coordinates
12 */
13function fxSSAO(enHRDepth)
14{
15 function renderInitSSAO(quad)
16 {
17 quad.shader = createShader(gl, 'ssao_vshader', enHRDepth ? 'ssaohr_fshader' : 'ssao_fshader', [ "vert", "texcoord"]);
18 quad.renderObj = new RenderObject(quad.shader);
19
20 var quadBuf = getScreenAlignedQuad();
21 quad.vertBuffer = quadBuf.vertexObject;
22 quad.uvBuffer = quadBuf.texCoordObject;
23
24 quad.renderObj.addTexture("sColMap", 0, UNIFORMTYPE.TEXTURE2D);
25 quad.renderObj.addTexture("sNormDepthMap", 1, UNIFORMTYPE.TEXTURE2D);
26 quad.renderObj.addTexture("sRandMap", 2, UNIFORMTYPE.TEXTURE2D);
27 if (enHRDepth)
28 quad.renderObj.addTexture("sHRDepthMap", 3, UNIFORMTYPE.TEXTURE2D);
29
30 quad.renderObj.addBuffers(quad.vertBuffer, gl.ARRAY_BUFFER, 3, 0, gl.FLOAT);
31 quad.renderObj.addBuffers(quad.uvBuffer, gl.ARRAY_BUFFER, 2, 2, gl.FLOAT);
32 }
33
34 // Load random normal texture
35 this.randTexture = createTexture(gl, "assets/images/random_normal.png");
36 gl.bindTexture(gl.TEXTURE_2D, this.randTexture);
37 gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MIN_FILTER,gl.LINEAR);
38 gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_WRAP_S,gl.REPEAT);
39 gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_WRAP_T,gl.REPEAT);
40
41 // Whether or not to use a high res depth texture
42 this.enHRDepth = enHRDepth;
43
44 // Quad for full screen pass
45 this.ssaoQuad = new ScreenQuad(null);
46 this.ssaoQuad.initialize(renderInitSSAO);
47
48 // Set up uniforms
49 var activeCam = g_cameraManager.getActiveCamera();
50 this.v3FrustumFLT = activeCam.getFTR();
51 this.ssaoQuad.renderObj.addUniform("u_frustumFLT", this.v3FrustumFLT, UNIFORMTYPE.FLOAT3);
52
53 this.v4ArtVals = [1.0, 1.0, 1.0, 1.0];
54 this.ssaoQuad.renderObj.addUniform("u_artVals", this.v4ArtVals, UNIFORMTYPE.FLOAT4);
55
56 this.fRandMapSize = 64.0;
57 this.ssaoQuad.renderObj.addUniform("u_randMapSize", this.fRandMapSize, UNIFORMTYPE.FLOAT);
58
59 this.v2ScreenSize = [1024, 1024];
60 this.ssaoQuad.renderObj.addUniform("u_screenSize", this.v2ScreenSize, UNIFORMTYPE.FLOAT2);
61}
62
63/**
64 * Contributes SSAO to the passed offscreen surface, rendering to another surface.
65 * See http://www.gamedev.net/page/resources/_/reference/programming/140/lighting-and-shading/a-simple-and-practical-approach-to-ssao-r2753
66 * @param srcTexColor - color surface of rendered scene
67 * @param srcTexNormDepth - screenspace normal+depth surface for scene; {nx, ny, nz, depth}
68 * @param dstRenderTarget - where to put the result of SSAO
69 * @param sampleRadius -
70 * @param intensity -
71 * @param distScale -
72 * @param bias -
73 */
74fxSSAO.prototype.doSSAO = function(srcTexColor, srcTexNormDepth, srcTexHRDepth, dstRenderTarget, sampleRadius, intensity, distScale, bias)
75{
76 // Set art params and other uniforms
77 this.v4ArtVals[0] = sampleRadius;
78 this.v4ArtVals[1] = intensity;
79 this.v4ArtVals[2] = distScale;
80 this.v4ArtVals[3] = bias;
81
82 this.v2ScreenSize[0] = dstRenderTarget ? dstRenderTarget.frameBuffer.width : g_width;
83 this.v2ScreenSize[1] = dstRenderTarget ? dstRenderTarget.frameBuffer.height : g_height;
84
85 // Do ssao
86 gl.bindFramebuffer(gl.FRAMEBUFFER, dstRenderTarget ? dstRenderTarget.frameBuffer : null);
87 // gl.viewport(0, 0, 99999, 99999);
88 gl.clear(gl.COLOR_BUFFER_BIT);
89
90 gl.disable(gl.DEPTH_TEST);
91
92 gl.useProgram(this.ssaoQuad.shader);
93
94 this.ssaoQuad.renderObj.bindBuffers();
95 this.ssaoQuad.renderObj.bindTextures();
96 this.ssaoQuad.renderObj.bindUniforms();
97
98 gl.activeTexture(gl.TEXTURE0);
99 gl.bindTexture(gl.TEXTURE_2D, srcTexColor);
100 gl.activeTexture(gl.TEXTURE1);
101 gl.bindTexture(gl.TEXTURE_2D, srcTexNormDepth);
102 gl.activeTexture(gl.TEXTURE2);
103 gl.bindTexture(gl.TEXTURE_2D, this.randTexture);
104 if (this.enHRDepth) {
105 gl.activeTexture(gl.TEXTURE3);
106 gl.bindTexture(gl.TEXTURE_2D, srcTexHRDepth);
107 }
108 gl.activeTexture(gl.TEXTURE0);
109
110 gl.drawArrays(gl.TRIANGLES, 0, 6);
111
112 gl.enable(gl.DEPTH_TEST);
113 gl.useProgram(null);
114
115 return dstRenderTarget;
116}