diff options
author | Ehsan Akhgari <ehsan.akhgari@gmail.com> | 2012-06-21 15:38:29 -0400 |
---|---|---|
committer | Ehsan Akhgari <ehsan.akhgari@gmail.com> | 2012-06-21 15:44:17 -0400 |
commit | 55a8e9a02636154ebd99b1b030edfa970acad6bd (patch) | |
tree | 1cda15d98796b31b8c4e297ef80bd116afa94a4a /src | |
parent | 191ea8871076116854a2588b7c9ecc1309ae2985 (diff) |
Implement GL_EXP2 fog mode
Diffstat (limited to 'src')
-rw-r--r-- | src/library_gl.js | 27 |
1 files changed, 24 insertions, 3 deletions
diff --git a/src/library_gl.js b/src/library_gl.js index dd585f2d..b18f3eab 100644 --- a/src/library_gl.js +++ b/src/library_gl.js @@ -911,6 +911,7 @@ var LibraryGL = { fogEnd: 1, fogDensity: 1.0, fogColor: null, + fogMode: 0x0800, // GL_EXP fogEnabled: false, init: function() { @@ -1205,6 +1206,8 @@ var LibraryGL = { {{{ makeSetValue('params', '0', 'GLEmulation.fogEnd', 'float') }}}; } else if (pname == 0x0B62) { // GL_FOG_DENSITY {{{ makeSetValue('params', '0', 'GLEmulation.fogDensity', 'float') }}}; + } else if (pname == 0x0B65) { // GL_FOG_MODE + {{{ makeSetValue('params', '0', 'GLEmulation.fogMode', 'float') }}}; } else { glGetFloatv(pname, params); } @@ -1551,6 +1554,18 @@ var LibraryGL = { } else { this.vertexShader = Module.ctx.createShader(Module.ctx.VERTEX_SHADER); var zero = positionSize == 2 ? '0, ' : ''; + if (GLEmulation.fogEnabled) { + switch (GLEmulation.fogMode) { + case 0x0801: // GL_EXP2 + // fog = exp(-(gl_Fog.density * gl_FogFragCoord)^2) + var fogFormula = ' float fog = exp(-density * density * ecDistance * ecDistance); \n'; + break; + default: // default to GL_EXP + // fog = exp(-gl_Fog.density * gl_FogFragCoord) + var fogFormula = ' float fog = exp(-density * ecDistance); \n'; + break; + } + } Module.ctx.shaderSource(this.vertexShader, 'attribute vec' + positionSize + ' a_position; \n' + 'attribute vec2 a_texCoord0; \n' + (hasTextures ? 'varying vec2 v_texCoord; \n' : '') + @@ -1559,10 +1574,8 @@ var LibraryGL = { (GLEmulation.fogEnabled ? ( 'varying float v_fogFragCoord; \n' + 'float ffog(in float ecDistance) { \n' + - // GL_EXP implementation. TODO: implement other fog modes - // fog = exp2(-gl_Fog.density * gl_FogFragCoord * LOG2E) ' float density = float(' + GLEmulation.fogDensity + '); \n' + - ' float fog = exp2(-density * ecDistance * ' + Math.LOG2E + '); \n' + + fogFormula + ' fog = clamp(fog, 0.0, 1.0); \n' + ' return fog; \n' + '} \n' @@ -2090,6 +2103,14 @@ var LibraryGL = { GLEmulation.fogEnd = param; break; case 0x0B62: // GL_FOG_DENSITY GLEmulation.fogDensity = param; break; + case 0x0B65: // GL_FOG_MODE + switch (param) { + case 0x0801: // GL_EXP2 + GLEmulation.fogMode = param; break; + default: // default to GL_EXP + GLEmulation.fogMode = 0x0800 /* GL_EXP */; break; + } + break; } }, glFogi__deps: ['glFogf'], |