-
-
Notifications
You must be signed in to change notification settings - Fork 35.4k
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
Examples: Add ground projected env map #24311
Merged
Mugen87
merged 19 commits into
mrdoob:dev
from
FarazzShaikh:feat/envmaps-ground-projected
Jul 19, 2022
Merged
Changes from all commits
Commits
Show all changes
19 commits
Select commit
Hold shift + click to select a range
cc91a9c
Add ground projected env map
FarazzShaikh 4df968d
fix: Update screenshot
FarazzShaikh fc2364c
fix: Fix imports
FarazzShaikh 6e1150c
fix: reset build and lock files
FarazzShaikh bd07f6a
Update webgl_materials_envmaps_ground-projected.html
Mugen87 e70966e
fix: lint
FarazzShaikh 02ec3cf
Merge branch 'feat/envmaps-ground-projected' of github.com:FarazzShai…
FarazzShaikh b50d4c5
feat: Add car to and limit GPU/camera in ground projected env example
FarazzShaikh c86f8ea
Reset files.json
FarazzShaikh 8b4f902
add webgl_materials_envmaps_ground-projected to files.json
FarazzShaikh 9796aaf
fix: glsl formatting in GroundProjectedEnv class
FarazzShaikh 40a79aa
Update screenshot for webgl_materials_envmaps_ground-projected
FarazzShaikh 619cc6a
lint fix
FarazzShaikh 59137e0
Restrict controls furthur
FarazzShaikh 8bf0e69
Merge branch 'dev' into feat/envmaps-ground-projected
FarazzShaikh 76e4654
Lint GLSL and example
FarazzShaikh 990ebed
Add rotation option; Move class to examples/objects
FarazzShaikh 28f5c8b
remove rotation option
FarazzShaikh d11e62b
Merge branch 'dev' into feat/envmaps-ground-projected
FarazzShaikh File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,186 @@ | ||
import { Mesh, IcosahedronGeometry, ShaderMaterial, DoubleSide } from 'three'; | ||
|
||
/** | ||
* Ground projected env map adapted from @react-three/drei. | ||
* https://github.com/pmndrs/drei/blob/master/src/core/Environment.tsx | ||
*/ | ||
export class GroundProjectedEnv extends Mesh { | ||
|
||
constructor( texture, options ) { | ||
|
||
const isCubeMap = texture.isCubeTexture; | ||
const w = | ||
( isCubeMap ? texture.image[ 0 ]?.width : texture.image.width ) ?? 1024; | ||
const cubeSize = w / 4; | ||
const _lodMax = Math.floor( Math.log2( cubeSize ) ); | ||
const _cubeSize = Math.pow( 2, _lodMax ); | ||
const width = 3 * Math.max( _cubeSize, 16 * 7 ); | ||
const height = 4 * _cubeSize; | ||
|
||
const defines = [ | ||
isCubeMap ? '#define ENVMAP_TYPE_CUBE' : '', | ||
`#define CUBEUV_TEXEL_WIDTH ${1.0 / width}`, | ||
`#define CUBEUV_TEXEL_HEIGHT ${1.0 / height}`, | ||
`#define CUBEUV_MAX_MIP ${_lodMax}.0`, | ||
]; | ||
|
||
const vertexShader = /* glsl */ ` | ||
varying vec3 vWorldPosition; | ||
|
||
void main() | ||
{ | ||
|
||
vec4 worldPosition = ( modelMatrix * vec4( position, 1.0 ) ); | ||
vWorldPosition = worldPosition.xyz; | ||
|
||
gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 ); | ||
|
||
} | ||
`; | ||
const fragmentShader = defines.join( '\n' ) + /* glsl */ ` | ||
#define ENVMAP_TYPE_CUBE_UV | ||
|
||
varying vec3 vWorldPosition; | ||
|
||
uniform float radius; | ||
uniform float height; | ||
uniform float angle; | ||
|
||
#ifdef ENVMAP_TYPE_CUBE | ||
|
||
uniform samplerCube map; | ||
|
||
#else | ||
|
||
uniform sampler2D map; | ||
|
||
#endif | ||
|
||
// From: https://www.shadertoy.com/view/4tsBD7 | ||
float diskIntersectWithBackFaceCulling( vec3 ro, vec3 rd, vec3 c, vec3 n, float r ) | ||
{ | ||
|
||
float d = dot ( rd, n ); | ||
|
||
if( d > 0.0 ) { return 1e6; } | ||
|
||
vec3 o = ro - c; | ||
float t = - dot( n, o ) / d; | ||
vec3 q = o + rd * t; | ||
|
||
return ( dot( q, q ) < r * r ) ? t : 1e6; | ||
|
||
} | ||
|
||
// From: https://www.iquilezles.org/www/articles/intersectors/intersectors.htm | ||
float sphereIntersect( vec3 ro, vec3 rd, vec3 ce, float ra ) | ||
{ | ||
|
||
vec3 oc = ro - ce; | ||
float b = dot( oc, rd ); | ||
float c = dot( oc, oc ) - ra * ra; | ||
float h = b * b - c; | ||
|
||
if( h < 0.0 ) { return -1.0; } | ||
|
||
h = sqrt( h ); | ||
|
||
return - b + h; | ||
|
||
} | ||
|
||
vec3 project() | ||
{ | ||
|
||
vec3 p = normalize( vWorldPosition ); | ||
vec3 camPos = cameraPosition; | ||
camPos.y -= height; | ||
|
||
float intersection = sphereIntersect( camPos, p, vec3( 0.0 ), radius ); | ||
if( intersection > 0.0 ) { | ||
|
||
vec3 h = vec3( 0.0, - height, 0.0 ); | ||
float intersection2 = diskIntersectWithBackFaceCulling( camPos, p, h, vec3( 0.0, 1.0, 0.0 ), radius ); | ||
p = ( camPos + min( intersection, intersection2 ) * p ) / radius; | ||
|
||
} else { | ||
|
||
p = vec3( 0.0, 1.0, 0.0 ); | ||
|
||
} | ||
|
||
return p; | ||
|
||
} | ||
|
||
#include <common> | ||
#include <cube_uv_reflection_fragment> | ||
|
||
void main() | ||
{ | ||
|
||
vec3 projectedWorldPosition = project(); | ||
|
||
#ifdef ENVMAP_TYPE_CUBE | ||
|
||
vec3 outcolor = textureCube( map, projectedWorldPosition ).rgb; | ||
|
||
#else | ||
|
||
vec3 direction = normalize( projectedWorldPosition ); | ||
vec2 uv = equirectUv( direction ); | ||
vec3 outcolor = texture2D( map, uv ).rgb; | ||
|
||
#endif | ||
|
||
gl_FragColor = vec4( outcolor, 1.0 ); | ||
|
||
#include <tonemapping_fragment> | ||
#include <encodings_fragment> | ||
|
||
} | ||
`; | ||
|
||
const uniforms = { | ||
map: { value: texture }, | ||
height: { value: options?.height || 15 }, | ||
radius: { value: options?.radius || 100 }, | ||
}; | ||
|
||
const geometry = new IcosahedronGeometry( 1, 16 ); | ||
const material = new ShaderMaterial( { | ||
uniforms, | ||
fragmentShader, | ||
vertexShader, | ||
side: DoubleSide, | ||
} ); | ||
|
||
super( geometry, material ); | ||
|
||
} | ||
|
||
set radius( radius ) { | ||
|
||
this.material.uniforms.radius.value = radius; | ||
|
||
} | ||
|
||
get radius() { | ||
|
||
return this.material.uniforms.radius.value; | ||
|
||
} | ||
|
||
set height( height ) { | ||
|
||
this.material.uniforms.height.value = height; | ||
|
||
} | ||
|
||
get height() { | ||
|
||
return this.material.uniforms.height.value; | ||
|
||
} | ||
|
||
} |
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I suggest to replace
-
in the example name with_
.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I believe that would make the sidebar section title
materials / envmaps / ground / projected
and notmaterials / envmaps / ground-projected