提交 6999732f 编写于 作者: B Ben Houston

adopt common.glsl shader utilities across all shaders where applicable. Fix...

adopt common.glsl shader utilities across all shaders where applicable.  Fix vec*matrix bug in envmap_fragment.glsl
上级 d1ae0510
......@@ -2,7 +2,7 @@
#ifdef GAMMA_INPUT
vColor = color * color;
vColor = square( color );
#else
......
#define PI 3.14159
#define PI2 6.28318
#define RECIPROCAL_PI2 0.15915494
#define LOG2 1.442695
#define EPSILON 1e-6
float square( in float a ) { return a*a; }
vec2 square( in vec2 a ) { return vec2( a.x*a.x, a.y*a.y ); }
vec3 square( in vec3 a ) { return vec3( a.x*a.x, a.y*a.y, a.z*a.z ); }
vec4 square( in vec4 a ) { return vec4( a.x*a.x, a.y*a.y, a.z*a.z, a.w*a.w ); }
float saturate( in float a ) { return clamp( a, 0.0, 1.0 ); }
vec2 saturate( in vec2 a ) { return clamp( a, 0.0, 1.0 ); }
vec3 saturate( in vec3 a ) { return clamp( a, 0.0, 1.0 ); }
vec4 saturate( in vec4 a ) { return clamp( a, 0.0, 1.0 ); }
float average( in float a ) { return a; }
float average( in vec2 a ) { return ( a.x + a.y) * 0.5; }
float average( in vec3 a ) { return ( a.x + a.y + a.z) * 0.3333333333; }
float average( in vec4 a ) { return ( a.x + a.y + a.z + a.w) * 0.25; }
float whiteCompliment( in float a ) { return saturate( 1.0 - a ); }
vec2 whiteCompliment( in vec2 a ) { return saturate( vec2(1.0) - a ); }
vec3 whiteCompliment( in vec3 a ) { return saturate( vec3(1.0) - a ); }
vec4 whiteCompliment( in vec4 a ) { return saturate( vec4(1.0) - a ); }
vec3 transformNormal( in vec3 normal, in mat4 matrix ) {
return normalize( ( viewMatrix * vec4( normal, 0.0 ) ).xyz );
}
vec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal) {
float distance = dot( planeNormal, point-pointOnPlane );
return point - distance * planeNormal;
}
float sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {
return sign( dot( point - pointOnPlane, planeNormal ) );
}
vec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {
return pointOnLine + lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) );
}
\ No newline at end of file
......@@ -7,7 +7,7 @@
// http://en.wikibooks.org/wiki/GLSL_Programming/Applying_Matrix_Transformations
// Transforming Normal Vectors with the Inverse Transformation
vec3 worldNormal = normalize( vec3( vec4( normal, 0.0 ) * viewMatrix ) );
vec3 worldNormal = transformNormal( normal, viewMatrix );
#ifdef ENVMAP_MODE_REFLECTION
......@@ -36,12 +36,12 @@
#elif defined( ENVMAP_TYPE_EQUIREC )
vec2 sampleUV;
sampleUV.y = clamp( flipNormal * reflectVec.y * 0.5 + 0.5, 0.0, 1.0);
sampleUV.x = atan( flipNormal * reflectVec.z, flipNormal * reflectVec.x ) * 0.15915494309189533576888376337251 + 0.5; // reciprocal( 2 PI ) + 0.5
sampleUV.y = saturate( flipNormal * reflectVec.y * 0.5 + 0.5 );
sampleUV.x = atan( flipNormal * reflectVec.z, flipNormal * reflectVec.x ) * RECIPROCAL_2PI + 0.5;
vec4 envColor = texture2D( envMap, sampleUV );
#elif defined( ENVMAP_TYPE_SPHERE )
vec3 reflectView = flipNormal * normalize((viewMatrix * vec4( reflectVec, 0.0 )).xyz + vec3(0.0,0.0,1.0));
vec3 reflectView = flipNormal * ( transformNormal( reflectVec, viewMatrix ) + vec3(0.0,0.0,1.0) );
vec4 envColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5 );
#endif
......
#if defined( USE_ENVMAP ) && ! defined( USE_BUMPMAP ) && ! defined( USE_NORMALMAP ) && ! defined( PHONG )
vec3 worldNormal = mat3( modelMatrix[ 0 ].xyz, modelMatrix[ 1 ].xyz, modelMatrix[ 2 ].xyz ) * objectNormal;
worldNormal = normalize( worldNormal );
vec3 worldNormal = transformNormal( objectNormal, modelMatrix );
vec3 cameraToVertex = normalize( worldPosition.xyz - cameraPosition );
......
......@@ -12,9 +12,8 @@
#ifdef FOG_EXP2
const float LOG2 = 1.442695;
float fogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );
fogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );
float fogFactor = exp2( - square( fogDensity ) * square( depth ) * LOG2 );
fogFactor = whiteCompliment( fogFactor );
#else
......
......@@ -12,8 +12,7 @@ transformedNormal = normalize( transformedNormal );
for( int i = 0; i < MAX_DIR_LIGHTS; i ++ ) {
vec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );
vec3 dirVector = normalize( lDirection.xyz );
vec3 dirVector = transformNormal( directionalLightDirection[ i ], viewMatrix );
float dotProduct = dot( transformedNormal, dirVector );
vec3 directionalLightWeighting = vec3( max( dotProduct, 0.0 ) );
......@@ -173,8 +172,7 @@ for( int i = 0; i < MAX_DIR_LIGHTS; i ++ ) {
for( int i = 0; i < MAX_HEMI_LIGHTS; i ++ ) {
vec4 lDirection = viewMatrix * vec4( hemisphereLightDirection[ i ], 0.0 );
vec3 lVector = normalize( lDirection.xyz );
vec3 lVector = transformNormal( hemisphereLightDirection[ i ], viewMatrix );
float dotProduct = dot( transformedNormal, lVector );
......
......@@ -29,7 +29,7 @@ vec3 viewPosition = normalize( vViewPosition );
float lDistance = 1.0;
if ( pointLightDistance[ i ] > 0.0 )
lDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );
lDistance = saturate( 1.0 - ( length( lVector ) / pointLightDistance[ i ] ) );
lVector = normalize( lVector );
......@@ -79,7 +79,7 @@ vec3 viewPosition = normalize( vViewPosition );
float lDistance = 1.0;
if ( spotLightDistance[ i ] > 0.0 )
lDistance = 1.0 - min( ( length( lVector ) / spotLightDistance[ i ] ), 1.0 );
lDistance = saturate( 1.0 - ( length( lVector ) / spotLightDistance[ i ] );
lVector = normalize( lVector );
......@@ -132,8 +132,7 @@ vec3 viewPosition = normalize( vViewPosition );
for( int i = 0; i < MAX_DIR_LIGHTS; i ++ ) {
vec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );
vec3 dirVector = normalize( lDirection.xyz );
vec3 dirVector = transformNormal( directionalLightDirection[ i ], viewMatrix );
// diffuse
......@@ -198,8 +197,7 @@ vec3 viewPosition = normalize( vViewPosition );
for( int i = 0; i < MAX_HEMI_LIGHTS; i ++ ) {
vec4 lDirection = viewMatrix * vec4( hemisphereLightDirection[ i ], 0.0 );
vec3 lVector = normalize( lDirection.xyz );
vec3 lVector = transformNormal( hemisphereLightDirection[ i ], viewMatrix );
// diffuse
......
#ifdef USE_LOGDEPTHBUF
gl_Position.z = log2(max(1e-6, gl_Position.w + 1.0)) * logDepthBufFC;
gl_Position.z = log2(max( EPSILON, gl_Position.w + 1.0 )) * logDepthBufFC;
#ifdef USE_LOGDEPTHBUF_EXT
......
......@@ -21,6 +21,7 @@ THREE.ShaderLib = {
vertexShader: [
THREE.ShaderChunk[ "common" ],
THREE.ShaderChunk[ "map_pars_vertex" ],
THREE.ShaderChunk[ "lightmap_pars_vertex" ],
THREE.ShaderChunk[ "envmap_pars_vertex" ],
......@@ -63,6 +64,7 @@ THREE.ShaderLib = {
"uniform vec3 diffuse;",
"uniform float opacity;",
THREE.ShaderChunk[ "common" ],
THREE.ShaderChunk[ "color_pars_fragment" ],
THREE.ShaderChunk[ "map_pars_fragment" ],
THREE.ShaderChunk[ "alphamap_pars_fragment" ],
......@@ -126,6 +128,7 @@ THREE.ShaderLib = {
"#endif",
THREE.ShaderChunk[ "common" ],
THREE.ShaderChunk[ "map_pars_vertex" ],
THREE.ShaderChunk[ "lightmap_pars_vertex" ],
THREE.ShaderChunk[ "envmap_pars_vertex" ],
......@@ -173,6 +176,7 @@ THREE.ShaderLib = {
"#endif",
THREE.ShaderChunk[ "common" ],
THREE.ShaderChunk[ "color_pars_fragment" ],
THREE.ShaderChunk[ "map_pars_fragment" ],
THREE.ShaderChunk[ "alphamap_pars_fragment" ],
......@@ -252,6 +256,7 @@ THREE.ShaderLib = {
"varying vec3 vViewPosition;",
"varying vec3 vNormal;",
THREE.ShaderChunk[ "common" ],
THREE.ShaderChunk[ "map_pars_vertex" ],
THREE.ShaderChunk[ "lightmap_pars_vertex" ],
THREE.ShaderChunk[ "envmap_pars_vertex" ],
......@@ -303,6 +308,7 @@ THREE.ShaderLib = {
"uniform vec3 specular;",
"uniform float shininess;",
THREE.ShaderChunk[ "common" ],
THREE.ShaderChunk[ "color_pars_fragment" ],
THREE.ShaderChunk[ "map_pars_fragment" ],
THREE.ShaderChunk[ "alphamap_pars_fragment" ],
......@@ -357,6 +363,7 @@ THREE.ShaderLib = {
"uniform float size;",
"uniform float scale;",
THREE.ShaderChunk[ "common" ],
THREE.ShaderChunk[ "color_pars_vertex" ],
THREE.ShaderChunk[ "shadowmap_pars_vertex" ],
THREE.ShaderChunk[ "logdepthbuf_pars_vertex" ],
......@@ -388,6 +395,7 @@ THREE.ShaderLib = {
"uniform vec3 psColor;",
"uniform float opacity;",
THREE.ShaderChunk[ "common" ],
THREE.ShaderChunk[ "color_pars_fragment" ],
THREE.ShaderChunk[ "map_particle_pars_fragment" ],
THREE.ShaderChunk[ "fog_pars_fragment" ],
......@@ -433,6 +441,7 @@ THREE.ShaderLib = {
"varying float vLineDistance;",
THREE.ShaderChunk[ "common" ],
THREE.ShaderChunk[ "color_pars_vertex" ],
THREE.ShaderChunk[ "logdepthbuf_pars_vertex" ],
......@@ -461,6 +470,7 @@ THREE.ShaderLib = {
"varying float vLineDistance;",
THREE.ShaderChunk[ "common" ],
THREE.ShaderChunk[ "color_pars_fragment" ],
THREE.ShaderChunk[ "fog_pars_fragment" ],
THREE.ShaderChunk[ "logdepthbuf_pars_fragment" ],
......@@ -497,6 +507,7 @@ THREE.ShaderLib = {
vertexShader: [
THREE.ShaderChunk[ "common" ],
THREE.ShaderChunk[ "morphtarget_pars_vertex" ],
THREE.ShaderChunk[ "logdepthbuf_pars_vertex" ],
......@@ -516,6 +527,7 @@ THREE.ShaderLib = {
"uniform float mFar;",
"uniform float opacity;",
THREE.ShaderChunk[ "common" ],
THREE.ShaderChunk[ "logdepthbuf_pars_fragment" ],
"void main() {",
......@@ -553,6 +565,7 @@ THREE.ShaderLib = {
"varying vec3 vNormal;",
THREE.ShaderChunk[ "common" ],
THREE.ShaderChunk[ "morphtarget_pars_vertex" ],
THREE.ShaderChunk[ "logdepthbuf_pars_vertex" ],
......@@ -573,6 +586,7 @@ THREE.ShaderLib = {
"uniform float opacity;",
"varying vec3 vNormal;",
THREE.ShaderChunk[ "common" ],
THREE.ShaderChunk[ "logdepthbuf_pars_fragment" ],
"void main() {",
......@@ -642,6 +656,7 @@ THREE.ShaderLib = {
fragmentShader: [
"uniform vec3 ambient;",
"uniform vec3 diffuse;",
"uniform vec3 specular;",
......@@ -672,6 +687,8 @@ THREE.ShaderLib = {
"uniform vec3 ambientLightColor;",
THREE.ShaderChunk[ "common" ],
"#if MAX_DIR_LIGHTS > 0",
" uniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];",
......@@ -898,8 +915,7 @@ THREE.ShaderLib = {
" for( int i = 0; i < MAX_DIR_LIGHTS; i++ ) {",
" vec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );",
" vec3 dirVector = normalize( lDirection.xyz );",
" vec3 dirVector = transformNormal( directionalLightDirection[ i ], viewMatrix );",
// diffuse
......@@ -942,8 +958,7 @@ THREE.ShaderLib = {
" for( int i = 0; i < MAX_HEMI_LIGHTS; i ++ ) {",
" vec4 lDirection = viewMatrix * vec4( hemisphereLightDirection[ i ], 0.0 );",
" vec3 lVector = normalize( lDirection.xyz );",
" vec3 lVector = transformNormal( hemisphereLightDirection[ i ], viewMatrix );",
// diffuse
......@@ -1083,6 +1098,7 @@ THREE.ShaderLib = {
"varying vec3 vWorldPosition;",
"varying vec3 vViewPosition;",
THREE.ShaderChunk[ "common" ],
THREE.ShaderChunk[ "skinning_pars_vertex" ],
THREE.ShaderChunk[ "shadowmap_pars_vertex" ],
THREE.ShaderChunk[ "logdepthbuf_pars_vertex" ],
......@@ -1215,12 +1231,12 @@ THREE.ShaderLib = {
"varying vec3 vWorldPosition;",
THREE.ShaderChunk[ "common" ],
THREE.ShaderChunk[ "logdepthbuf_pars_vertex" ],
"void main() {",
" vec4 worldPosition = modelMatrix * vec4( position, 1.0 );",
" vWorldPosition = worldPosition.xyz;",
" vec4 worldPosition = transformNormal( position, modelMatrix );",
" gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
......@@ -1237,6 +1253,7 @@ THREE.ShaderLib = {
"varying vec3 vWorldPosition;",
THREE.ShaderChunk[ "common" ],
THREE.ShaderChunk[ "logdepthbuf_pars_fragment" ],
"void main() {",
......@@ -1264,12 +1281,12 @@ THREE.ShaderLib = {
"varying vec3 vWorldPosition;",
THREE.ShaderChunk[ "common" ],
THREE.ShaderChunk[ "logdepthbuf_pars_vertex" ],
"void main() {",
" vec4 worldPosition = modelMatrix * vec4( position, 1.0 );",
" vWorldPosition = worldPosition.xyz;",
" vec4 worldPosition = transformNormal( position, modelMatrix );",
" gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
......@@ -1286,6 +1303,7 @@ THREE.ShaderLib = {
"varying vec3 vWorldPosition;",
THREE.ShaderChunk[ "common" ],
THREE.ShaderChunk[ "logdepthbuf_pars_fragment" ],
"void main() {",
......@@ -1293,8 +1311,8 @@ THREE.ShaderLib = {
// " gl_FragColor = textureCube( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );",
"vec3 direction = normalize( vWorldPosition );",
"vec2 sampleUV;",
"sampleUV.y = clamp( tFlip * direction.y * -0.5 + 0.5, 0.0, 1.0);",
"sampleUV.x = atan( direction.z, direction.x ) * 0.15915494309189533576888376337251 + 0.5;", // reciprocal( 2 PI ) + 0.5
"sampleUV.y = saturate( tFlip * direction.y * -0.5 + 0.5 );",
"sampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_2PI + 0.5;",
"gl_FragColor = texture2D( tEquirect, sampleUV );",
THREE.ShaderChunk[ "logdepthbuf_fragment" ],
......@@ -1323,6 +1341,7 @@ THREE.ShaderLib = {
vertexShader: [
THREE.ShaderChunk[ "common" ],
THREE.ShaderChunk[ "morphtarget_pars_vertex" ],
THREE.ShaderChunk[ "skinning_pars_vertex" ],
THREE.ShaderChunk[ "logdepthbuf_pars_vertex" ],
......@@ -1341,6 +1360,7 @@ THREE.ShaderLib = {
fragmentShader: [
THREE.ShaderChunk[ "common" ],
THREE.ShaderChunk[ "logdepthbuf_pars_fragment" ],
"vec4 pack_depth( const in float depth ) {",
......
......@@ -83,6 +83,7 @@
"src/scenes/Fog.js",
"src/scenes/FogExp2.js",
"src/renderers/shaders/ShaderChunk.js",
"src/renderers/shaders/ShaderChunk/common.glsl",
"src/renderers/shaders/ShaderChunk/alphatest_fragment.glsl",
"src/renderers/shaders/ShaderChunk/lights_lambert_vertex.glsl",
"src/renderers/shaders/ShaderChunk/map_particle_pars_fragment.glsl",
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册