【问题标题】:Three.js - Skybox showing blackThree.js - 天空盒显示黑色
【发布时间】:2016-09-02 14:45:03
【问题描述】:

在 Three.js 中将天空盒添加到简单场景时遇到问题!

我用于天空盒的代码是:

    var skyBox = new THREE.Mesh( new THREE.BoxGeometry( 1500, 1500, 1500 ), shaderMaterial );
        sceneCube.add( skyBox );

shaderMaterial 定义如下:

shader = THREE.ShaderLib[ "cube" ];
shader.uniforms[ "tCube" ].value = textureCube;

var shaderMaterial = new THREE.ShaderMaterial( {

    fragmentShader: shader.fragmentShader,
    vertexShader: shader.vertexShader,
    uniforms: shader.uniforms,
    depthWrite: false,
    side: THREE.BackSide

} );

我只想将一些简单的图像显示为 Skybox,所以我用它来加载图像:

     var path = "Desert-";
            var format = '.png';
            var urls = [
                path + 'LEFT' + format, path + 'RIGHT' + format,
                path + 'TOP' + format, path + 'BOT' + format,
                path + 'FRONT' + format, path + 'BACK' + format
            ];
            textureCube = new THREE.CubeTextureLoader().load( urls );

运行我的代码不会在 Web 控制台中引发任何错误。作为基本场景,我使用http://threejs.org/examples/#webgl_geometry_cube

我真的试图在互联网上找到答案,但我在这里找不到任何我做错的事情。

感谢您的帮助!

这里是我使用的完整代码(我发布此代码是因为我真的尝试将所有解决方案应用于它,这些解决方案已发布在这里)。

<script>

        var camera, scene, renderer, cameraCube, sceneCube;
        var mesh, shader;

        init();
        animate();

        function init() {

            camera = new THREE.PerspectiveCamera( 70, window.innerWidth / window.innerHeight, 1, 2000 );
            camera.position.z = 400;
            cameraCube = new THREE.PerspectiveCamera( 45, window.innerWidth / window.innerHeight, 1, 2000 );


            scene = new THREE.Scene();
            sceneCube = new THREE.Scene();


            var path = "textures/Desert-";
            var format = '.png';
            var urls = [
                path + 'LEFT' + format, path + 'RIGHT' + format,
                path + 'TOP' + format, path + 'BOTTOM' + format,
                path + 'FRONT' + format, path + 'BACK' + format
            ];
            console.log(urls);
            textureCube = new THREE.CubeTextureLoader().load( urls );

            // Skybox

            shader = THREE.ShaderLib[ "cube" ];
            shader.uniforms[ "tCube" ].value = textureCube;

            var shaderMaterial = new THREE.ShaderMaterial( {

                fragmentShader: shader.fragmentShader,
                vertexShader: shader.vertexShader,
                uniforms: shader.uniforms,
                depthWrite: false,
                side: THREE.BackSide

            } );


            var skyBox = new THREE.Mesh( new THREE.BoxGeometry( 1500, 1500, 1500 ), shaderMaterial );
            sceneCube.add( skyBox );

            var texture = new THREE.TextureLoader().load( urls[3] );

            var geometry = new THREE.BoxBufferGeometry( 100, 100, 100 );
            var material = new THREE.MeshBasicMaterial( { map: texture } );

            mesh = new THREE.Mesh( geometry, material );
            scene.add( mesh );

            renderer = new THREE.WebGLRenderer();
            renderer.setPixelRatio( window.devicePixelRatio );
            renderer.setSize( window.innerWidth, window.innerHeight );
            document.body.appendChild( renderer.domElement );

            //

            window.addEventListener( 'resize', onWindowResize, false );

        }

        function onWindowResize() {

            camera.aspect = window.innerWidth / window.innerHeight;
            camera.updateProjectionMatrix();


            renderer.setSize( window.innerWidth, window.innerHeight );

        }

        function animate() {

            requestAnimationFrame( animate );

            mesh.rotation.x += 0.005;
            mesh.rotation.y += 0.01;

            renderer.render( sceneCube, cameraCube );
            renderer.render( scene, camera );

        }

【问题讨论】:

  • 几何立方体演示的摄像头远参数为 1000。您的立方体为 1500。确保摄像头远距离正确。
  • 我使用 THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 1, 2000);所以我想我的立方体应该被看到。这就是为什么我在这里问我的问题。

标签: javascript three.js


【解决方案1】:

如果您像这样使用多个渲染通道:

renderer.render( sceneCube, cameraCube );
renderer.render( scene, camera );

你需要设置

renderer.autoClear = false;

防止第二个渲染通道清除第一个。

three.js r.76

【讨论】:

  • 谢谢,这似乎真的是我的问题的解决方案!非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-17
  • 1970-01-01
  • 2015-05-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多