matcap.uniforms
uniforms: UniformsUtils.merge( [
/* UniformsLib.common
*/
{
diffuse : { value : new Color( 0xeeeeee ) },
opacity : { value : 1.0 },
map : { value : null },
uvTransform : { value : new Matrix3() },
alphaMap : { value : null },
}
/* UniformsLib.bumpmap
*/
{
bumpMap : { value : null },
bumpScale : { value : 1 }
}
/* UniformsLib.normalmap
*/
{
normalMap : { value : null },
normalScale : { value : new Vector2( 1 , 1 ) }
}
/* UniformsLib.displacementmap
*/
{
displacementMap : { value : null },
displacementScale : { value : 1 },
displacementBias : { value : 0 }
}
/* UniformsLib.fog
*/
{
fogDensity : { value : 0.00025 },
fogNear : { value : 1 },
fogFar : { value : 2000 },
fogColor : { value : new Color( 0xffffff ) }
}
{
matcap : { value : null }
}
] ),
meshmatcap_vert.glsl
#define MATCAP
varying vec3 vViewPosition;
#ifndef FLAT_SHADED
varying vec3 vNormal;
#endif
/* common.glsl */
#define PI 3.14159265359
#define PI2 6.28318530718
#define PI_HALF 1.5707963267949
#define RECIPROCAL_PI 0.31830988618
#define RECIPROCAL_PI2 0.15915494
#define LOG2 1.442695
#define EPSILON 1e-6
#define saturate(a) clamp( a, 0.0, 1.0 )
#define whiteCompliment(a) ( 1.0 - saturate( a ) )
float pow2( const in float x ) { return x*x; }
float pow3( const in float x ) { return x*x*x; }
float pow4( const in float x ) { float x2 = x*x; return x2*x2; }
float average( const in vec3 color ) { return dot ( color, vec3 ( 0.3333 ) ); }
highp float rand( const in vec2 uv ) {
const highp float a = 12.9898 , b = 78.233 , c = 43758.5453 ;
highp float dt = dot ( uv.xy, vec2 ( a,b ) ), sn = mod ( dt, PI );
return fract (sin (sn) * c);
}
struct IncidentLight {
vec3 color;
vec3 direction;
bool visible;
};
struct ReflectedLight {
vec3 directDiffuse;
vec3 directSpecular;
vec3 indirectDiffuse;
vec3 indirectSpecular;
};
struct GeometricContext {
vec3 position;
vec3 normal;
vec3 viewDir;
};
vec3 transformDirection( in vec3 dir, in mat4 matrix ) {
return normalize ( ( matrix * vec4 ( dir, 0.0 ) ).xyz );
}
vec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {
return normalize ( ( vec4 ( dir, 0.0 ) * matrix ).xyz );
}
vec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {
float distance = dot ( planeNormal, point - pointOnPlane );
return - distance * planeNormal + point;
}
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 lineDirection * ( dot ( planeNormal, pointOnPlane - pointOnLine ) / dot ( planeNormal, lineDirection ) ) + pointOnLine;
}
mat3 transposeMat3( const in mat3 m ) {
mat3 tmp;
tmp[ 0 ] = vec3 ( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );
tmp[ 1 ] = vec3 ( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );
tmp[ 2 ] = vec3 ( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );
return tmp;
}
float linearToRelativeLuminance( const in vec3 color ) {
vec3 weights = vec3 ( 0.2126 , 0.7152 , 0.0722 );
return dot ( weights, color.rgb );
}
/* uv_pars_vertex.glsl */
#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )
varying vec2 vUv;
uniform mat3 uvTransform;
#endif
/* displacementmap_pars_vertex.glsl */
#ifdef USE_DISPLACEMENTMAP
uniform sampler2D displacementMap;
uniform float displacementScale;
uniform float displacementBias;
#endif
/* fog_pars_vertex.glsl */
#ifdef USE_FOG
varying float fogDepth;
#endif
/* morphtarget_pars_vertex.glsl */
#ifdef USE_MORPHTARGETS
#ifndef USE_MORPHNORMALS
uniform float morphTargetInfluences[ 8 ];
#else
uniform float morphTargetInfluences[ 4 ];
#endif
#endif
/* skinning_pars_vertex.glsl */
#ifdef USE_SKINNING
uniform mat4 bindMatrix;
uniform mat4 bindMatrixInverse;
#ifdef BONE_TEXTURE
uniform sampler2D boneTexture;
uniform int boneTextureSize;
mat4 getBoneMatrix( const in float i ) {
float j = i * 4.0 ;
float x = mod ( j, float ( boneTextureSize ) );
float y = floor ( j / float ( boneTextureSize ) );
float dx = 1.0 / float ( boneTextureSize );
float dy = 1.0 / float ( boneTextureSize );
y = dy * ( y + 0.5 );
vec4 v1 = texture2D ( boneTexture, vec2 ( dx * ( x + 0.5 ), y ) );
vec4 v2 = texture2D ( boneTexture, vec2 ( dx * ( x + 1.5 ), y ) );
vec4 v3 = texture2D ( boneTexture, vec2 ( dx * ( x + 2.5 ), y ) );
vec4 v4 = texture2D ( boneTexture, vec2 ( dx * ( x + 3.5 ), y ) );
mat4 bone = mat4 ( v1, v2, v3, v4 );
return bone;
}
#else
uniform mat4 boneMatrices[ MAX_BONES ];
mat4 getBoneMatrix( const in float i ) {
mat4 bone = boneMatrices[ int (i) ];
return bone;
}
#endif
#endif
/* logdepthbuf_pars_vertex.glsl */
#ifdef USE_LOGDEPTHBUF
#ifdef USE_LOGDEPTHBUF_EXT
varying float vFragDepth;
#else
uniform float logDepthBufFC;
#endif
#endif
/* clipping_planes_pars_vertex.glsl */
#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG ) && ! defined( MATCAP )
varying vec3 vViewPosition;
#endif
void main() {
/* uv_vertex.glsl */
#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )
vUv = ( uvTransform * vec3 ( uv, 1 ) ).xy;
#endif
/* beginnormal_vertex.glsl */
vec3 objectNormal = vec3 ( normal );
/* morphnormal_vertex.glsl */
#ifdef USE_MORPHNORMALS
objectNormal += ( morphNormal0 - normal ) * morphTargetInfluences[ 0 ];
objectNormal += ( morphNormal1 - normal ) * morphTargetInfluences[ 1 ];
objectNormal += ( morphNormal2 - normal ) * morphTargetInfluences[ 2 ];
objectNormal += ( morphNormal3 - normal ) * morphTargetInfluences[ 3 ];
#endif
/* skinbase_vertex.glsl */
#ifdef USE_SKINNING
mat4 boneMatX = getBoneMatrix( skinIndex.x );
mat4 boneMatY = getBoneMatrix( skinIndex.y );
mat4 boneMatZ = getBoneMatrix( skinIndex.z );
mat4 boneMatW = getBoneMatrix( skinIndex.w );
#endif
/* skinnormal_vertex.glsl */
#ifdef USE_SKINNING
mat4 skinMatrix = mat4 ( 0.0 );
skinMatrix += skinWeight.x * boneMatX;
skinMatrix += skinWeight.y * boneMatY;
skinMatrix += skinWeight.z * boneMatZ;
skinMatrix += skinWeight.w * boneMatW;
skinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;
objectNormal = vec4 ( skinMatrix * vec4 ( objectNormal, 0.0 ) ).xyz;
#endif
/* defaultnormal_vertex.glsl */
vec3 transformedNormal = normalMatrix * objectNormal;
#ifdef FLIP_SIDED
transformedNormal = - transformedNormal;
#endif
#ifndef FLAT_SHADED // Normal computed with derivatives when FLAT_SHADED
vNormal = normalize ( transformedNormal );
#endif
/* begin_vertex.glsl */
vec3 transformed = vec3 ( position );
/* morphtarget_vertex.glsl */
#ifdef USE_MORPHTARGETS
transformed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];
transformed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];
transformed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];
transformed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];
#ifndef USE_MORPHNORMALS
transformed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];
transformed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];
transformed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];
transformed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];
#endif
#endif
/* skinning_vertex.glsl */
#ifdef USE_SKINNING
vec4 skinVertex = bindMatrix * vec4 ( transformed, 1.0 );
vec4 skinned = vec4 ( 0.0 );
skinned += boneMatX * skinVertex * skinWeight.x;
skinned += boneMatY * skinVertex * skinWeight.y;
skinned += boneMatZ * skinVertex * skinWeight.z;
skinned += boneMatW * skinVertex * skinWeight.w;
transformed = ( bindMatrixInverse * skinned ).xyz;
#endif
/* displacementmap_vertex.glsl */
#ifdef USE_DISPLACEMENTMAP
transformed += normalize ( objectNormal ) * ( texture2D ( displacementMap, uv ).x * displacementScale + displacementBias );
#endif
/* project_vertex.glsl */
vec4 mvPosition = modelViewMatrix * vec4 ( transformed, 1.0 );
gl_Position = projectionMatrix * mvPosition;
/* logdepthbuf_vertex.glsl */
#ifdef USE_LOGDEPTHBUF
#ifdef USE_LOGDEPTHBUF_EXT
vFragDepth = 1.0 + gl_Position .w;
#else
gl_Position .z = log2 ( max ( EPSILON, gl_Position .w + 1.0 ) ) * logDepthBufFC - 1.0 ;
gl_Position .z *= gl_Position .w;
#endif
#endif
/* clipping_planes_vertex.glsl */
#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG ) && ! defined( MATCAP )
vViewPosition = - mvPosition.xyz;
#endif
/* fog_vertex.glsl */
#ifdef USE_FOG
fogDepth = -mvPosition.z;
#endif
vViewPosition = - mvPosition.xyz;
}
meshmatcap_frag.glsl
#define MATCAP
uniform vec3 diffuse;
uniform float opacity;
uniform sampler2D matcap;
varying vec3 vViewPosition;
#ifndef FLAT_SHADED
varying vec3 vNormal;
#endif
/* common.glsl */
#define PI 3.14159265359
#define PI2 6.28318530718
#define PI_HALF 1.5707963267949
#define RECIPROCAL_PI 0.31830988618
#define RECIPROCAL_PI2 0.15915494
#define LOG2 1.442695
#define EPSILON 1e-6
#define saturate(a) clamp( a, 0.0, 1.0 )
#define whiteCompliment(a) ( 1.0 - saturate( a ) )
float pow2( const in float x ) { return x*x; }
float pow3( const in float x ) { return x*x*x; }
float pow4( const in float x ) { float x2 = x*x; return x2*x2; }
float average( const in vec3 color ) { return dot ( color, vec3 ( 0.3333 ) ); }
highp float rand( const in vec2 uv ) {
const highp float a = 12.9898 , b = 78.233 , c = 43758.5453 ;
highp float dt = dot ( uv.xy, vec2 ( a,b ) ), sn = mod ( dt, PI );
return fract (sin (sn) * c);
}
struct IncidentLight {
vec3 color;
vec3 direction;
bool visible;
};
struct ReflectedLight {
vec3 directDiffuse;
vec3 directSpecular;
vec3 indirectDiffuse;
vec3 indirectSpecular;
};
struct GeometricContext {
vec3 position;
vec3 normal;
vec3 viewDir;
};
vec3 transformDirection( in vec3 dir, in mat4 matrix ) {
return normalize ( ( matrix * vec4 ( dir, 0.0 ) ).xyz );
}
vec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {
return normalize ( ( vec4 ( dir, 0.0 ) * matrix ).xyz );
}
vec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {
float distance = dot ( planeNormal, point - pointOnPlane );
return - distance * planeNormal + point;
}
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 lineDirection * ( dot ( planeNormal, pointOnPlane - pointOnLine ) / dot ( planeNormal, lineDirection ) ) + pointOnLine;
}
mat3 transposeMat3( const in mat3 m ) {
mat3 tmp;
tmp[ 0 ] = vec3 ( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );
tmp[ 1 ] = vec3 ( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );
tmp[ 2 ] = vec3 ( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );
return tmp;
}
float linearToRelativeLuminance( const in vec3 color ) {
vec3 weights = vec3 ( 0.2126 , 0.7152 , 0.0722 );
return dot ( weights, color.rgb );
}
/* uv_pars_fragment.glsl */
#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )
varying vec2 vUv;
#endif
/* map_pars_fragment.glsl */
#ifdef USE_MAP
uniform sampler2D map;
#endif
/* alphamap_pars_fragment.glsl */
#ifdef USE_ALPHAMAP
uniform sampler2D alphaMap;
#endif
/* fog_pars_fragment.glsl */
#ifdef USE_FOG
uniform vec3 fogColor;
varying float fogDepth;
#ifdef FOG_EXP2
uniform float fogDensity;
#else
uniform float fogNear;
uniform float fogFar;
#endif
#endif
/* bumpmap_pars_fragment.glsl */
#ifdef USE_BUMPMAP
uniform sampler2D bumpMap;
uniform float bumpScale;
vec2 dHdxy_fwd() {
vec2 dSTdx = dFdx ( vUv );
vec2 dSTdy = dFdy ( vUv );
float Hll = bumpScale * texture2D ( bumpMap, vUv ).x;
float dBx = bumpScale * texture2D ( bumpMap, vUv + dSTdx ).x - Hll;
float dBy = bumpScale * texture2D ( bumpMap, vUv + dSTdy ).x - Hll;
return vec2 ( dBx, dBy );
}
vec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy ) {
vec3 vSigmaX = vec3 ( dFdx ( surf_pos.x ), dFdx ( surf_pos.y ), dFdx ( surf_pos.z ) );
vec3 vSigmaY = vec3 ( dFdy ( surf_pos.x ), dFdy ( surf_pos.y ), dFdy ( surf_pos.z ) );
vec3 vN = surf_norm;
vec3 R1 = cross ( vSigmaY, vN );
vec3 R2 = cross ( vN, vSigmaX );
float fDet = dot ( vSigmaX, R1 );
fDet *= ( float ( gl_FrontFacing ) * 2.0 - 1.0 );
vec3 vGrad = sign ( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );
return normalize ( abs ( fDet ) * surf_norm - vGrad );
}
#endif
/* normalmap_pars_fragment.glsl */
#ifdef USE_NORMALMAP
uniform sampler2D normalMap;
uniform vec2 normalScale;
#ifdef OBJECTSPACE_NORMALMAP
uniform mat3 normalMatrix;
#else
vec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm ) {
vec3 q0 = vec3 ( dFdx ( eye_pos.x ), dFdx ( eye_pos.y ), dFdx ( eye_pos.z ) );
vec3 q1 = vec3 ( dFdy ( eye_pos.x ), dFdy ( eye_pos.y ), dFdy ( eye_pos.z ) );
vec2 st0 = dFdx ( vUv.st );
vec2 st1 = dFdy ( vUv.st );
float scale = sign ( st1.t * st0.s - st0.t * st1.s );
vec3 S = normalize ( ( q0 * st1.t - q1 * st0.t ) * scale );
vec3 T = normalize ( ( - q0 * st1.s + q1 * st0.s ) * scale );
vec3 N = normalize ( surf_norm );
mat3 tsn = mat3 ( S, T, N );
vec3 mapN = texture2D ( normalMap, vUv ).xyz * 2.0 - 1.0 ;
mapN.xy *= normalScale;
mapN.xy *= ( float ( gl_FrontFacing ) * 2.0 - 1.0 );
return normalize ( tsn * mapN );
}
#endif
#endif
/* logdepthbuf_pars_fragment.glsl */
#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )
uniform float logDepthBufFC;
varying float vFragDepth;
#endif
/* clipping_planes_pars_fragment.glsl */
#if NUM_CLIPPING_PLANES > 0
#if ! defined( PHYSICAL ) && ! defined( PHONG ) && ! defined( MATCAP )
varying vec3 vViewPosition;
#endif
uniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];
#endif
void main() {
/* clipping_planes_fragment.glsl */
#if NUM_CLIPPING_PLANES > 0
vec4 plane;
#pragma unroll_loop
for ( int i = 0 ; i < UNION_CLIPPING_PLANES; i ++ ) {
plane = clippingPlanes[ i ];
if ( dot ( vViewPosition, plane.xyz ) > plane.w ) discard ;
}
#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES
bool clipped = true ;
#pragma unroll_loop
for ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {
plane = clippingPlanes[ i ];
clipped = ( dot ( vViewPosition, plane.xyz ) > plane.w ) && clipped;
}
if ( clipped ) discard ;
#endif
#endif
vec4 diffuseColor = vec4 ( diffuse, opacity );
/* logdepthbuf_fragment.glsl */
#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )
gl_FragDepthEXT = log2 ( vFragDepth ) * logDepthBufFC * 0.5 ;
#endif
/* map_fragment.glsl */
#ifdef USE_MAP
vec4 texelColor = texture2D ( map, vUv );
texelColor = mapTexelToLinear( texelColor );
diffuseColor *= texelColor;
#endif
/* alphamap_fragment.glsl */
#ifdef USE_ALPHAMAP
diffuseColor.a *= texture2D ( alphaMap, vUv ).g;
#endif
/* alphatest_fragment.glsl */
#ifdef ALPHATEST
if ( diffuseColor.a < ALPHATEST ) discard ;
#endif
/* normal_fragment_begin.glsl */
#ifdef FLAT_SHADED
vec3 fdx = vec3 ( dFdx ( vViewPosition.x ), dFdx ( vViewPosition.y ), dFdx ( vViewPosition.z ) );
vec3 fdy = vec3 ( dFdy ( vViewPosition.x ), dFdy ( vViewPosition.y ), dFdy ( vViewPosition.z ) );
vec3 normal = normalize ( cross ( fdx, fdy ) );
#else
vec3 normal = normalize ( vNormal );
#ifdef DOUBLE_SIDED
normal = normal * ( float ( gl_FrontFacing ) * 2.0 - 1.0 );
#endif
#endif
/* normal_fragment_maps.glsl */
#ifdef USE_NORMALMAP
#ifdef OBJECTSPACE_NORMALMAP
normal = texture2D ( normalMap, vUv ).xyz * 2.0 - 1.0 ;
#ifdef FLIP_SIDED
normal = - normal;
#endif
#ifdef DOUBLE_SIDED
normal = normal * ( float ( gl_FrontFacing ) * 2.0 - 1.0 );
#endif
normal = normalize ( normalMatrix * normal );
#else // tangent-space normal map
normal = perturbNormal2Arb( -vViewPosition, normal );
#endif
#elif defined( USE_BUMPMAP )
normal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );
#endif
vec3 viewDir = normalize ( vViewPosition );
vec3 x = normalize ( vec3 ( viewDir.z, 0.0 , - viewDir.x ) );
vec3 y = cross ( viewDir, x );
vec2 uv = vec2 ( dot ( x, normal ), dot ( y, normal ) ) * 0.495 + 0.5 ;
vec4 matcapColor = texture2D ( matcap, uv );
matcapColor = matcapTexelToLinear( matcapColor );
vec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb;
gl_FragColor = vec4 ( outgoingLight, diffuseColor.a );
/* premultiplied_alpha_fragment.glsl */
#ifdef PREMULTIPLIED_ALPHA
gl_FragColor .rgb *= gl_FragColor .a;
#endif
/* tonemapping_fragment.glsl */
#if defined( TONE_MAPPING )
gl_FragColor .rgb = toneMapping( gl_FragColor .rgb );
#endif
/* encodings_fragment.glsl */
gl_FragColor = linearToOutputTexel( gl_FragColor );
/* fog_fragment.glsl */
#ifdef USE_FOG
#ifdef FOG_EXP2
float fogFactor = whiteCompliment( exp2 ( - fogDensity * fogDensity * fogDepth * fogDepth * LOG2 ) );
#else
float fogFactor = smoothstep ( fogNear, fogFar, fogDepth );
#endif
gl_FragColor .rgb = mix ( gl_FragColor .rgb, fogColor, fogFactor );
#endif
}
Back to Index Source