Skip to content

Commit

Permalink
Merge pull request #7324 from bhouston/simplified_lighting
Browse files Browse the repository at this point in the history
attempt to simplify the phong shaders and lights.
  • Loading branch information
mrdoob committed Oct 26, 2015
2 parents 4c620eb + 6737d10 commit d09017f
Show file tree
Hide file tree
Showing 24 changed files with 881 additions and 908 deletions.
128 changes: 19 additions & 109 deletions examples/js/ShaderSkin.js
Original file line number Diff line number Diff line change
Expand Up @@ -80,35 +80,11 @@ THREE.ShaderSkin = {
"varying vec3 vNormal;",
"varying vec2 vUv;",

"uniform vec3 ambientLightColor;",

"#if MAX_DIR_LIGHTS > 0",

"uniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];",
"uniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];",

"#endif",

"#if MAX_HEMI_LIGHTS > 0",

"uniform vec3 hemisphereLightSkyColor[ MAX_HEMI_LIGHTS ];",
"uniform vec3 hemisphereLightGroundColor[ MAX_HEMI_LIGHTS ];",
"uniform vec3 hemisphereLightDirection[ MAX_HEMI_LIGHTS ];",

"#endif",

"#if MAX_POINT_LIGHTS > 0",

"uniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];",
"uniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];",
"uniform float pointLightDistance[ MAX_POINT_LIGHTS ];",
"uniform float pointLightDecay[ MAX_POINT_LIGHTS ];",

"#endif",

"varying vec3 vViewPosition;",

THREE.ShaderChunk[ "common" ],
THREE.ShaderChunk[ "bsdfs" ],
THREE.ShaderChunk[ "lights_pars" ],
THREE.ShaderChunk[ "shadowmap_pars_fragment" ],
THREE.ShaderChunk[ "fog_pars_fragment" ],
THREE.ShaderChunk[ "bumpmap_pars_fragment" ],
Expand Down Expand Up @@ -198,9 +174,9 @@ THREE.ShaderSkin = {

"for ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {",

"vec3 lVector = pointLightPosition[ i ] + vViewPosition.xyz;",
"vec3 lVector = pointLights[ i ].position + vViewPosition.xyz;",

"float attenuation = calcLightAttenuation( length( lVector ), pointLightDistance[ i ], pointLightDecay[i] );",
"float attenuation = calcLightAttenuation( length( lVector ), pointLights[ i ].distance, pointLights[ i ].decay );",

"lVector = normalize( lVector );",

Expand All @@ -210,8 +186,8 @@ THREE.ShaderSkin = {

"float pointSpecularWeight = KS_Skin_Specular( normal, lVector, viewerDirection, uRoughness, uSpecularBrightness );",

"totalDiffuseLight += pointLightColor[ i ] * ( pointDiffuseWeight * attenuation );",
"totalSpecularLight += pointLightColor[ i ] * specular * ( pointSpecularWeight * specularStrength * attenuation );",
"totalDiffuseLight += pointLight[ i ].color * ( pointDiffuseWeight * attenuation );",
"totalSpecularLight += pointLight[ i ].color * specular * ( pointSpecularWeight * specularStrength * attenuation );",

"}",

Expand All @@ -223,16 +199,16 @@ THREE.ShaderSkin = {

"for( int i = 0; i < MAX_DIR_LIGHTS; i++ ) {",

"vec3 dirVector = directionalLightDirection[ i ];",
"vec3 dirVector = directionalLights[ i ].direction;",

"float dirDiffuseWeightFull = max( dot( normal, dirVector ), 0.0 );",
"float dirDiffuseWeightHalf = max( 0.5 * dot( normal, dirVector ) + 0.5, 0.0 );",
"vec3 dirDiffuseWeight = mix( vec3 ( dirDiffuseWeightFull ), vec3( dirDiffuseWeightHalf ), uWrapRGB );",

"float dirSpecularWeight = KS_Skin_Specular( normal, dirVector, viewerDirection, uRoughness, uSpecularBrightness );",

"totalDiffuseLight += directionalLightColor[ i ] * dirDiffuseWeight;",
"totalSpecularLight += directionalLightColor[ i ] * ( dirSpecularWeight * specularStrength );",
"totalDiffuseLight += directionalLights[ i ].color * dirDiffuseWeight;",
"totalSpecularLight += directionalLights[ i ].color * ( dirSpecularWeight * specularStrength );",

"}",

Expand Down Expand Up @@ -394,21 +370,10 @@ THREE.ShaderSkin = {
"varying vec3 vNormal;",
"varying vec2 vUv;",

"uniform vec3 ambientLightColor;",

"#if MAX_DIR_LIGHTS > 0",
"uniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];",
"uniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];",
"#endif",

"#if MAX_POINT_LIGHTS > 0",
"uniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];",
"varying vec4 vPointLight[ MAX_POINT_LIGHTS ];",
"#endif",

"varying vec3 vViewPosition;",

THREE.ShaderChunk[ "common" ],
THREE.ShaderChunk[ "lights_pars" ],
THREE.ShaderChunk[ "fog_pars_fragment" ],

"float fresnelReflectance( vec3 H, vec3 V, float F0 ) {",
Expand Down Expand Up @@ -490,12 +455,12 @@ THREE.ShaderSkin = {
"#if MAX_POINT_LIGHTS > 0",

"for ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {",

"vec3 pointVector = normalize( vPointLight[ i ].xyz );",
"float attenuation = vPointLight[ i ].w;",

"vec3 pointVector = normalize( pointLights[ i ].direction );",
"float attenuation = calcLightAttenuation( length( lVector ), pointLights[ i ].distance, pointLights[ i ].decay );",
"float pointDiffuseWeight = max( dot( normal, pointVector ), 0.0 );",

"totalDiffuseLight += pointLightColor[ i ] * ( pointDiffuseWeight * attenuation );",

"if ( passID == 1 ) {",
Expand All @@ -516,17 +481,18 @@ THREE.ShaderSkin = {

"for( int i = 0; i < MAX_DIR_LIGHTS; i++ ) {",

"vec3 dirVector = directionalLightDirection[ i ];",
"vec3 dirVector = directionalLights[ i ].direction;",

"float dirDiffuseWeight = max( dot( normal, dirVector ), 0.0 );",

"totalDiffuseLight += directionalLightColor[ i ] * dirDiffuseWeight;",

"totalDiffuseLight += directionalLights[ i ].color * dirDiffuseWeight;",

"if ( passID == 1 ) {",

"float dirSpecularWeight = KS_Skin_Specular( normal, dirVector, viewerDirection, uRoughness, uSpecularBrightness );",

"totalSpecularLight += directionalLightColor[ i ] * mSpecular.xyz * dirSpecularWeight;",
"totalSpecularLight += directionalLights[ i ].color * mSpecular.xyz * dirSpecularWeight;",

"}",

Expand Down Expand Up @@ -607,16 +573,6 @@ THREE.ShaderSkin = {
"varying vec3 vNormal;",
"varying vec2 vUv;",

"#if MAX_POINT_LIGHTS > 0",

"uniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];",
"uniform float pointLightDistance[ MAX_POINT_LIGHTS ];",
"uniform float pointLightDecay[ MAX_POINT_LIGHTS ];",

"varying vec4 vPointLight[ MAX_POINT_LIGHTS ];",

"#endif",

"varying vec3 vViewPosition;",

THREE.ShaderChunk[ "common" ],
Expand All @@ -633,24 +589,6 @@ THREE.ShaderSkin = {

"vUv = uv;",

// point lights

"#if MAX_POINT_LIGHTS > 0",

"for( int i = 0; i < MAX_POINT_LIGHTS; i++ ) {",

"vec3 lVector = pointLightPosition[ i ] - vViewPosition;",

"float attenuation = calcLightAttenuation( length( lVector ), pointLightDistance[ i ], pointLightDecay[i] );",

"lVector = normalize( lVector );",

"vPointLight[ i ] = vec4( lVector, attenuation );",

"}",

"#endif",

// displacement mapping

"#ifdef VERTEX_TEXTURES",
Expand All @@ -675,16 +613,6 @@ THREE.ShaderSkin = {
"varying vec3 vNormal;",
"varying vec2 vUv;",

"#if MAX_POINT_LIGHTS > 0",

"uniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];",
"uniform float pointLightDistance[ MAX_POINT_LIGHTS ];",
"uniform float pointLightDecay[ MAX_POINT_LIGHTS ];",

"varying vec4 vPointLight[ MAX_POINT_LIGHTS ];",

"#endif",

"varying vec3 vViewPosition;",

THREE.ShaderChunk[ "common" ],
Expand All @@ -701,24 +629,6 @@ THREE.ShaderSkin = {

"vUv = uv;",

// point lights

"#if MAX_POINT_LIGHTS > 0",

"for( int i = 0; i < MAX_POINT_LIGHTS; i++ ) {",

"vec3 lVector = pointLightPosition[ i ] - vViewPosition;",

"float attenuation = calcLightAttenuation( length( lVector ), pointLightDistance[ i ], pointLightDecay[i] );",

"lVector = normalize( lVector );",

"vPointLight[ i ] = vec4( lVector, attenuation );",

"}",

"#endif",

"gl_Position = vec4( uv.x * 2.0 - 1.0, uv.y * 2.0 - 1.0, 0.0, 1.0 );",

"}"
Expand Down
44 changes: 11 additions & 33 deletions examples/js/ShaderTerrain.js
Original file line number Diff line number Diff line change
Expand Up @@ -86,33 +86,11 @@ THREE.ShaderTerrain = {

"uniform vec3 ambientLightColor;",

"#if MAX_DIR_LIGHTS > 0",

"uniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];",
"uniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];",

"#endif",

"#if MAX_HEMI_LIGHTS > 0",

"uniform vec3 hemisphereLightSkyColor[ MAX_HEMI_LIGHTS ];",
"uniform vec3 hemisphereLightGroundColor[ MAX_HEMI_LIGHTS ];",
"uniform vec3 hemisphereLightDirection[ MAX_HEMI_LIGHTS ];",

"#endif",

"#if MAX_POINT_LIGHTS > 0",

"uniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];",
"uniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];",
"uniform float pointLightDistance[ MAX_POINT_LIGHTS ];",
"uniform float pointLightDecay[ MAX_POINT_LIGHTS ];",

"#endif",

"varying vec3 vViewPosition;",

THREE.ShaderChunk[ "common" ],
THREE.ShaderChunk[ "bsdfs" ],
THREE.ShaderChunk[ "lights_pars" ],
THREE.ShaderChunk[ "shadowmap_pars_fragment" ],
THREE.ShaderChunk[ "fog_pars_fragment" ],

Expand Down Expand Up @@ -168,9 +146,9 @@ THREE.ShaderTerrain = {

"for ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {",

"vec3 lVector = pointLightPosition[ i ] + vViewPosition.xyz;",
"vec3 lVector = pointLights[ i ].position + vViewPosition.xyz;",

"float attenuation = calcLightAttenuation( length( lVector ), pointLightDistance[ i ], pointLightDecay[i] );",
"float attenuation = calcLightAttenuation( length( lVector ), pointLights[ i ].distance, pointLights[ i ].decay );",

"lVector = normalize( lVector );",

Expand All @@ -181,8 +159,8 @@ THREE.ShaderTerrain = {

"float pointSpecularWeight = specularTex.r * max( pow( pointDotNormalHalf, shininess ), 0.0 );",

"totalDiffuseLight += attenuation * pointLightColor[ i ] * pointDiffuseWeight;",
"totalSpecularLight += attenuation * pointLightColor[ i ] * specular * pointSpecularWeight * pointDiffuseWeight;",
"totalDiffuseLight += attenuation * pointLights[ i ].color * pointDiffuseWeight;",
"totalSpecularLight += attenuation * pointLights[ i ].color * specular * pointSpecularWeight * pointDiffuseWeight;",

"}",

Expand All @@ -197,16 +175,16 @@ THREE.ShaderTerrain = {

"for( int i = 0; i < MAX_DIR_LIGHTS; i++ ) {",

"vec3 dirVector = directionalLightDirection[ i ];",
"vec3 dirVector = directionalLights[ i ].direction;",
"vec3 dirHalfVector = normalize( dirVector + viewPosition );",

"float dirDotNormalHalf = max( dot( normal, dirHalfVector ), 0.0 );",
"float dirDiffuseWeight = max( dot( normal, dirVector ), 0.0 );",

"float dirSpecularWeight = specularTex.r * max( pow( dirDotNormalHalf, shininess ), 0.0 );",

"totalDiffuseLight += directionalLightColor[ i ] * dirDiffuseWeight;",
"totalSpecularLight += directionalLightColor[ i ] * specular * dirSpecularWeight * dirDiffuseWeight;",
"totalDiffuseLight += directionalLights[ i ].color * dirDiffuseWeight;",
"totalSpecularLight += directionalLights[ i ].color * specular * dirSpecularWeight * dirDiffuseWeight;",

"}",

Expand All @@ -228,7 +206,7 @@ THREE.ShaderTerrain = {
"float dotProduct = dot( normal, lVector );",
"float hemiDiffuseWeight = 0.5 * dotProduct + 0.5;",

"totalDiffuseLight += mix( hemisphereLightGroundColor[ i ], hemisphereLightSkyColor[ i ], hemiDiffuseWeight );",
"totalDiffuseLight += mix( hemisphereLights[ i ].groundColor, hemisphereLights[ i ].skyColor, hemiDiffuseWeight );",

// specular (sky light)

Expand All @@ -246,7 +224,7 @@ THREE.ShaderTerrain = {
"float hemiDotNormalHalfGround = 0.5 * dot( normal, hemiHalfVectorGround ) + 0.5;",
"hemiSpecularWeight += specularTex.r * max( pow( hemiDotNormalHalfGround, shininess ), 0.0 );",

"totalSpecularLight += specular * mix( hemisphereLightGroundColor[ i ], hemisphereLightSkyColor[ i ], hemiDiffuseWeight ) * hemiSpecularWeight * hemiDiffuseWeight;",
"totalSpecularLight += specular * mix( hemisphereLights[ i ].groundColor, hemisphereLights[ i ].skyColor, hemiDiffuseWeight ) * hemiSpecularWeight * hemiDiffuseWeight;",

"}",

Expand Down
2 changes: 2 additions & 0 deletions examples/webgl_animation_skinning_morph.html
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,8 @@
var loader = new THREE.JSONLoader();
loader.load( "models/skinned/knight.js", function ( geometry, materials ) {

console.log( 'materials', materials );

createScene( geometry, materials, 0, FLOOR, -300, 60 )

// GUI
Expand Down
2 changes: 1 addition & 1 deletion examples/webgl_lights_pointlights.html
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@

var callback = function( geometry ) {

object = new THREE.Mesh( geometry, new THREE.MeshPhongMaterial( { color: 0x555555, specular: 0xffffff, shininess: 50 } ) );
object = new THREE.Mesh( geometry, new THREE.MeshPhongMaterial( { color: 0x555555, specular: 0x111111, shininess: 50 } ) );
object.scale.x = object.scale.y = object.scale.z = 0.80;
scene.add( object );

Expand Down
13 changes: 9 additions & 4 deletions examples/webgl_materials_lambert_variations.html
Original file line number Diff line number Diff line change
Expand Up @@ -88,24 +88,29 @@

var geometry = new THREE.SphereBufferGeometry( sphereRadius, 32, 16 );


for( var alpha = 0; alpha <= 1.0; alpha += stepSize ) {
for( var alpha = 0, alphaIndex = 0; alpha <= 1.0; alpha += stepSize, alphaIndex ++ ) {

var baseColor = new THREE.Color().setHSL( alpha, 0.5, 0.5 );

if( alpha >= 0.5 ) {
reflectionCube = null;
}

for( var beta = 0; beta <= 1.0; beta += stepSize ) {
for( var beta = 0, betaIndex = 0; beta <= 1.0; beta += stepSize, betaIndex ++ ) {

var reflectivity = beta;

var side = THREE.FrontSide;
if( ( betaIndex % 2 ) === 0 ) {
side = THREE.DoubleSide;
}

for( var gamma = 0; gamma <= 1.0; gamma += stepSize ) {

var diffuseColor = baseColor.clone().multiplyScalar( gamma );

var material = new THREE.MeshLambertMaterial( { map: imgTexture, color: diffuseColor, reflectivity: reflectivity, shading: THREE.SmoothShading, envMap: reflectionCube } )
var material = new THREE.MeshLambertMaterial( { map: imgTexture, color: diffuseColor,
reflectivity: reflectivity, envMap: reflectionCube, side: side } )

var mesh = new THREE.Mesh( geometry, material );

Expand Down
Loading

0 comments on commit d09017f

Please sign in to comment.