Pārlūkot izejas kodu

Unify MeshPhysicalMaterial and MeshStandardMaterial

WestLangley 9 gadi atpakaļ
vecāks
revīzija
08adeecfd2

+ 4 - 0
src/materials/MeshPhysicalMaterial.js

@@ -10,6 +10,8 @@ THREE.MeshPhysicalMaterial = function ( parameters ) {
 
 	THREE.MeshStandardMaterial.call( this );
 
+	this.defines = { 'PHYSICAL': '' };
+
 	this.type = 'MeshPhysicalMaterial';
 
 	this.reflectivity = 0.5; // maps to F0 = 0.04
@@ -25,6 +27,8 @@ THREE.MeshPhysicalMaterial.prototype.copy = function ( source ) {
 
 	THREE.MeshStandardMaterial.prototype.copy.call( this, source );
 
+	this.defines = { 'PHYSICAL': '' };
+
 	this.reflectivity = source.reflectivity;
 
 	return this;

+ 4 - 0
src/materials/MeshStandardMaterial.js

@@ -62,6 +62,8 @@ THREE.MeshStandardMaterial = function ( parameters ) {
 
 	THREE.Material.call( this );
 
+	this.defines = { 'STANDARD': '' };
+
 	this.type = 'MeshStandardMaterial';
 
 	this.color = new THREE.Color( 0xffffff ); // diffuse
@@ -128,6 +130,8 @@ THREE.MeshStandardMaterial.prototype.copy = function ( source ) {
 
 	THREE.Material.prototype.copy.call( this, source );
 
+	this.defines = { 'STANDARD': '' };
+
 	this.color.copy( source.color );
 	this.roughness = source.roughness;
 	this.metalness = source.metalness;

+ 1 - 1
src/renderers/shaders/ShaderChunk/aomap_fragment.glsl

@@ -4,7 +4,7 @@
 
 	reflectedLight.indirectDiffuse *= ambientOcclusion;
 
-	#if defined( USE_ENVMAP ) && defined( STANDARD )
+	#if defined( USE_ENVMAP ) && defined( PHYSICAL )
 
 		float dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );
 

+ 1 - 1
src/renderers/shaders/ShaderChunk/clipping_planes_pars_fragment.glsl

@@ -1,6 +1,6 @@
 #if NUM_CLIPPING_PLANES > 0
 
-	#if ! defined( STANDARD ) && ! defined( PHONG )
+	#if ! defined( PHYSICAL ) && ! defined( PHONG )
 		varying vec3 vViewPosition;
 	#endif
 

+ 1 - 1
src/renderers/shaders/ShaderChunk/clipping_planes_pars_vertex.glsl

@@ -1,3 +1,3 @@
-#if NUM_CLIPPING_PLANES > 0 && ! defined( STANDARD ) && ! defined( PHONG )
+#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )
 	varying vec3 vViewPosition;
 #endif

+ 1 - 1
src/renderers/shaders/ShaderChunk/clipping_planes_vertex.glsl

@@ -1,4 +1,4 @@
-#if NUM_CLIPPING_PLANES > 0 && ! defined( STANDARD ) && ! defined( PHONG )
+#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )
 	vViewPosition = - mvPosition.xyz;
 #endif
 

+ 3 - 3
src/renderers/shaders/ShaderChunk/envmap_pars_fragment.glsl

@@ -1,11 +1,11 @@
-#if defined( USE_ENVMAP ) || defined( STANDARD )
+#if defined( USE_ENVMAP ) || defined( PHYSICAL )
 	uniform float reflectivity;
 	uniform float envMapIntenstiy;
 #endif
 
 #ifdef USE_ENVMAP
 
-	#if ! defined( STANDARD ) && ( defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) )
+	#if ! defined( PHYSICAL ) && ( defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) )
 		varying vec3 vWorldPosition;
 	#endif
 
@@ -16,7 +16,7 @@
 	#endif
 	uniform float flipEnvMap;
 
-	#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( STANDARD )
+	#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( PHYSICAL )
 		uniform float refractionRatio;
 	#else
 		varying vec3 vReflect;

+ 1 - 1
src/renderers/shaders/ShaderChunk/lights_pars.glsl

@@ -161,7 +161,7 @@ vec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {
 #endif
 
 
-#if defined( USE_ENVMAP ) && defined( STANDARD )
+#if defined( USE_ENVMAP ) && defined( PHYSICAL )
 
 	vec3 getLightProbeIndirectIrradiance( /*const in SpecularLightProbe specularLightProbe,*/ const in GeometricContext geometry, const in int maxMIPLevel ) {
 

+ 5 - 1
src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl

@@ -1,4 +1,8 @@
 PhysicalMaterial material;
 material.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );
 material.specularRoughness = clamp( roughnessFactor, 0.04, 1.0 );
-material.specularColor = mix( vec3( 0.16 * pow2( reflectivity ) ), diffuseColor.rgb, metalnessFactor );
+#ifdef STANDARD
+	material.specularColor = mix( vec3( 0.04 ), diffuseColor.rgb, metalnessFactor );
+#else
+	material.specularColor = mix( vec3( 0.16 * pow2( reflectivity ) ), diffuseColor.rgb, metalnessFactor );
+#endif

+ 4 - 0
src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl

@@ -4,6 +4,10 @@ struct PhysicalMaterial {
 	float	specularRoughness;
 	vec3	specularColor;
 
+	#ifndef STANDARD
+		// future
+	#endif
+
 };
 
 void RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {

+ 0 - 4
src/renderers/shaders/ShaderChunk/lights_standard_fragment.glsl

@@ -1,4 +0,0 @@
-StandardMaterial material;
-material.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );
-material.specularRoughness = clamp( roughnessFactor, 0.04, 1.0 );
-material.specularColor = mix( vec3( 0.04 ), diffuseColor.rgb, metalnessFactor );

+ 0 - 50
src/renderers/shaders/ShaderChunk/lights_standard_pars_fragment.glsl

@@ -1,50 +0,0 @@
-struct StandardMaterial {
-
-	vec3	diffuseColor;
-	float	specularRoughness;
-	vec3	specularColor;
-
-};
-
-void RE_Direct_Standard( const in IncidentLight directLight, const in GeometricContext geometry, const in StandardMaterial material, inout ReflectedLight reflectedLight ) {
-
-	float dotNL = saturate( dot( geometry.normal, directLight.direction ) );
-
-	vec3 irradiance = dotNL * directLight.color;
-
-	#ifndef PHYSICALLY_CORRECT_LIGHTS
-
-		irradiance *= PI; // punctual light
-
-	#endif
-
-	reflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );
-
-	reflectedLight.directSpecular += irradiance * BRDF_Specular_GGX( directLight, geometry, material.specularColor, material.specularRoughness );
-
-}
-
-void RE_IndirectDiffuse_Standard( const in vec3 irradiance, const in GeometricContext geometry, const in StandardMaterial material, inout ReflectedLight reflectedLight ) {
-
-	reflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );
-
-}
-
-void RE_IndirectSpecular_Standard( const in vec3 radiance, const in GeometricContext geometry, const in StandardMaterial material, inout ReflectedLight reflectedLight ) {
-
-	reflectedLight.indirectSpecular += radiance * BRDF_Specular_GGX_Environment( geometry, material.specularColor, material.specularRoughness );
-
-}
-
-#define RE_Direct				RE_Direct_Standard
-#define RE_IndirectDiffuse		RE_IndirectDiffuse_Standard
-#define RE_IndirectSpecular		RE_IndirectSpecular_Standard
-
-#define Material_BlinnShininessExponent( material )   GGXRoughnessToBlinnExponent( material.specularRoughness )
-
-// ref: http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr_v2.pdf
-float computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {
-
-	return saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );
-
-}

+ 1 - 1
src/renderers/shaders/ShaderChunk/lights_template.glsl

@@ -109,7 +109,7 @@ IncidentLight directLight;
 
 	#endif
 
-	#if defined( USE_ENVMAP ) && defined( STANDARD ) && defined( ENVMAP_TYPE_CUBE_UV )
+	#if defined( USE_ENVMAP ) && defined( PHYSICAL ) && defined( ENVMAP_TYPE_CUBE_UV )
 
 		// TODO, replace 8 with the real maxMIPLevel
 	 	irradiance += getLightProbeIndirectIrradiance( /*lightProbe,*/ geometry, 8 );

+ 1 - 1
src/renderers/shaders/ShaderChunk/worldpos_vertex.glsl

@@ -1,4 +1,4 @@
-#if defined( USE_ENVMAP ) || defined( PHONG ) || defined( STANDARD ) || defined( LAMBERT ) || defined ( USE_SHADOWMAP )
+#if defined( USE_ENVMAP ) || defined( PHONG ) || defined( PHYSICAL ) || defined( LAMBERT ) || defined ( USE_SHADOWMAP )
 
 	#ifdef USE_SKINNING
 

+ 18 - 30
src/renderers/shaders/ShaderLib.js

@@ -98,36 +98,6 @@ THREE.ShaderLib = {
 
 		] ),
 
-		vertexShader: THREE.ShaderChunk[ 'meshstandard_vert' ],
-		fragmentShader: THREE.ShaderChunk[ 'meshstandard_frag' ]
-
-	},
-
-	'physical': {
-
-		uniforms: THREE.UniformsUtils.merge( [
-
-			THREE.UniformsLib[ 'common' ],
-			THREE.UniformsLib[ 'aomap' ],
-			THREE.UniformsLib[ 'lightmap' ],
-			THREE.UniformsLib[ 'emissivemap' ],
-			THREE.UniformsLib[ 'bumpmap' ],
-			THREE.UniformsLib[ 'normalmap' ],
-			THREE.UniformsLib[ 'displacementmap' ],
-			THREE.UniformsLib[ 'roughnessmap' ],
-			THREE.UniformsLib[ 'metalnessmap' ],
-			THREE.UniformsLib[ 'fog' ],
-			THREE.UniformsLib[ 'lights' ],
-
-			{
-				"emissive" : { type: "c", value: new THREE.Color( 0x000000 ) },
-				"roughness": { type: "1f", value: 0.5 },
-				"metalness": { type: "1f", value: 0 },
-				"envMapIntensity" : { type: "1f", value: 1 } // temporary
-			}
-
-		] ),
-
 		vertexShader: THREE.ShaderChunk[ 'meshphysical_vert' ],
 		fragmentShader: THREE.ShaderChunk[ 'meshphysical_frag' ]
 
@@ -240,3 +210,21 @@ THREE.ShaderLib = {
 	}
 
 };
+
+THREE.ShaderLib[ 'physical' ] = {
+
+	uniforms: THREE.UniformsUtils.merge( [
+
+		THREE.ShaderLib[ 'standard' ].uniforms,
+
+		{
+			// future
+		}
+
+	] ),
+
+	vertexShader: THREE.ShaderChunk[ 'meshphysical_vert' ],
+	fragmentShader: THREE.ShaderChunk[ 'meshphysical_frag' ]
+
+};
+

+ 0 - 1
src/renderers/shaders/ShaderLib/meshphysical_frag.glsl

@@ -1,4 +1,3 @@
-#define STANDARD
 #define PHYSICAL
 
 uniform vec3 diffuse;

+ 0 - 1
src/renderers/shaders/ShaderLib/meshphysical_vert.glsl

@@ -1,4 +1,3 @@
-#define STANDARD
 #define PHYSICAL
 
 varying vec3 vViewPosition;

+ 0 - 78
src/renderers/shaders/ShaderLib/meshstandard_frag.glsl

@@ -1,78 +0,0 @@
-#define STANDARD
-
-uniform vec3 diffuse;
-uniform vec3 emissive;
-uniform float roughness;
-uniform float metalness;
-uniform float opacity;
-
-uniform float envMapIntensity; // temporary
-
-varying vec3 vViewPosition;
-
-#ifndef FLAT_SHADED
-
-	varying vec3 vNormal;
-
-#endif
-
-#include <common>
-#include <packing>
-#include <color_pars_fragment>
-#include <uv_pars_fragment>
-#include <uv2_pars_fragment>
-#include <map_pars_fragment>
-#include <alphamap_pars_fragment>
-#include <aomap_pars_fragment>
-#include <lightmap_pars_fragment>
-#include <emissivemap_pars_fragment>
-#include <envmap_pars_fragment>
-#include <fog_pars_fragment>
-#include <bsdfs>
-#include <cube_uv_reflection_fragment>
-#include <lights_pars>
-#include <lights_standard_pars_fragment>
-#include <shadowmap_pars_fragment>
-#include <bumpmap_pars_fragment>
-#include <normalmap_pars_fragment>
-#include <roughnessmap_pars_fragment>
-#include <metalnessmap_pars_fragment>
-#include <logdepthbuf_pars_fragment>
-#include <clipping_planes_pars_fragment>
-
-void main() {
-
-	#include <clipping_planes_fragment>
-
-	vec4 diffuseColor = vec4( diffuse, opacity );
-	ReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );
-	vec3 totalEmissiveRadiance = emissive;
-
-	#include <logdepthbuf_fragment>
-	#include <map_fragment>
-	#include <color_fragment>
-	#include <alphamap_fragment>
-	#include <alphatest_fragment>
-	#include <specularmap_fragment>
-	#include <roughnessmap_fragment>
-	#include <metalnessmap_fragment>
-	#include <normal_fragment>
-	#include <emissivemap_fragment>
-
-	// accumulation
-	#include <lights_standard_fragment>
-	#include <lights_template>
-
-	// modulation
-	#include <aomap_fragment>
-
-	vec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;
-
-	gl_FragColor = vec4( outgoingLight, diffuseColor.a );
-
-	#include <premultiplied_alpha_fragment>
-	#include <tonemapping_fragment>
-	#include <encodings_fragment>
-	#include <fog_fragment>
-
-}

+ 0 - 54
src/renderers/shaders/ShaderLib/meshstandard_vert.glsl

@@ -1,54 +0,0 @@
-#define STANDARD
-
-varying vec3 vViewPosition;
-
-#ifndef FLAT_SHADED
-
-	varying vec3 vNormal;
-
-#endif
-
-#include <common>
-#include <uv_pars_vertex>
-#include <uv2_pars_vertex>
-#include <displacementmap_pars_vertex>
-#include <color_pars_vertex>
-#include <morphtarget_pars_vertex>
-#include <skinning_pars_vertex>
-#include <shadowmap_pars_vertex>
-#include <specularmap_pars_fragment>
-#include <logdepthbuf_pars_vertex>
-#include <clipping_planes_pars_vertex>
-
-void main() { // STANDARD
-
-	#include <uv_vertex>
-	#include <uv2_vertex>
-	#include <color_vertex>
-
-	#include <beginnormal_vertex>
-	#include <morphnormal_vertex>
-	#include <skinbase_vertex>
-	#include <skinnormal_vertex>
-	#include <defaultnormal_vertex>
-
-#ifndef FLAT_SHADED // Normal computed with derivatives when FLAT_SHADED
-
-	vNormal = normalize( transformedNormal );
-
-#endif
-
-	#include <begin_vertex>
-	#include <displacementmap_vertex>
-	#include <morphtarget_vertex>
-	#include <skinning_vertex>
-	#include <project_vertex>
-	#include <logdepthbuf_vertex>
-	#include <clipping_planes_vertex>
-
-	vViewPosition = - mvPosition.xyz;
-
-	#include <worldpos_vertex>
-	#include <shadowmap_vertex>
-
-}

+ 1 - 1
src/renderers/webgl/WebGLPrograms.js

@@ -8,7 +8,7 @@ THREE.WebGLPrograms = function ( renderer, capabilities ) {
 		MeshBasicMaterial: 'basic',
 		MeshLambertMaterial: 'lambert',
 		MeshPhongMaterial: 'phong',
-		MeshStandardMaterial: 'standard',
+		MeshStandardMaterial: 'physical',
 		MeshPhysicalMaterial: 'physical',
 		LineBasicMaterial: 'basic',
 		LineDashedMaterial: 'dashed',

+ 0 - 4
utils/build/includes/common.json

@@ -164,8 +164,6 @@
 	"src/renderers/shaders/ShaderChunk/lights_phong_pars_fragment.glsl",
 	"src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl",
 	"src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl",
-	"src/renderers/shaders/ShaderChunk/lights_standard_fragment.glsl",
-	"src/renderers/shaders/ShaderChunk/lights_standard_pars_fragment.glsl",
 	"src/renderers/shaders/ShaderChunk/lights_template.glsl",
 	"src/renderers/shaders/ShaderChunk/logdepthbuf_fragment.glsl",
 	"src/renderers/shaders/ShaderChunk/logdepthbuf_pars_fragment.glsl",
@@ -226,8 +224,6 @@
 	"src/renderers/shaders/ShaderLib/meshphong_vert.glsl",
 	"src/renderers/shaders/ShaderLib/meshphysical_frag.glsl",
 	"src/renderers/shaders/ShaderLib/meshphysical_vert.glsl",
-	"src/renderers/shaders/ShaderLib/meshstandard_frag.glsl",
-	"src/renderers/shaders/ShaderLib/meshstandard_vert.glsl",
 	"src/renderers/shaders/ShaderLib/normal_frag.glsl",
 	"src/renderers/shaders/ShaderLib/normal_vert.glsl",
 	"src/renderers/shaders/ShaderLib/points_frag.glsl",