Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

LightProbeHelper: Clean up #29166

Merged
merged 1 commit into from
Aug 18, 2024
Merged
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
85 changes: 42 additions & 43 deletions examples/jsm/helpers/LightProbeHelper.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,79 +20,78 @@ class LightProbeHelper extends Mesh {

},

vertexShader: [
vertexShader: /* glsl */`

'varying vec3 vNormal;',
varying vec3 vNormal;

'void main() {',
void main() {

' vNormal = normalize( normalMatrix * normal );',
vNormal = normalize( normalMatrix * normal );

' gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );',
gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );

'}',
}

].join( '\n' ),
`,

fragmentShader: [
fragmentShader: /* glsl */`

'#define RECIPROCAL_PI 0.318309886',
#define RECIPROCAL_PI 0.318309886

'vec3 inverseTransformDirection( in vec3 normal, in mat4 matrix ) {',
vec3 inverseTransformDirection( in vec3 normal, in mat4 matrix ) {

' // matrix is assumed to be orthogonal',
// matrix is assumed to be orthogonal

' return normalize( ( vec4( normal, 0.0 ) * matrix ).xyz );',
return normalize( ( vec4( normal, 0.0 ) * matrix ).xyz );

'}',
}

'// source: https://graphics.stanford.edu/papers/envmap/envmap.pdf',
'vec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) {',
// source: https://graphics.stanford.edu/papers/envmap/envmap.pdf,
vec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) {

' // normal is assumed to have unit length',
// normal is assumed to have unit length,

' float x = normal.x, y = normal.y, z = normal.z;',
float x = normal.x, y = normal.y, z = normal.z;

' // band 0',
' vec3 result = shCoefficients[ 0 ] * 0.886227;',
// band 0,
vec3 result = shCoefficients[ 0 ] * 0.886227;

' // band 1',
' result += shCoefficients[ 1 ] * 2.0 * 0.511664 * y;',
' result += shCoefficients[ 2 ] * 2.0 * 0.511664 * z;',
' result += shCoefficients[ 3 ] * 2.0 * 0.511664 * x;',
// band 1,
result += shCoefficients[ 1 ] * 2.0 * 0.511664 * y;
result += shCoefficients[ 2 ] * 2.0 * 0.511664 * z;
result += shCoefficients[ 3 ] * 2.0 * 0.511664 * x;

' // band 2',
' result += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y;',
' result += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z;',
' result += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 );',
' result += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z;',
' result += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y );',
// band 2,
result += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y;
result += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z;
result += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 );
result += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z;
result += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y );
return result;

' return result;',
}

'}',
uniform vec3 sh[ 9 ]; // sh coefficients

'uniform vec3 sh[ 9 ]; // sh coefficients',
uniform float intensity; // light probe intensity

'uniform float intensity; // light probe intensity',
varying vec3 vNormal;

'varying vec3 vNormal;',
void main() {

'void main() {',
vec3 normal = normalize( vNormal );

' vec3 normal = normalize( vNormal );',
vec3 worldNormal = inverseTransformDirection( normal, viewMatrix );

' vec3 worldNormal = inverseTransformDirection( normal, viewMatrix );',
vec3 irradiance = shGetIrradianceAt( worldNormal, sh );

' vec3 irradiance = shGetIrradianceAt( worldNormal, sh );',
vec3 outgoingLight = RECIPROCAL_PI * irradiance * intensity;

' vec3 outgoingLight = RECIPROCAL_PI * irradiance * intensity;',
gl_FragColor = linearToOutputTexel( vec4( outgoingLight, 1.0 ) );

' gl_FragColor = linearToOutputTexel( vec4( outgoingLight, 1.0 ) );',
}

'}'

].join( '\n' )
`,

} );

Expand Down