Skip to content

Commit 36e2f63

Browse files
authored
Merge pull request #15331 from WestLangley/dev-cubemap_gen
Add THREE.CubemapGenerator
2 parents 7dc5fde + 94fc9fd commit 36e2f63

File tree

2 files changed

+126
-10
lines changed

2 files changed

+126
-10
lines changed

examples/js/loaders/EquirectangularToCubeGenerator.js

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,115 @@
11
/**
22
* @author Richard M. / https://github.com/richardmonette
3+
* @author WestLangley / http://github.com/WestLangley
34
*/
45

6+
THREE.CubemapGenerator = function ( renderer ) {
7+
8+
this.renderer = renderer;
9+
10+
};
11+
12+
THREE.CubemapGenerator.prototype.fromEquirectangular = function ( texture, options ) {
13+
14+
var scene = new THREE.Scene();
15+
16+
var shader = {
17+
18+
uniforms: {
19+
tEquirect: { value: null },
20+
},
21+
22+
vertexShader:
23+
24+
`
25+
varying vec3 vWorldDirection;
26+
27+
//include <common>
28+
vec3 transformDirection( in vec3 dir, in mat4 matrix ) {
29+
30+
return normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );
31+
32+
}
33+
34+
void main() {
35+
36+
vWorldDirection = transformDirection( position, modelMatrix );
37+
38+
#include <begin_vertex>
39+
#include <project_vertex>
40+
41+
}
42+
`,
43+
44+
fragmentShader:
45+
46+
`
47+
uniform sampler2D tEquirect;
48+
49+
varying vec3 vWorldDirection;
50+
51+
//include <common>
52+
#define RECIPROCAL_PI 0.31830988618
53+
#define RECIPROCAL_PI2 0.15915494
54+
55+
void main() {
56+
57+
vec3 direction = normalize( vWorldDirection );
58+
59+
vec2 sampleUV;
60+
61+
sampleUV.y = asin( clamp( direction.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;
62+
63+
sampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_PI2 + 0.5;
64+
65+
gl_FragColor = texture2D( tEquirect, sampleUV );
66+
67+
}
68+
`
69+
};
70+
71+
var material = new THREE.ShaderMaterial( {
72+
73+
type: 'CubemapFromEquirect',
74+
75+
uniforms: THREE.UniformsUtils.clone( shader.uniforms ),
76+
vertexShader: shader.vertexShader,
77+
fragmentShader: shader.fragmentShader,
78+
side: THREE.BackSide,
79+
blending: THREE.NoBlending
80+
81+
} );
82+
83+
material.uniforms.tEquirect.value = texture;
84+
85+
var mesh = new THREE.Mesh( new THREE.BoxBufferGeometry( 5, 5, 5 ), material );
86+
87+
scene.add( mesh );
88+
89+
var resolution = options.resolution || 512;
90+
91+
var params = {
92+
type: texture.type,
93+
format: texture.format,
94+
encoding: texture.encoding,
95+
generateMipmaps: ( options.generateMipmaps !== undefined ) ? options.generateMipmaps : texture.generateMipmaps,
96+
minFilter: ( options.minFilter !== undefined ) ? options.minFilter : texture.minFilter,
97+
magFilter: ( options.magFilter !== undefined ) ? options.magFilter : texture.magFilter
98+
};
99+
100+
var camera = new THREE.CubeCamera( 1, 10, resolution, params );
101+
102+
camera.update( this.renderer, scene );
103+
104+
mesh.geometry.dispose();
105+
mesh.material.dispose();
106+
107+
return camera.renderTarget;
108+
109+
};
110+
111+
//
112+
5113
THREE.EquirectangularToCubeGenerator = ( function () {
6114

7115
var camera = new THREE.PerspectiveCamera( 90, 1, 0.1, 10 );

examples/webgl_materials_cubemap_dynamic.html

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
<div id="info"><a href="http://threejs.org" target="_blank" rel="noopener">three.js webgl</a> - materials - dynamic cube reflection<br/>Photo by <a href="http://www.flickr.com/photos/jonragnarsson/2294472375/" target="_blank" rel="noopener">J&oacute;n Ragnarsson</a>.</div>
3333

3434
<script src="../build/three.js"></script>
35+
<script src="js/loaders/EquirectangularToCubeGenerator.js"></script>
3536

3637
<script>
3738

@@ -58,17 +59,27 @@
5859

5960
function init( texture ) {
6061

61-
camera = new THREE.PerspectiveCamera( 60, window.innerWidth / window.innerHeight, 1, 1000 );
62+
renderer = new THREE.WebGLRenderer( { antialias: true } );
63+
renderer.setPixelRatio( window.devicePixelRatio );
64+
renderer.setSize( window.innerWidth, window.innerHeight );
6265

6366
scene = new THREE.Scene();
6467

65-
backgroundMesh = new THREE.Mesh( new THREE.SphereBufferGeometry( 500, 32, 16 ), new THREE.MeshBasicMaterial( { map: texture } ) );
66-
backgroundMesh.geometry.scale( - 1, 1, 1 );
67-
scene.add( backgroundMesh );
68+
camera = new THREE.PerspectiveCamera( 60, window.innerWidth / window.innerHeight, 1, 1000 );
6869

69-
renderer = new THREE.WebGLRenderer( { antialias: true } );
70-
renderer.setPixelRatio( window.devicePixelRatio );
71-
renderer.setSize( window.innerWidth, window.innerHeight );
70+
// background
71+
72+
var options = {
73+
resolution: 1024,
74+
75+
generateMipmaps: true,
76+
minFilter: THREE.LinearMipMapLinearFilter,
77+
magFilter: THREE.LinearFilter
78+
};
79+
80+
scene.background = new THREE.CubemapGenerator( renderer ).fromEquirectangular( texture, options );
81+
82+
//
7283

7384
cubeCamera1 = new THREE.CubeCamera( 1, 1000, 256 );
7485
cubeCamera1.renderTarget.texture.generateMipmaps = true;
@@ -198,13 +209,11 @@
198209
if ( count % 2 === 0 ) {
199210

200211
material.envMap = cubeCamera1.renderTarget.texture;
201-
backgroundMesh.position.copy( cubeCamera2.position );
202212
cubeCamera2.update( renderer, scene );
203213

204214
} else {
205215

206216
material.envMap = cubeCamera2.renderTarget.texture;
207-
backgroundMesh.position.copy( cubeCamera1.position );
208217
cubeCamera1.update( renderer, scene );
209218

210219
}
@@ -213,7 +222,6 @@
213222

214223
sphere.visible = true;
215224

216-
backgroundMesh.position.copy( camera.position );
217225
renderer.render( scene, camera );
218226

219227
}

0 commit comments

Comments
 (0)