浏览代码

WebGLDeferredRenderer: changed global ADDITIVE_SPECULAR renderer parameter into per-object material parameter in color G-buffer.

For the moment corresponding to material.metal parameter. I still need to think through this specular combination business, there are some unintuitive behaviors going on.
alteredq 12 年之前
父节点
当前提交
56417d2011

+ 9 - 5
examples/js/ShaderDeferred.js

@@ -20,7 +20,8 @@ THREE.ShaderDeferred = {
 				"emissive" :  { type: "c", value: new THREE.Color( 0x000000 ) },
 				"specular" :  { type: "c", value: new THREE.Color( 0x111111 ) },
 				"shininess":  { type: "f", value: 30 },
-				"wrapAround": { type: "f", value: 1 }
+				"wrapAround": 		{ type: "f", value: 1 },
+				"additiveSpecular": { type: "f", value: 1 }
 			}
 
 		] ),
@@ -32,6 +33,7 @@ THREE.ShaderDeferred = {
 			"uniform vec3 emissive;",
 			"uniform float shininess;",
 			"uniform float wrapAround;",
+			"uniform float additiveSpecular;",
 
 			THREE.ShaderChunk[ "color_pars_fragment" ],
 			THREE.ShaderChunk[ "map_pars_fragment" ],
@@ -78,7 +80,7 @@ THREE.ShaderDeferred = {
 
 				// specular color
 
-				"gl_FragColor.y = vec3_to_float( compressionScale * specular );",
+				"gl_FragColor.y = additiveSpecular * vec3_to_float( compressionScale * specular );",
 
 				// shininess
 
@@ -410,15 +412,17 @@ THREE.ShaderDeferred = {
 
 				"vec3 light = lightIntensity * lightColor;",
 
-				"#ifdef ADDITIVE_SPECULAR",
+				"float additiveSpecular = sign( colorMap.y );",
+
+				"if ( additiveSpecular < 0.0 ) {",
 
 					"gl_FragColor = vec4( albedo * light * diffuse, attenuation ) + vec4( light * specular, attenuation );",
 
-				"#else",
+				"} else {",
 
 					"gl_FragColor = vec4( albedo * light * ( diffuse + specular ), attenuation );",
 
-				"#endif",
+				"}",
 
 			"}"
 

+ 2 - 3
examples/js/renderers/WebGLDeferredRenderer.js

@@ -14,7 +14,6 @@ THREE.WebGLDeferredRenderer = function ( parameters ) {
 	var scaledWidth = Math.floor( scale * width );
 	var scaledHeight = Math.floor( scale * height );
 
-	var additiveSpecular = parameters.additiveSpecular;
 	var brightness = parameters.brightness;
 
 	this.renderer = parameters.renderer;
@@ -148,12 +147,14 @@ THREE.WebGLDeferredRenderer = function ( parameters ) {
 		var specular = originalMaterial.specular !== undefined ? originalMaterial.specular : black;
 		var shininess = originalMaterial.shininess !== undefined ? originalMaterial.shininess : 1;
 		var wrapAround = originalMaterial.wrapAround !== undefined ? ( originalMaterial.wrapAround ? -1 : 1 ) : 1;
+		var additiveSpecular = originalMaterial.metal !== undefined ? ( originalMaterial.metal ? 1 : -1 ) : -1;
 
 		uniforms.emissive.value.copy( emissive );
 		uniforms.diffuse.value.copy( diffuse );
 		uniforms.specular.value.copy( specular );
 		uniforms.shininess.value = shininess;
 		uniforms.wrapAround.value = wrapAround;
+		uniforms.additiveSpecular.value = additiveSpecular;
 
 		uniforms.map.value = originalMaterial.map;
 
@@ -238,7 +239,6 @@ THREE.WebGLDeferredRenderer = function ( parameters ) {
 			uniforms:       THREE.UniformsUtils.clone( pointLightShader.uniforms ),
 			vertexShader:   pointLightShader.vertexShader,
 			fragmentShader: pointLightShader.fragmentShader,
-			defines:		{ "ADDITIVE_SPECULAR": additiveSpecular },
 
 			blending:		THREE.AdditiveBlending,
 			depthWrite:		false,
@@ -280,7 +280,6 @@ THREE.WebGLDeferredRenderer = function ( parameters ) {
 			uniforms:       THREE.UniformsUtils.clone( directionalLightShader.uniforms ),
 			vertexShader:   directionalLightShader.vertexShader,
 			fragmentShader: directionalLightShader.fragmentShader,
-			defines:		{ "ADDITIVE_SPECULAR": additiveSpecular },
 
 			blending:		THREE.AdditiveBlending,
 			depthWrite:		false,

+ 1 - 1
examples/webgl_lights_deferred_morphs.html

@@ -111,7 +111,7 @@
 
 				// renderer
 
-				renderer = new THREE.WebGLDeferredRenderer( { width: WIDTH, height: HEIGHT, scale: SCALE, brightness: 2, additiveSpecular: true } );
+				renderer = new THREE.WebGLDeferredRenderer( { width: WIDTH, height: HEIGHT, scale: SCALE, brightness: 2 } );
 
 				renderer.domElement.style.position = "absolute";
 				renderer.domElement.style.top = MARGIN + "px";

+ 2 - 2
examples/webgl_lights_deferred_pointlights.html

@@ -111,7 +111,7 @@
 
 				// renderer
 
-				renderer = new THREE.WebGLDeferredRenderer( { width: WIDTH, height: HEIGHT, scale: SCALE, additiveSpecular: false, brightness: 2 } );
+				renderer = new THREE.WebGLDeferredRenderer( { width: WIDTH, height: HEIGHT, scale: SCALE, brightness: 2 } );
 
 				renderer.domElement.style.position = "absolute";
 				renderer.domElement.style.top = MARGIN + "px";
@@ -242,7 +242,7 @@
 					mapHeight.anisotropy = 4;
 					mapHeight.format = THREE.RGBFormat;
 
-					var material = new THREE.MeshPhongMaterial( { map: mapColor, bumpMap: mapHeight, bumpScale: 2.5, shininess: 75, specular: 0x090909, wrapAround: true } );
+					var material = new THREE.MeshPhongMaterial( { map: mapColor, bumpMap: mapHeight, bumpScale: 2.5, shininess: 75, specular: 0x090909, wrapAround: true, metal: true } );
 
 					var object = new THREE.Mesh( geometry, material );
 					object.scale.multiplyScalar( 8 );