/**
* Stereographic projection shader
* based on http://notlion.github.io/streetview-stereographic
* @author pchen66
*/
PANOLENS.StereographicShader = {
uniforms: {
"tDiffuse": { value: new THREE.Texture() },
"resolution": { value: 1.0 },
"transform": { value: new THREE.Matrix4() },
"zoom": { value: 1.0 }
},
vertexShader: [
"varying vec2 vUv;",
"void main() {",
"vUv = uv;",
"gl_Position = vec4( position, 1.0 );",
"}"
].join( "\n" ),
fragmentShader: [
"uniform sampler2D tDiffuse;",
"uniform float resolution;",
"uniform mat4 transform;",
"uniform float zoom;",
"varying vec2 vUv;",
"const float PI = 3.141592653589793;",
"void main(){",
"vec2 position = -1.0 + 2.0 * vUv;",
"position *= vec2( zoom * resolution, zoom * 0.5 );",
"float x2y2 = position.x * position.x + position.y * position.y;",
"vec3 sphere_pnt = vec3( 2. * position, x2y2 - 1. ) / ( x2y2 + 1. );",
"sphere_pnt = vec3( transform * vec4( sphere_pnt, 1.0 ) );",
"vec2 sampleUV = vec2(",
"(atan(sphere_pnt.y, sphere_pnt.x) / PI + 1.0) * 0.5,",
"(asin(sphere_pnt.z) / PI + 0.5)",
");",
"gl_FragColor = texture2D( tDiffuse, sampleUV );",
"}"
].join( "\n" )
};