提交 834e4927 编写于 作者: M Mugen87

Examples: Remove EquirectangularToCubeGenerator.

上级 b91aebff
......@@ -173,9 +173,9 @@
if adjusting texture parameters manually, ensure minFilter is set to one of the MipMap options,
and that mip maps have not been otherwise forcibly disabled.</p>
<p>
Note: only [link:https://threejs.org/docs/#api/textures/CubeTexture cube environment maps] are supported
for MeshStandardMaterial. If you want to use an equirectangular map you will need to use the
[link:https://github.com/mrdoob/three.js/blob/dev/examples/js/loaders/EquirectangularToCubeGenerator.js EquirectangularToCubeGenerator].
Note: only [link:https://threejs.org/docs/#api/textures/CubeTexture cube environment maps] are supported
for MeshStandardMaterial. If you want to use an equirectangular map you will need to use
[page:WebGLRenderTargetCube.fromEquirectangularTexture WebGLRenderTargetCube.fromEquirectangularTexture]().
See this [link:https://threejs.org/examples/webgl_materials_envmaps_exr.html example] for details.
</p>
......
......@@ -136,7 +136,7 @@
请确保将minFilter设置为其中一个MipMap选项,并且未强制禁用mip贴图。</p>
<p>
注意:MeshStandardMaterial 仅支持[link:https://threejs.org/docs/#api/textures/CubeTexture cube environment maps]。
如果要使用equirectangular贴图,则需要使用 [link:https://github.com/mrdoob/three.js/blob/dev/examples/js/loaders/EquirectangularToCubeGenerator.js EquirectangularToCubeGenerator]
如果要使用equirectangular贴图,则需要使用 [page:WebGLRenderTargetCube.fromEquirectangularTexture WebGLRenderTargetCube.fromEquirectangularTexture]().
详细信息请参阅此示例[link:https://threejs.org/examples/webgl_materials_envmaps_exr.html example]。
</p>
......
/**
* @author Richard M. / https://github.com/richardmonette
*/
THREE.EquirectangularToCubeGenerator = ( function () {
var camera = new THREE.PerspectiveCamera( 90, 1, 0.1, 10 );
var scene = new THREE.Scene();
var boxMesh = new THREE.Mesh( new THREE.BoxBufferGeometry( 1, 1, 1 ), getShader() );
boxMesh.material.side = THREE.BackSide;
scene.add( boxMesh );
var EquirectangularToCubeGenerator = function ( sourceTexture, options ) {
options = options || {};
this.sourceTexture = sourceTexture;
this.resolution = options.resolution || 512;
this.views = [
{ t: [ 1, 0, 0 ], u: [ 0, - 1, 0 ] },
{ t: [ - 1, 0, 0 ], u: [ 0, - 1, 0 ] },
{ t: [ 0, 1, 0 ], u: [ 0, 0, 1 ] },
{ t: [ 0, - 1, 0 ], u: [ 0, 0, - 1 ] },
{ t: [ 0, 0, 1 ], u: [ 0, - 1, 0 ] },
{ t: [ 0, 0, - 1 ], u: [ 0, - 1, 0 ] },
];
var params = {
format: options.format || this.sourceTexture.format,
magFilter: this.sourceTexture.magFilter,
minFilter: this.sourceTexture.minFilter,
type: options.type || this.sourceTexture.type,
generateMipmaps: this.sourceTexture.generateMipmaps,
anisotropy: this.sourceTexture.anisotropy,
encoding: this.sourceTexture.encoding
};
this.renderTarget = new THREE.WebGLRenderTargetCube( this.resolution, this.resolution, params );
};
EquirectangularToCubeGenerator.prototype = {
constructor: EquirectangularToCubeGenerator,
update: function ( renderer ) {
var currentRenderTarget = renderer.getRenderTarget();
boxMesh.material.uniforms.equirectangularMap.value = this.sourceTexture;
for ( var i = 0; i < 6; i ++ ) {
var v = this.views[ i ];
camera.position.set( 0, 0, 0 );
camera.up.set( v.u[ 0 ], v.u[ 1 ], v.u[ 2 ] );
camera.lookAt( v.t[ 0 ], v.t[ 1 ], v.t[ 2 ] );
renderer.setRenderTarget( this.renderTarget, i );
renderer.clear();
renderer.render( scene, camera );
}
renderer.setRenderTarget( currentRenderTarget );
return this.renderTarget.texture;
},
dispose: function () {
this.renderTarget.dispose();
}
};
function getShader() {
var shaderMaterial = new THREE.ShaderMaterial( {
uniforms: {
"equirectangularMap": { value: null },
},
vertexShader:
"varying vec3 localPosition;\n\
\n\
void main() {\n\
localPosition = position;\n\
gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\
}",
fragmentShader:
"#include <common>\n\
varying vec3 localPosition;\n\
uniform sampler2D equirectangularMap;\n\
\n\
vec2 EquirectangularSampleUV(vec3 v) {\n\
vec2 uv = vec2(atan(v.z, v.x), asin(v.y));\n\
uv *= vec2(0.1591, 0.3183); // inverse atan\n\
uv += 0.5;\n\
return uv;\n\
}\n\
\n\
void main() {\n\
vec2 uv = EquirectangularSampleUV(normalize(localPosition));\n\
gl_FragColor = texture2D(equirectangularMap, uv);\n\
}",
blending: THREE.NoBlending
} );
shaderMaterial.type = 'EquirectangularToCubeGenerator';
return shaderMaterial;
}
return EquirectangularToCubeGenerator;
} )();
import {
PixelFormat,
Texture,
TextureDataType,
WebGLRenderer,
WebGLRenderTargetCube
} from '../../../src/Three';
export interface EquirectangularToCubeGeneratorOptions {
resolution?: number;
format?: PixelFormat;
type?: TextureDataType;
}
export class EquirectangularToCubeGenerator {
constructor( sourceTexture: Texture, options?: EquirectangularToCubeGeneratorOptions );
sourceTexture: Texture;
resolution: number;
renderTarget: WebGLRenderTargetCube;
dispose(): void;
update( renderer: WebGLRenderer ): Texture;
}
/**
* @author Richard M. / https://github.com/richardmonette
*/
import {
BackSide,
BoxBufferGeometry,
Mesh,
NoBlending,
PerspectiveCamera,
Scene,
ShaderMaterial,
WebGLRenderTargetCube
} from "../../../build/three.module.js";
var EquirectangularToCubeGenerator = ( function () {
var camera = new PerspectiveCamera( 90, 1, 0.1, 10 );
var scene = new Scene();
var boxMesh = new Mesh( new BoxBufferGeometry( 1, 1, 1 ), getShader() );
boxMesh.material.side = BackSide;
scene.add( boxMesh );
var EquirectangularToCubeGenerator = function ( sourceTexture, options ) {
options = options || {};
this.sourceTexture = sourceTexture;
this.resolution = options.resolution || 512;
this.views = [
{ t: [ 1, 0, 0 ], u: [ 0, - 1, 0 ] },
{ t: [ - 1, 0, 0 ], u: [ 0, - 1, 0 ] },
{ t: [ 0, 1, 0 ], u: [ 0, 0, 1 ] },
{ t: [ 0, - 1, 0 ], u: [ 0, 0, - 1 ] },
{ t: [ 0, 0, 1 ], u: [ 0, - 1, 0 ] },
{ t: [ 0, 0, - 1 ], u: [ 0, - 1, 0 ] },
];
var params = {
format: options.format || this.sourceTexture.format,
magFilter: this.sourceTexture.magFilter,
minFilter: this.sourceTexture.minFilter,
type: options.type || this.sourceTexture.type,
generateMipmaps: this.sourceTexture.generateMipmaps,
anisotropy: this.sourceTexture.anisotropy,
encoding: this.sourceTexture.encoding
};
this.renderTarget = new WebGLRenderTargetCube( this.resolution, this.resolution, params );
};
EquirectangularToCubeGenerator.prototype = {
constructor: EquirectangularToCubeGenerator,
update: function ( renderer ) {
var currentRenderTarget = renderer.getRenderTarget();
boxMesh.material.uniforms.equirectangularMap.value = this.sourceTexture;
for ( var i = 0; i < 6; i ++ ) {
var v = this.views[ i ];
camera.position.set( 0, 0, 0 );
camera.up.set( v.u[ 0 ], v.u[ 1 ], v.u[ 2 ] );
camera.lookAt( v.t[ 0 ], v.t[ 1 ], v.t[ 2 ] );
renderer.setRenderTarget( this.renderTarget, i );
renderer.clear();
renderer.render( scene, camera );
}
renderer.setRenderTarget( currentRenderTarget );
return this.renderTarget.texture;
},
dispose: function () {
this.renderTarget.dispose();
}
};
function getShader() {
var shaderMaterial = new ShaderMaterial( {
uniforms: {
"equirectangularMap": { value: null },
},
vertexShader:
"varying vec3 localPosition;\n\
\n\
void main() {\n\
localPosition = position;\n\
gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\
}",
fragmentShader:
"#include <common>\n\
varying vec3 localPosition;\n\
uniform sampler2D equirectangularMap;\n\
\n\
vec2 EquirectangularSampleUV(vec3 v) {\n\
vec2 uv = vec2(atan(v.z, v.x), asin(v.y));\n\
uv *= vec2(0.1591, 0.3183); // inverse atan\n\
uv += 0.5;\n\
return uv;\n\
}\n\
\n\
void main() {\n\
vec2 uv = EquirectangularSampleUV(normalize(localPosition));\n\
gl_FragColor = texture2D(equirectangularMap, uv);\n\
}",
blending: NoBlending
} );
shaderMaterial.type = 'EquirectangularToCubeGenerator';
return shaderMaterial;
}
return EquirectangularToCubeGenerator;
} )();
export { EquirectangularToCubeGenerator };
......@@ -24,7 +24,6 @@
import { OrbitControls } from './jsm/controls/OrbitControls.js';
import { GLTFLoader } from './jsm/loaders/GLTFLoader.js';
import { RGBELoader } from './jsm/loaders/RGBELoader.js';
import { EquirectangularToCubeGenerator } from './jsm/loaders/EquirectangularToCubeGenerator.js';
import { PMREMGenerator } from './jsm/pmrem/PMREMGenerator.js';
import { PMREMCubeUVPacker } from './jsm/pmrem/PMREMCubeUVPacker.js';
......@@ -49,10 +48,14 @@
.setPath( 'textures/equirectangular/' )
.load( 'pedestrian_overpass_2k.hdr', function ( texture ) {
var cubeGenerator = new EquirectangularToCubeGenerator( texture, { resolution: 1024 } );
cubeGenerator.update( renderer );
var options = {
minFilter: texture.minFilter,
magFilter: texture.magFilter
};
var pmremGenerator = new PMREMGenerator( cubeGenerator.renderTarget.texture );
scene.background = new THREE.WebGLRenderTargetCube( 1024, 1024, options ).fromEquirectangularTexture( renderer, texture );
var pmremGenerator = new PMREMGenerator( scene.background.texture );
pmremGenerator.update( renderer );
var pmremCubeUVPacker = new PMREMCubeUVPacker( pmremGenerator.cubeLods );
......@@ -82,8 +85,6 @@
pmremGenerator.dispose();
pmremCubeUVPacker.dispose();
scene.background = cubeGenerator.renderTarget;
} );
renderer = new THREE.WebGLRenderer( { antialias: true } );
......
......@@ -26,7 +26,6 @@
import { DDSLoader } from './jsm/loaders/DDSLoader.js';
import { DRACOLoader } from './jsm/loaders/DRACOLoader.js';
import { RGBELoader } from './jsm/loaders/RGBELoader.js';
import { EquirectangularToCubeGenerator } from './jsm/loaders/EquirectangularToCubeGenerator.js';
import { PMREMGenerator } from './jsm/pmrem/PMREMGenerator.js';
import { PMREMCubeUVPacker } from './jsm/pmrem/PMREMCubeUVPacker.js';
......@@ -159,12 +158,14 @@
.setPath( 'textures/equirectangular/' )
.load( 'venice_sunset_2k.hdr', function ( texture ) {
var cubeGenerator = new EquirectangularToCubeGenerator( texture, { resolution: 1024 } );
cubeGenerator.update( renderer );
var options = {
minFilter: texture.minFilter,
magFilter: texture.magFilter
};
background = cubeGenerator.renderTarget;
background = new THREE.WebGLRenderTargetCube( 1024, 1024, options ).fromEquirectangularTexture( renderer, texture );
var pmremGenerator = new PMREMGenerator( cubeGenerator.renderTarget.texture );
var pmremGenerator = new PMREMGenerator( background.texture );
pmremGenerator.update( renderer );
var pmremCubeUVPacker = new PMREMCubeUVPacker( pmremGenerator.cubeLods );
......
......@@ -20,7 +20,6 @@
import { GUI } from './jsm/libs/dat.gui.module.js';
import { OrbitControls } from './jsm/controls/OrbitControls.js';
import { EXRLoader } from './jsm/loaders/EXRLoader.js';
import { EquirectangularToCubeGenerator } from './jsm/loaders/EquirectangularToCubeGenerator.js';
import { PMREMGenerator } from './jsm/pmrem/PMREMGenerator.js';
import { PMREMCubeUVPacker } from './jsm/pmrem/PMREMCubeUVPacker.js';
......@@ -75,18 +74,15 @@
scene.add( planeMesh );
new EXRLoader()
.setDataType( THREE.FloatType )
.setDataType( THREE.HalfFloatType )
.load( 'textures/piz_compressed.exr', function ( texture ) {
texture.minFilter = THREE.NearestFilter;
// texture.magFilter = THREE.NearestFilter;
texture.encoding = THREE.LinearEncoding;
var cubemapGenerator = new EquirectangularToCubeGenerator( texture, { resolution: 512, type: THREE.HalfFloatType } );
exrBackground = cubemapGenerator.renderTarget;
var cubeMapTexture = cubemapGenerator.update( renderer );
exrBackground = new THREE.WebGLRenderTargetCube( 512, 512 ).fromEquirectangularTexture( renderer, texture );
var pmremGenerator = new PMREMGenerator( cubeMapTexture );
var pmremGenerator = new PMREMGenerator( exrBackground.texture );
pmremGenerator.update( renderer );
var pmremCubeUVPacker = new PMREMCubeUVPacker( pmremGenerator.cubeLods );
......@@ -104,12 +100,13 @@
texture.encoding = THREE.sRGBEncoding;
var cubemapGenerator = new EquirectangularToCubeGenerator( texture, { resolution: 512 } );
pngBackground = cubemapGenerator.renderTarget;
var options = {
generateMipmaps: true
};
var cubeMapTexture = cubemapGenerator.update( renderer );
pngBackground = new THREE.WebGLRenderTargetCube( 512, 512, options ).fromEquirectangularTexture( renderer, texture );
var pmremGenerator = new PMREMGenerator( cubeMapTexture );
var pmremGenerator = new PMREMGenerator( pngBackground.texture );
pmremGenerator.update( renderer );
var pmremCubeUVPacker = new PMREMCubeUVPacker( pmremGenerator.cubeLods );
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册