|
@@ -624,48 +624,70 @@ function _getBlurShader( maxSamples ) {
|
|
|
|
|
|
vertexShader: _getCommonVertexShader(),
|
|
|
|
|
|
- fragmentShader: `
|
|
|
-precision mediump float;
|
|
|
-precision mediump int;
|
|
|
-varying vec3 vOutputDirection;
|
|
|
-uniform sampler2D envMap;
|
|
|
-uniform int samples;
|
|
|
-uniform float weights[n];
|
|
|
-uniform bool latitudinal;
|
|
|
-uniform float dTheta;
|
|
|
-uniform float mipInt;
|
|
|
-uniform vec3 poleAxis;
|
|
|
-
|
|
|
-${_getEncodings()}
|
|
|
-
|
|
|
-#define ENVMAP_TYPE_CUBE_UV
|
|
|
-#include <cube_uv_reflection_fragment>
|
|
|
-
|
|
|
-vec3 getSample(float theta, vec3 axis) {
|
|
|
- float cosTheta = cos(theta);
|
|
|
- // Rodrigues' axis-angle rotation
|
|
|
- vec3 sampleDirection = vOutputDirection * cosTheta
|
|
|
- + cross(axis, vOutputDirection) * sin(theta)
|
|
|
- + axis * dot(axis, vOutputDirection) * (1.0 - cosTheta);
|
|
|
- return bilinearCubeUV(envMap, sampleDirection, mipInt);
|
|
|
-}
|
|
|
+ fragmentShader: /* glsl */`
|
|
|
|
|
|
-void main() {
|
|
|
- vec3 axis = latitudinal ? poleAxis : cross(poleAxis, vOutputDirection);
|
|
|
- if (all(equal(axis, vec3(0.0))))
|
|
|
- axis = vec3(vOutputDirection.z, 0.0, - vOutputDirection.x);
|
|
|
- axis = normalize(axis);
|
|
|
- gl_FragColor = vec4(0.0);
|
|
|
- gl_FragColor.rgb += weights[0] * getSample(0.0, axis);
|
|
|
- for (int i = 1; i < n; i++) {
|
|
|
- if (i >= samples)
|
|
|
- break;
|
|
|
- float theta = dTheta * float(i);
|
|
|
- gl_FragColor.rgb += weights[i] * getSample(-1.0 * theta, axis);
|
|
|
- gl_FragColor.rgb += weights[i] * getSample(theta, axis);
|
|
|
- }
|
|
|
- gl_FragColor = linearToOutputTexel(gl_FragColor);
|
|
|
-}
|
|
|
+ precision mediump float;
|
|
|
+ precision mediump int;
|
|
|
+
|
|
|
+ varying vec3 vOutputDirection;
|
|
|
+
|
|
|
+ uniform sampler2D envMap;
|
|
|
+ uniform int samples;
|
|
|
+ uniform float weights[ n ];
|
|
|
+ uniform bool latitudinal;
|
|
|
+ uniform float dTheta;
|
|
|
+ uniform float mipInt;
|
|
|
+ uniform vec3 poleAxis;
|
|
|
+
|
|
|
+ ${_getEncodings()}
|
|
|
+
|
|
|
+ #define ENVMAP_TYPE_CUBE_UV
|
|
|
+ #include <cube_uv_reflection_fragment>
|
|
|
+
|
|
|
+ vec3 getSample( float theta, vec3 axis ) {
|
|
|
+
|
|
|
+ float cosTheta = cos( theta );
|
|
|
+ // Rodrigues' axis-angle rotation
|
|
|
+ vec3 sampleDirection = vOutputDirection * cosTheta
|
|
|
+ + cross( axis, vOutputDirection ) * sin( theta )
|
|
|
+ + axis * dot( axis, vOutputDirection ) * ( 1.0 - cosTheta );
|
|
|
+
|
|
|
+ return bilinearCubeUV( envMap, sampleDirection, mipInt );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ void main() {
|
|
|
+
|
|
|
+ vec3 axis = latitudinal ? poleAxis : cross( poleAxis, vOutputDirection );
|
|
|
+
|
|
|
+ if ( all( equal( axis, vec3( 0.0 ) ) ) ) {
|
|
|
+
|
|
|
+ axis = vec3( vOutputDirection.z, 0.0, - vOutputDirection.x );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ axis = normalize( axis );
|
|
|
+
|
|
|
+ gl_FragColor = vec4( 0.0 );
|
|
|
+ gl_FragColor.rgb += weights[ 0 ] * getSample( 0.0, axis );
|
|
|
+
|
|
|
+ for ( int i = 1; i < n; i++ ) {
|
|
|
+
|
|
|
+ if ( i >= samples ) {
|
|
|
+
|
|
|
+ break;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ float theta = dTheta * float( i );
|
|
|
+ gl_FragColor.rgb += weights[ i ] * getSample( -1.0 * theta, axis );
|
|
|
+ gl_FragColor.rgb += weights[ i ] * getSample( theta, axis );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ gl_FragColor = linearToOutputTexel( gl_FragColor );
|
|
|
+
|
|
|
+ }
|
|
|
`,
|
|
|
|
|
|
blending: NoBlending,
|
|
@@ -694,35 +716,44 @@ function _getEquirectShader() {
|
|
|
|
|
|
vertexShader: _getCommonVertexShader(),
|
|
|
|
|
|
- fragmentShader: `
|
|
|
-precision mediump float;
|
|
|
-precision mediump int;
|
|
|
-varying vec3 vOutputDirection;
|
|
|
-uniform sampler2D envMap;
|
|
|
-uniform vec2 texelSize;
|
|
|
-
|
|
|
-${_getEncodings()}
|
|
|
-
|
|
|
-#include <common>
|
|
|
-
|
|
|
-void main() {
|
|
|
- gl_FragColor = vec4(0.0);
|
|
|
- vec3 outputDirection = normalize(vOutputDirection);
|
|
|
- vec2 uv = equirectUv( outputDirection );
|
|
|
- vec2 f = fract(uv / texelSize - 0.5);
|
|
|
- uv -= f * texelSize;
|
|
|
- vec3 tl = envMapTexelToLinear(texture2D(envMap, uv)).rgb;
|
|
|
- uv.x += texelSize.x;
|
|
|
- vec3 tr = envMapTexelToLinear(texture2D(envMap, uv)).rgb;
|
|
|
- uv.y += texelSize.y;
|
|
|
- vec3 br = envMapTexelToLinear(texture2D(envMap, uv)).rgb;
|
|
|
- uv.x -= texelSize.x;
|
|
|
- vec3 bl = envMapTexelToLinear(texture2D(envMap, uv)).rgb;
|
|
|
- vec3 tm = mix(tl, tr, f.x);
|
|
|
- vec3 bm = mix(bl, br, f.x);
|
|
|
- gl_FragColor.rgb = mix(tm, bm, f.y);
|
|
|
- gl_FragColor = linearToOutputTexel(gl_FragColor);
|
|
|
-}
|
|
|
+ fragmentShader: /* glsl */`
|
|
|
+
|
|
|
+ precision mediump float;
|
|
|
+ precision mediump int;
|
|
|
+
|
|
|
+ varying vec3 vOutputDirection;
|
|
|
+
|
|
|
+ uniform sampler2D envMap;
|
|
|
+ uniform vec2 texelSize;
|
|
|
+
|
|
|
+ ${_getEncodings()}
|
|
|
+
|
|
|
+ #include <common>
|
|
|
+
|
|
|
+ void main() {
|
|
|
+
|
|
|
+ gl_FragColor = vec4( 0.0 );
|
|
|
+
|
|
|
+ vec3 outputDirection = normalize( vOutputDirection );
|
|
|
+ vec2 uv = equirectUv( outputDirection );
|
|
|
+
|
|
|
+ vec2 f = fract( uv / texelSize - 0.5 );
|
|
|
+ uv -= f * texelSize;
|
|
|
+ vec3 tl = envMapTexelToLinear( texture2D ( envMap, uv ) ).rgb;
|
|
|
+ uv.x += texelSize.x;
|
|
|
+ vec3 tr = envMapTexelToLinear( texture2D ( envMap, uv ) ).rgb;
|
|
|
+ uv.y += texelSize.y;
|
|
|
+ vec3 br = envMapTexelToLinear( texture2D ( envMap, uv ) ).rgb;
|
|
|
+ uv.x -= texelSize.x;
|
|
|
+ vec3 bl = envMapTexelToLinear( texture2D ( envMap, uv ) ).rgb;
|
|
|
+
|
|
|
+ vec3 tm = mix( tl, tr, f.x );
|
|
|
+ vec3 bm = mix( bl, br, f.x );
|
|
|
+ gl_FragColor.rgb = mix( tm, bm, f.y );
|
|
|
+
|
|
|
+ gl_FragColor = linearToOutputTexel( gl_FragColor );
|
|
|
+
|
|
|
+ }
|
|
|
`,
|
|
|
|
|
|
blending: NoBlending,
|
|
@@ -749,19 +780,24 @@ function _getCubemapShader() {
|
|
|
|
|
|
vertexShader: _getCommonVertexShader(),
|
|
|
|
|
|
- fragmentShader: `
|
|
|
-precision mediump float;
|
|
|
-precision mediump int;
|
|
|
-varying vec3 vOutputDirection;
|
|
|
-uniform samplerCube envMap;
|
|
|
+ fragmentShader: /* glsl */`
|
|
|
|
|
|
-${_getEncodings()}
|
|
|
+ precision mediump float;
|
|
|
+ precision mediump int;
|
|
|
|
|
|
-void main() {
|
|
|
- gl_FragColor = vec4(0.0);
|
|
|
- gl_FragColor.rgb = envMapTexelToLinear(textureCube(envMap, vec3( - vOutputDirection.x, vOutputDirection.yz ))).rgb;
|
|
|
- gl_FragColor = linearToOutputTexel(gl_FragColor);
|
|
|
-}
|
|
|
+ varying vec3 vOutputDirection;
|
|
|
+
|
|
|
+ uniform samplerCube envMap;
|
|
|
+
|
|
|
+ ${_getEncodings()}
|
|
|
+
|
|
|
+ void main() {
|
|
|
+
|
|
|
+ gl_FragColor = vec4( 0.0 );
|
|
|
+ gl_FragColor.rgb = envMapTexelToLinear( textureCube( envMap, vec3( - vOutputDirection.x, vOutputDirection.yz ) ) ).rgb;
|
|
|
+ gl_FragColor = linearToOutputTexel( gl_FragColor );
|
|
|
+
|
|
|
+ }
|
|
|
`,
|
|
|
|
|
|
blending: NoBlending,
|
|
@@ -776,92 +812,149 @@ void main() {
|
|
|
|
|
|
function _getCommonVertexShader() {
|
|
|
|
|
|
- return `
|
|
|
-precision mediump float;
|
|
|
-precision mediump int;
|
|
|
-attribute vec3 position;
|
|
|
-attribute vec2 uv;
|
|
|
-attribute float faceIndex;
|
|
|
-varying vec3 vOutputDirection;
|
|
|
-
|
|
|
-// RH coordinate system; PMREM face-indexing convention
|
|
|
-vec3 getDirection(vec2 uv, float face) {
|
|
|
- uv = 2.0 * uv - 1.0;
|
|
|
- vec3 direction = vec3(uv, 1.0);
|
|
|
- if (face == 0.0) {
|
|
|
- direction = direction.zyx; // ( 1, v, u ) pos x
|
|
|
- } else if (face == 1.0) {
|
|
|
- direction = direction.xzy;
|
|
|
- direction.xz *= -1.0; // ( -u, 1, -v ) pos y
|
|
|
- } else if (face == 2.0) {
|
|
|
- direction.x *= -1.0; // ( -u, v, 1 ) pos z
|
|
|
- } else if (face == 3.0) {
|
|
|
- direction = direction.zyx;
|
|
|
- direction.xz *= -1.0; // ( -1, v, -u ) neg x
|
|
|
- } else if (face == 4.0) {
|
|
|
- direction = direction.xzy;
|
|
|
- direction.xy *= -1.0; // ( -u, -1, v ) neg y
|
|
|
- } else if (face == 5.0) {
|
|
|
- direction.z *= -1.0; // ( u, v, -1 ) neg z
|
|
|
- }
|
|
|
- return direction;
|
|
|
-}
|
|
|
+ return /* glsl */`
|
|
|
|
|
|
-void main() {
|
|
|
- vOutputDirection = getDirection(uv, faceIndex);
|
|
|
- gl_Position = vec4( position, 1.0 );
|
|
|
-}
|
|
|
+ precision mediump float;
|
|
|
+ precision mediump int;
|
|
|
+
|
|
|
+ attribute vec3 position;
|
|
|
+ attribute vec2 uv;
|
|
|
+ attribute float faceIndex;
|
|
|
+
|
|
|
+ varying vec3 vOutputDirection;
|
|
|
+
|
|
|
+ // RH coordinate system; PMREM face-indexing convention
|
|
|
+ vec3 getDirection( vec2 uv, float face ) {
|
|
|
+
|
|
|
+ uv = 2.0 * uv - 1.0;
|
|
|
+
|
|
|
+ vec3 direction = vec3( uv, 1.0 );
|
|
|
+
|
|
|
+ if ( face == 0.0 ) {
|
|
|
+
|
|
|
+ direction = direction.zyx; // ( 1, v, u ) pos x
|
|
|
+
|
|
|
+ } else if ( face == 1.0 ) {
|
|
|
+
|
|
|
+ direction = direction.xzy;
|
|
|
+ direction.xz *= -1.0; // ( -u, 1, -v ) pos y
|
|
|
+
|
|
|
+ } else if ( face == 2.0 ) {
|
|
|
+
|
|
|
+ direction.x *= -1.0; // ( -u, v, 1 ) pos z
|
|
|
+
|
|
|
+ } else if ( face == 3.0 ) {
|
|
|
+
|
|
|
+ direction = direction.zyx;
|
|
|
+ direction.xz *= -1.0; // ( -1, v, -u ) neg x
|
|
|
+
|
|
|
+ } else if ( face == 4.0 ) {
|
|
|
+
|
|
|
+ direction = direction.xzy;
|
|
|
+ direction.xy *= -1.0; // ( -u, -1, v ) neg y
|
|
|
+
|
|
|
+ } else if ( face == 5.0 ) {
|
|
|
+
|
|
|
+ direction.z *= -1.0; // ( u, v, -1 ) neg z
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ return direction;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ void main() {
|
|
|
+
|
|
|
+ vOutputDirection = getDirection( uv, faceIndex );
|
|
|
+ gl_Position = vec4( position, 1.0 );
|
|
|
+
|
|
|
+ }
|
|
|
`;
|
|
|
|
|
|
}
|
|
|
|
|
|
function _getEncodings() {
|
|
|
|
|
|
- return `
|
|
|
-uniform int inputEncoding;
|
|
|
-uniform int outputEncoding;
|
|
|
-
|
|
|
-#include <encodings_pars_fragment>
|
|
|
-
|
|
|
-vec4 inputTexelToLinear(vec4 value){
|
|
|
- if(inputEncoding == 0){
|
|
|
- return value;
|
|
|
- }else if(inputEncoding == 1){
|
|
|
- return sRGBToLinear(value);
|
|
|
- }else if(inputEncoding == 2){
|
|
|
- return RGBEToLinear(value);
|
|
|
- }else if(inputEncoding == 3){
|
|
|
- return RGBMToLinear(value, 7.0);
|
|
|
- }else if(inputEncoding == 4){
|
|
|
- return RGBMToLinear(value, 16.0);
|
|
|
- }else if(inputEncoding == 5){
|
|
|
- return RGBDToLinear(value, 256.0);
|
|
|
- }else{
|
|
|
- return GammaToLinear(value, 2.2);
|
|
|
- }
|
|
|
-}
|
|
|
+ return /* glsl */`
|
|
|
|
|
|
-vec4 linearToOutputTexel(vec4 value){
|
|
|
- if(outputEncoding == 0){
|
|
|
- return value;
|
|
|
- }else if(outputEncoding == 1){
|
|
|
- return LinearTosRGB(value);
|
|
|
- }else if(outputEncoding == 2){
|
|
|
- return LinearToRGBE(value);
|
|
|
- }else if(outputEncoding == 3){
|
|
|
- return LinearToRGBM(value, 7.0);
|
|
|
- }else if(outputEncoding == 4){
|
|
|
- return LinearToRGBM(value, 16.0);
|
|
|
- }else if(outputEncoding == 5){
|
|
|
- return LinearToRGBD(value, 256.0);
|
|
|
- }else{
|
|
|
- return LinearToGamma(value, 2.2);
|
|
|
- }
|
|
|
-}
|
|
|
+ uniform int inputEncoding;
|
|
|
+ uniform int outputEncoding;
|
|
|
|
|
|
-vec4 envMapTexelToLinear(vec4 color) {
|
|
|
- return inputTexelToLinear(color);
|
|
|
-}
|
|
|
+ #include <encodings_pars_fragment>
|
|
|
+
|
|
|
+ vec4 inputTexelToLinear( vec4 value ) {
|
|
|
+
|
|
|
+ if( inputEncoding == 0 ) {
|
|
|
+
|
|
|
+ return value;
|
|
|
+
|
|
|
+ } else if ( inputEncoding == 1 ) {
|
|
|
+
|
|
|
+ return sRGBToLinear( value );
|
|
|
+
|
|
|
+ } else if ( inputEncoding == 2 ) {
|
|
|
+
|
|
|
+ return RGBEToLinear( value );
|
|
|
+
|
|
|
+ } else if ( inputEncoding == 3 ) {
|
|
|
+
|
|
|
+ return RGBMToLinear( value, 7.0 );
|
|
|
+
|
|
|
+ } else if ( inputEncoding == 4 ) {
|
|
|
+
|
|
|
+ return RGBMToLinear( value, 16.0 );
|
|
|
+
|
|
|
+ } else if ( inputEncoding == 5 ) {
|
|
|
+
|
|
|
+ return RGBDToLinear( value, 256.0 );
|
|
|
+
|
|
|
+ } else {
|
|
|
+
|
|
|
+ return GammaToLinear( value, 2.2 );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ vec4 linearToOutputTexel( vec4 value ){
|
|
|
+
|
|
|
+ if( outputEncoding == 0 ) {
|
|
|
+
|
|
|
+ return value;
|
|
|
+
|
|
|
+ } else if ( outputEncoding == 1 ) {
|
|
|
+
|
|
|
+ return LinearTosRGB( value );
|
|
|
+
|
|
|
+ } else if ( outputEncoding == 2 ) {
|
|
|
+
|
|
|
+ return LinearToRGBE( value );
|
|
|
+
|
|
|
+ } else if ( outputEncoding == 3 ) {
|
|
|
+
|
|
|
+ return LinearToRGBM( value, 7.0 );
|
|
|
+
|
|
|
+ } else if ( outputEncoding == 4 ) {
|
|
|
+
|
|
|
+ return LinearToRGBM( value, 16.0 );
|
|
|
+
|
|
|
+ } else if ( outputEncoding == 5 ) {
|
|
|
+
|
|
|
+ return LinearToRGBD( value, 256.0 );
|
|
|
+
|
|
|
+ } else {
|
|
|
+
|
|
|
+ return LinearToGamma( value, 2.2 );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ vec4 envMapTexelToLinear( vec4 color ) {
|
|
|
+
|
|
|
+ return inputTexelToLinear( color );
|
|
|
+
|
|
|
+ }
|
|
|
`;
|
|
|
|
|
|
}
|