提交 1dcc2d75 编写于 作者: A alteredq

Merged and fixed @crobi's normalmaps via derivatives.

See #2358
此差异已折叠。
......@@ -17,6 +17,9 @@
* bumpMap: new THREE.Texture( <Image> ),
* bumpScale: <float>,
*
* normalMap: new THREE.Texture( <Image> ),
* normalScale: <float>,
*
* specularMap: new THREE.Texture( <Image> ),
*
* envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ),
......@@ -64,6 +67,9 @@ THREE.MeshPhongMaterial = function ( parameters ) {
this.bumpMap = null;
this.bumpScale = 1;
this.normalMap = null;
this.normalScale = 1;
this.specularMap = null;
this.envMap = null;
......@@ -115,7 +121,10 @@ THREE.MeshPhongMaterial.prototype.clone = function () {
material.lightMap = this.lightMap;
material.bumpMap = this.bumpMap;
material.bumpScale= this.bumpScale;
material.bumpScale = this.bumpScale;
material.normalMap = this.normalMap;
material.normalScale = this.normalScale;
material.specularMap = this.specularMap;
......
......@@ -929,7 +929,7 @@ THREE.WebGLRenderer = function ( parameters ) {
// material must use some texture to require uvs
if ( material.map || material.lightMap || material.bumpMap || material.specularMap || material instanceof THREE.ShaderMaterial ) {
if ( material.map || material.lightMap || material.bumpMap || material.normalMap || material.specularMap || material instanceof THREE.ShaderMaterial ) {
return true;
......@@ -4593,6 +4593,7 @@ THREE.WebGLRenderer = function ( parameters ) {
envMap: !!material.envMap,
lightMap: !!material.lightMap,
bumpMap: !!material.bumpMap,
normalMap: !!material.normalMap,
specularMap: !!material.specularMap,
vertexColors: material.vertexColors,
......@@ -4945,10 +4946,18 @@ THREE.WebGLRenderer = function ( parameters ) {
}
if ( material.normalMap ) {
uniforms.normalMap.value = material.normalMap;
uniforms.normalScale.value = material.normalScale;
}
// uv repeat and offset setting priorities
// 1. color map
// 2. specular map
// 3. bump map
// 3. normal map
// 4. bump map
var uvScaleMap;
......@@ -4960,6 +4969,10 @@ THREE.WebGLRenderer = function ( parameters ) {
uvScaleMap = material.specularMap;
} else if ( material.normalMap ) {
uvScaleMap = material.normalMap;
} else if ( material.bumpMap ) {
uvScaleMap = material.bumpMap;
......@@ -5889,6 +5902,7 @@ THREE.WebGLRenderer = function ( parameters ) {
parameters.envMap ? "#define USE_ENVMAP" : "",
parameters.lightMap ? "#define USE_LIGHTMAP" : "",
parameters.bumpMap ? "#define USE_BUMPMAP" : "",
parameters.normalMap ? "#define USE_NORMALMAP" : "",
parameters.specularMap ? "#define USE_SPECULARMAP" : "",
parameters.vertexColors ? "#define USE_COLOR" : "",
......@@ -5969,7 +5983,7 @@ THREE.WebGLRenderer = function ( parameters ) {
"precision " + _precision + " float;",
parameters.bumpMap ? "#extension GL_OES_standard_derivatives : enable" : "",
( parameters.bumpMap || parameters.normalMap ) ? "#extension GL_OES_standard_derivatives : enable" : "",
"#define MAX_DIR_LIGHTS " + parameters.maxDirLights,
"#define MAX_POINT_LIGHTS " + parameters.maxPointLights,
......@@ -5991,6 +6005,7 @@ THREE.WebGLRenderer = function ( parameters ) {
parameters.envMap ? "#define USE_ENVMAP" : "",
parameters.lightMap ? "#define USE_LIGHTMAP" : "",
parameters.bumpMap ? "#define USE_BUMPMAP" : "",
parameters.normalMap ? "#define USE_NORMALMAP" : "",
parameters.specularMap ? "#define USE_SPECULARMAP" : "",
parameters.vertexColors ? "#define USE_COLOR" : "",
......
......@@ -64,7 +64,7 @@ THREE.ShaderChunk = {
"uniform float flipEnvMap;",
"uniform int combine;",
"#ifdef USE_BUMPMAP",
"#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )",
"uniform bool useRefract;",
"uniform float refractionRatio;",
......@@ -85,7 +85,7 @@ THREE.ShaderChunk = {
"vec3 reflectVec;",
"#ifdef USE_BUMPMAP",
"#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )",
"vec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );",
......@@ -138,7 +138,7 @@ THREE.ShaderChunk = {
envmap_pars_vertex: [
"#if defined( USE_ENVMAP ) && ! defined( USE_BUMPMAP )",
"#if defined( USE_ENVMAP ) && ! defined( USE_BUMPMAP ) && ! defined( USE_NORMALMAP )",
"varying vec3 vReflect;",
......@@ -177,7 +177,7 @@ THREE.ShaderChunk = {
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;",
......@@ -222,7 +222,7 @@ THREE.ShaderChunk = {
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;",
"uniform vec4 offsetRepeat;",
......@@ -233,7 +233,7 @@ THREE.ShaderChunk = {
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;",
......@@ -249,7 +249,7 @@ THREE.ShaderChunk = {
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;",
......@@ -368,6 +368,40 @@ THREE.ShaderChunk = {
].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
specularmap_pars_fragment: [
......@@ -825,7 +859,11 @@ THREE.ShaderChunk = {
"#endif",
"#ifdef USE_BUMPMAP",
"#ifdef USE_NORMALMAP",
"normal = perturbNormal2Arb( -viewPosition, normal );",
"#elif defined( USE_BUMPMAP )",
"normal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );",
......@@ -1769,6 +1807,12 @@ THREE.UniformsLib = {
},
normalmap: {
"normalMap" : { type: "t", value: null },
"normalScale" : { type: "f", value: 1 }
},
fog : {
"fogDensity" : { type: "f", value: 0.00025 },
......@@ -2118,6 +2162,7 @@ THREE.ShaderLib = {
THREE.UniformsLib[ "common" ],
THREE.UniformsLib[ "bump" ],
THREE.UniformsLib[ "normalmap" ],
THREE.UniformsLib[ "fog" ],
THREE.UniformsLib[ "lights" ],
THREE.UniformsLib[ "shadowmap" ],
......@@ -2194,6 +2239,7 @@ THREE.ShaderLib = {
THREE.ShaderChunk[ "lights_phong_pars_fragment" ],
THREE.ShaderChunk[ "shadowmap_pars_fragment" ],
THREE.ShaderChunk[ "bumpmap_pars_fragment" ],
THREE.ShaderChunk[ "normalmap_pars_fragment" ],
THREE.ShaderChunk[ "specularmap_pars_fragment" ],
"void main() {",
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册