|
@@ -64,7 +64,7 @@ THREE.ShaderChunk = {
|
|
"uniform float flipEnvMap;",
|
|
"uniform float flipEnvMap;",
|
|
"uniform int combine;",
|
|
"uniform int combine;",
|
|
|
|
|
|
- "#ifdef USE_BUMPMAP",
|
|
|
|
|
|
+ "#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )",
|
|
|
|
|
|
"uniform bool useRefract;",
|
|
"uniform bool useRefract;",
|
|
"uniform float refractionRatio;",
|
|
"uniform float refractionRatio;",
|
|
@@ -85,7 +85,7 @@ THREE.ShaderChunk = {
|
|
|
|
|
|
"vec3 reflectVec;",
|
|
"vec3 reflectVec;",
|
|
|
|
|
|
- "#ifdef USE_BUMPMAP",
|
|
|
|
|
|
+ "#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )",
|
|
|
|
|
|
"vec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );",
|
|
"vec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );",
|
|
|
|
|
|
@@ -138,7 +138,7 @@ THREE.ShaderChunk = {
|
|
|
|
|
|
envmap_pars_vertex: [
|
|
envmap_pars_vertex: [
|
|
|
|
|
|
- "#if defined( USE_ENVMAP ) && ! defined( USE_BUMPMAP )",
|
|
|
|
|
|
+ "#if defined( USE_ENVMAP ) && ! defined( USE_BUMPMAP ) && ! defined( USE_NORMALMAP )",
|
|
|
|
|
|
"varying vec3 vReflect;",
|
|
"varying vec3 vReflect;",
|
|
|
|
|
|
@@ -177,7 +177,7 @@ THREE.ShaderChunk = {
|
|
|
|
|
|
envmap_vertex : [
|
|
envmap_vertex : [
|
|
|
|
|
|
- "#if defined( USE_ENVMAP ) && ! defined( USE_BUMPMAP )",
|
|
|
|
|
|
+ "#if defined( USE_ENVMAP ) && ! defined( USE_BUMPMAP ) && ! defined( USE_NORMALMAP )",
|
|
|
|
|
|
"vec3 nWorld = mat3( modelMatrix[ 0 ].xyz, modelMatrix[ 1 ].xyz, modelMatrix[ 2 ].xyz ) * objectNormal;",
|
|
"vec3 nWorld = mat3( modelMatrix[ 0 ].xyz, modelMatrix[ 1 ].xyz, modelMatrix[ 2 ].xyz ) * objectNormal;",
|
|
|
|
|
|
@@ -222,7 +222,7 @@ THREE.ShaderChunk = {
|
|
|
|
|
|
map_pars_vertex: [
|
|
map_pars_vertex: [
|
|
|
|
|
|
- "#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_SPECULARMAP )",
|
|
|
|
|
|
+ "#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP )",
|
|
|
|
|
|
"varying vec2 vUv;",
|
|
"varying vec2 vUv;",
|
|
"uniform vec4 offsetRepeat;",
|
|
"uniform vec4 offsetRepeat;",
|
|
@@ -233,7 +233,7 @@ THREE.ShaderChunk = {
|
|
|
|
|
|
map_pars_fragment: [
|
|
map_pars_fragment: [
|
|
|
|
|
|
- "#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_SPECULARMAP )",
|
|
|
|
|
|
+ "#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP )",
|
|
|
|
|
|
"varying vec2 vUv;",
|
|
"varying vec2 vUv;",
|
|
|
|
|
|
@@ -249,7 +249,7 @@ THREE.ShaderChunk = {
|
|
|
|
|
|
map_vertex: [
|
|
map_vertex: [
|
|
|
|
|
|
- "#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_SPECULARMAP )",
|
|
|
|
|
|
+ "#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP )",
|
|
|
|
|
|
"vUv = uv * offsetRepeat.zw + offsetRepeat.xy;",
|
|
"vUv = uv * offsetRepeat.zw + offsetRepeat.xy;",
|
|
|
|
|
|
@@ -368,6 +368,40 @@ THREE.ShaderChunk = {
|
|
|
|
|
|
].join("\n"),
|
|
].join("\n"),
|
|
|
|
|
|
|
|
+ // NORMAL MAP
|
|
|
|
+
|
|
|
|
+ normalmap_pars_fragment: [
|
|
|
|
+
|
|
|
|
+ "#ifdef USE_NORMALMAP",
|
|
|
|
+
|
|
|
|
+ "uniform sampler2D normalMap;",
|
|
|
|
+ "uniform float normalScale;",
|
|
|
|
+
|
|
|
|
+ // Per-Pixel Tangent Space Normal Mapping
|
|
|
|
+ // http://hacksoflife.blogspot.ch/2009/11/per-pixel-tangent-space-normal-mapping.html
|
|
|
|
+
|
|
|
|
+ "vec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm ) {",
|
|
|
|
+
|
|
|
|
+ "vec3 q0 = dFdx( eye_pos.xyz );",
|
|
|
|
+ "vec3 q1 = dFdy( eye_pos.xyz );",
|
|
|
|
+ "vec2 st0 = dFdx( vUv.st );",
|
|
|
|
+ "vec2 st1 = dFdy( vUv.st );",
|
|
|
|
+
|
|
|
|
+ "vec3 S = normalize( q0 * st1.t - q1 * st0.t );",
|
|
|
|
+ "vec3 T = normalize( -q0 * st1.s + q1 * st0.s );",
|
|
|
|
+ "vec3 N = normalize( surf_norm );",
|
|
|
|
+
|
|
|
|
+ "vec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;",
|
|
|
|
+ "mapN.xy = normalScale * mapN.xy;",
|
|
|
|
+ "mat3 tsn = mat3( S, T, N );",
|
|
|
|
+ "return normalize( tsn * mapN );",
|
|
|
|
+
|
|
|
|
+ "}",
|
|
|
|
+
|
|
|
|
+ "#endif"
|
|
|
|
+
|
|
|
|
+ ].join("\n"),
|
|
|
|
+
|
|
// SPECULAR MAP
|
|
// SPECULAR MAP
|
|
|
|
|
|
specularmap_pars_fragment: [
|
|
specularmap_pars_fragment: [
|
|
@@ -825,7 +859,11 @@ THREE.ShaderChunk = {
|
|
|
|
|
|
"#endif",
|
|
"#endif",
|
|
|
|
|
|
- "#ifdef USE_BUMPMAP",
|
|
|
|
|
|
+ "#ifdef USE_NORMALMAP",
|
|
|
|
+
|
|
|
|
+ "normal = perturbNormal2Arb( -viewPosition, normal );",
|
|
|
|
+
|
|
|
|
+ "#elif defined( USE_BUMPMAP )",
|
|
|
|
|
|
"normal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );",
|
|
"normal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );",
|
|
|
|
|
|
@@ -1769,6 +1807,12 @@ THREE.UniformsLib = {
|
|
|
|
|
|
},
|
|
},
|
|
|
|
|
|
|
|
+ normalmap: {
|
|
|
|
+
|
|
|
|
+ "normalMap" : { type: "t", value: null },
|
|
|
|
+ "normalScale" : { type: "f", value: 1 }
|
|
|
|
+ },
|
|
|
|
+
|
|
fog : {
|
|
fog : {
|
|
|
|
|
|
"fogDensity" : { type: "f", value: 0.00025 },
|
|
"fogDensity" : { type: "f", value: 0.00025 },
|
|
@@ -2118,6 +2162,7 @@ THREE.ShaderLib = {
|
|
|
|
|
|
THREE.UniformsLib[ "common" ],
|
|
THREE.UniformsLib[ "common" ],
|
|
THREE.UniformsLib[ "bump" ],
|
|
THREE.UniformsLib[ "bump" ],
|
|
|
|
+ THREE.UniformsLib[ "normalmap" ],
|
|
THREE.UniformsLib[ "fog" ],
|
|
THREE.UniformsLib[ "fog" ],
|
|
THREE.UniformsLib[ "lights" ],
|
|
THREE.UniformsLib[ "lights" ],
|
|
THREE.UniformsLib[ "shadowmap" ],
|
|
THREE.UniformsLib[ "shadowmap" ],
|
|
@@ -2194,6 +2239,7 @@ THREE.ShaderLib = {
|
|
THREE.ShaderChunk[ "lights_phong_pars_fragment" ],
|
|
THREE.ShaderChunk[ "lights_phong_pars_fragment" ],
|
|
THREE.ShaderChunk[ "shadowmap_pars_fragment" ],
|
|
THREE.ShaderChunk[ "shadowmap_pars_fragment" ],
|
|
THREE.ShaderChunk[ "bumpmap_pars_fragment" ],
|
|
THREE.ShaderChunk[ "bumpmap_pars_fragment" ],
|
|
|
|
+ THREE.ShaderChunk[ "normalmap_pars_fragment" ],
|
|
THREE.ShaderChunk[ "specularmap_pars_fragment" ],
|
|
THREE.ShaderChunk[ "specularmap_pars_fragment" ],
|
|
|
|
|
|
"void main() {",
|
|
"void main() {",
|