Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 21 additions & 21 deletions examples/jsm/csm/CSMShader.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,20 @@ import { ShaderChunk } from 'three';

const CSMShader = {
lights_fragment_begin: /* glsl */`
GeometricContext geometry;
vec3 geometryPosition = - vViewPosition;
vec3 geometryNormal = normal;
vec3 geometryViewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );

geometry.position = - vViewPosition;
geometry.normal = normal;
geometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );
vec3 geometryClearcoatNormal;

#ifdef USE_CLEARCOAT

geometry.clearcoatNormal = clearcoatNormal;
geometryClearcoatNormal = clearcoatNormal;

#endif

#ifdef USE_IRIDESCENCE
float dotNVi = saturate( dot( normal, geometry.viewDir ) );
float dotNVi = saturate( dot( normal, geometryViewDir ) );
if ( material.iridescenceThickness == 0.0 ) {
material.iridescence = 0.0;
} else {
Expand All @@ -42,14 +42,14 @@ IncidentLight directLight;

pointLight = pointLights[ i ];

getPointLightInfo( pointLight, geometry, directLight );
getPointLightInfo( pointLight, geometryPosition, directLight );

#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS )
pointLightShadow = pointLightShadows[ i ];
directLight.color *= ( directLight.visible && receiveShadow ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;
#endif

RE_Direct( directLight, geometry, material, reflectedLight );
RE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );

}
#pragma unroll_loop_end
Expand All @@ -72,7 +72,7 @@ IncidentLight directLight;

spotLight = spotLights[ i ];

getSpotLightInfo( spotLight, geometry, directLight );
getSpotLightInfo( spotLight, geometryPosition, directLight );

// spot lights are ordered [shadows with maps, shadows without maps, maps without shadows, none]
#if ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )
Expand All @@ -96,7 +96,7 @@ IncidentLight directLight;

#endif

RE_Direct( directLight, geometry, material, reflectedLight );
RE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );

}
#pragma unroll_loop_end
Expand All @@ -123,7 +123,7 @@ IncidentLight directLight;
for ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {

directionalLight = directionalLights[ i ];
getDirectionalLightInfo( directionalLight, geometry, directLight );
getDirectionalLightInfo( directionalLight, directLight );

#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )
// NOTE: Depth gets larger away from the camera.
Expand All @@ -147,7 +147,7 @@ IncidentLight directLight;
directLight.color = mix( prevColor, directLight.color, shouldFadeLastCascade ? ratio : 1.0 );

ReflectedLight prevLight = reflectedLight;
RE_Direct( directLight, geometry, material, reflectedLight );
RE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );

bool shouldBlend = UNROLLED_LOOP_INDEX != CSM_CASCADES - 1 || UNROLLED_LOOP_INDEX == CSM_CASCADES - 1 && linearDepth < cascadeCenter;
float blendRatio = shouldBlend ? ratio : 1.0;
Expand All @@ -168,14 +168,14 @@ IncidentLight directLight;
for ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {

directionalLight = directionalLights[ i ];
getDirectionalLightInfo( directionalLight, geometry, directLight );
getDirectionalLightInfo( directionalLight, directLight );

#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )

directionalLightShadow = directionalLightShadows[ i ];
if(linearDepth >= CSM_cascades[UNROLLED_LOOP_INDEX].x && linearDepth < CSM_cascades[UNROLLED_LOOP_INDEX].y) directLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;

if(linearDepth >= CSM_cascades[UNROLLED_LOOP_INDEX].x && (linearDepth < CSM_cascades[UNROLLED_LOOP_INDEX].y || UNROLLED_LOOP_INDEX == CSM_CASCADES - 1)) RE_Direct( directLight, geometry, material, reflectedLight );
if(linearDepth >= CSM_cascades[UNROLLED_LOOP_INDEX].x && (linearDepth < CSM_cascades[UNROLLED_LOOP_INDEX].y || UNROLLED_LOOP_INDEX == CSM_CASCADES - 1)) RE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );

#endif

Expand All @@ -192,9 +192,9 @@ IncidentLight directLight;

directionalLight = directionalLights[ i ];

getDirectionalLightInfo( directionalLight, geometry, directLight );
getDirectionalLightInfo( directionalLight, directLight );

RE_Direct( directLight, geometry, material, reflectedLight );
RE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );

}
#pragma unroll_loop_end
Expand All @@ -216,14 +216,14 @@ IncidentLight directLight;

directionalLight = directionalLights[ i ];

getDirectionalLightInfo( directionalLight, geometry, directLight );
getDirectionalLightInfo( directionalLight, directLight );

#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )
directionalLightShadow = directionalLightShadows[ i ];
directLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;
#endif

RE_Direct( directLight, geometry, material, reflectedLight );
RE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );

}
#pragma unroll_loop_end
Expand All @@ -238,7 +238,7 @@ IncidentLight directLight;
for ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {

rectAreaLight = rectAreaLights[ i ];
RE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );
RE_Direct_RectArea( rectAreaLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );

}
#pragma unroll_loop_end
Expand All @@ -253,7 +253,7 @@ IncidentLight directLight;

#if defined( USE_LIGHT_PROBES )

irradiance += getLightProbeIrradiance( lightProbe, geometry.normal );
irradiance += getLightProbeIrradiance( lightProbe, geometryNormal );

#endif

Expand All @@ -262,7 +262,7 @@ IncidentLight directLight;
#pragma unroll_loop_start
for ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {

irradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry.normal );
irradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometryNormal );

}
#pragma unroll_loop_end
Expand Down
32 changes: 14 additions & 18 deletions examples/jsm/materials/MeshGouraudMaterial.js
Original file line number Diff line number Diff line change
Expand Up @@ -74,15 +74,11 @@ const GouraudShader = {

vec3 diffuse = vec3( 1.0 );

GeometricContext geometry;
geometry.position = mvPosition.xyz;
geometry.normal = normalize( transformedNormal );
geometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( -mvPosition.xyz );
vec3 geometryPosition = mvPosition.xyz;
vec3 geometryNormal = normalize( transformedNormal );
vec3 geometryViewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( -mvPosition.xyz );

GeometricContext backGeometry;
backGeometry.position = geometry.position;
backGeometry.normal = -geometry.normal;
backGeometry.viewDir = geometry.viewDir;
vec3 backGeometryNormal = - geometryNormal;

vLightFront = vec3( 0.0 );
vIndirectFront = vec3( 0.0 );
Expand All @@ -99,7 +95,7 @@ const GouraudShader = {

#if defined( USE_LIGHT_PROBES )

vIndirectFront += getLightProbeIrradiance( lightProbe, geometry.normal );
vIndirectFront += getLightProbeIrradiance( lightProbe, geometryNormal );

#endif

Expand All @@ -109,7 +105,7 @@ const GouraudShader = {

#if defined( USE_LIGHT_PROBES )

vIndirectBack += getLightProbeIrradiance( lightProbe, backGeometry.normal );
vIndirectBack += getLightProbeIrradiance( lightProbe, backGeometryNormal );

#endif

Expand All @@ -120,9 +116,9 @@ const GouraudShader = {
#pragma unroll_loop_start
for ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {

getPointLightInfo( pointLights[ i ], geometry, directLight );
getPointLightInfo( pointLights[ i ], geometryPosition, directLight );

dotNL = dot( geometry.normal, directLight.direction );
dotNL = dot( geometryNormal, directLight.direction );
directLightColor_Diffuse = directLight.color;

vLightFront += saturate( dotNL ) * directLightColor_Diffuse;
Expand All @@ -143,9 +139,9 @@ const GouraudShader = {
#pragma unroll_loop_start
for ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {

getSpotLightInfo( spotLights[ i ], geometry, directLight );
getSpotLightInfo( spotLights[ i ], geometryPosition, directLight );

dotNL = dot( geometry.normal, directLight.direction );
dotNL = dot( geometryNormal, directLight.direction );
directLightColor_Diffuse = directLight.color;

vLightFront += saturate( dotNL ) * directLightColor_Diffuse;
Expand All @@ -165,9 +161,9 @@ const GouraudShader = {
#pragma unroll_loop_start
for ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {

getDirectionalLightInfo( directionalLights[ i ], geometry, directLight );
getDirectionalLightInfo( directionalLights[ i ], directLight );

dotNL = dot( geometry.normal, directLight.direction );
dotNL = dot( geometryNormal, directLight.direction );
directLightColor_Diffuse = directLight.color;

vLightFront += saturate( dotNL ) * directLightColor_Diffuse;
Expand All @@ -188,11 +184,11 @@ const GouraudShader = {
#pragma unroll_loop_start
for ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {

vIndirectFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry.normal );
vIndirectFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometryNormal );

#ifdef DOUBLE_SIDED

vIndirectBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry.normal );
vIndirectBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometryNormal );

#endif

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -220,7 +220,7 @@ class WebGLNodeBuilder extends NodeBuilder {
this.addSlot( 'fragment', new SlotNode( {
node: material.clearcoatNormalNode,
nodeType: 'vec3',
source: 'vec3 clearcoatNormal = geometryNormal;',
source: 'vec3 clearcoatNormal = nonPerturbedNormal;',
target: 'vec3 clearcoatNormal = %RESULT%;'
} ) );

Expand Down
8 changes: 4 additions & 4 deletions examples/jsm/shaders/MMDToonShader.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,17 +27,17 @@ struct BlinnPhongMaterial {

};

void RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {
void RE_Direct_BlinnPhong( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {

vec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;
vec3 irradiance = getGradientIrradiance( geometryNormal, directLight.direction ) * directLight.color;

reflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );

reflectedLight.directSpecular += irradiance * BRDF_BlinnPhong( directLight.direction, geometry.viewDir, geometry.normal, material.specularColor, material.specularShininess ) * material.specularStrength;
reflectedLight.directSpecular += irradiance * BRDF_BlinnPhong( directLight.direction, geometryViewDir, geometryNormal, material.specularColor, material.specularShininess ) * material.specularStrength;

}

void RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {
void RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {

reflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );

Expand Down
12 changes: 6 additions & 6 deletions examples/jsm/shaders/SubsurfaceScatteringShader.js
Original file line number Diff line number Diff line change
Expand Up @@ -57,10 +57,10 @@ const SubsurfaceScatteringShader = {
'uniform float thicknessAttenuation;',
'uniform vec3 thicknessColor;',

'void RE_Direct_Scattering(const in IncidentLight directLight, const in vec2 uv, const in GeometricContext geometry, inout ReflectedLight reflectedLight) {',
'void RE_Direct_Scattering(const in IncidentLight directLight, const in vec2 uv, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, inout ReflectedLight reflectedLight) {',
' vec3 thickness = thicknessColor * texture2D(thicknessMap, uv).r;',
' vec3 scatteringHalf = normalize(directLight.direction + (geometry.normal * thicknessDistortion));',
' float scatteringDot = pow(saturate(dot(geometry.viewDir, -scatteringHalf)), thicknessPower) * thicknessScale;',
' vec3 scatteringHalf = normalize(directLight.direction + (geometryNormal * thicknessDistortion));',
' float scatteringDot = pow(saturate(dot(geometryViewDir, -scatteringHalf)), thicknessPower) * thicknessScale;',
' vec3 scatteringIllu = (scatteringDot + thicknessAmbient) * thickness;',
' reflectedLight.directDiffuse += scatteringIllu * thicknessAttenuation * directLight.color;',
'}',
Expand All @@ -69,12 +69,12 @@ const SubsurfaceScatteringShader = {

replaceAll(
ShaderChunk[ 'lights_fragment_begin' ],
'RE_Direct( directLight, geometry, material, reflectedLight );',
'RE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );',
[
'RE_Direct( directLight, geometry, material, reflectedLight );',
'RE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );',

'#if defined( SUBSURFACE ) && defined( USE_UV )',
' RE_Direct_Scattering(directLight, vUv, geometry, reflectedLight);',
' RE_Direct_Scattering(directLight, vUv, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, reflectedLight);',
'#endif',
].join( '\n' )
),
Expand Down
2 changes: 1 addition & 1 deletion src/renderers/shaders/ShaderChunk/aomap_fragment.glsl.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ export default /* glsl */`

#if defined( USE_ENVMAP ) && defined( STANDARD )

float dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );
float dotNV = saturate( dot( geometryNormal, geometryViewDir ) );

reflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.roughness );

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
export default /* glsl */`
#ifdef USE_CLEARCOAT

vec3 clearcoatNormal = geometryNormal;
vec3 clearcoatNormal = nonPerturbedNormal;

#endif
`;
9 changes: 0 additions & 9 deletions src/renderers/shaders/ShaderChunk/common.glsl.js
Original file line number Diff line number Diff line change
Expand Up @@ -52,15 +52,6 @@ struct ReflectedLight {
vec3 indirectSpecular;
};

struct GeometricContext {
vec3 position;
vec3 normal;
vec3 viewDir;
#ifdef USE_CLEARCOAT
vec3 clearcoatNormal;
#endif
};

#ifdef USE_ALPHAHASH

varying vec3 vPosition;
Expand Down
Loading