将预定义的画布用于渲染器会造成麻烦

问题描述 投票:0回答:1

您好,我正在尝试遵循有关three.js的教程,并且在使用预定义的canvas元素进行渲染时遇到了麻烦。如果我让three.js创建渲染器DOM元素,则一切正常。但是,使用getElementById获取画布并将其发送到WebGLRenderer构造函数使其仅输出;

THREE.WebGLRenderer:不支持WEBGL_draw_buffers扩展。

这里是工作代码1;

<!DOCTYPE: html>
<html>

<head>
  <script src="https://threejs.org/build/three.js"></script>
</head>

<body>
  <script>
    var scene = new THREE.Scene();
    var camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);

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

    var geometry = new THREE.BoxGeometry(1, 1, 1);
    var material = new THREE.MeshBasicMaterial({
      color: 0x00ff00
    });
    var cube = new THREE.Mesh(geometry, material);
    scene.add(cube);

    camera.position.z = 5;

    var animate = function() {
      requestAnimationFrame(animate);

      cube.rotation.x += 0.01;
      cube.rotation.y += 0.01;

      renderer.render(scene, camera);
    };

    animate();
  </script>
</body>

</html>

工作代码2;

<!DOCTYPE: html>
<html>

<head>
  <script src="https://threejs.org/build/three.js"></script>
</head>

<body>
  <canvas id="render_canv_1"></canvas>

  <script>
    var scene = new THREE.Scene();
    var camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);

    var renderer = new THREE.WebGLRenderer({
      canvas : render_canv_1 
    });
    renderer.setSize(window.innerWidth, window.innerHeight);

    var geometry = new THREE.BoxGeometry(1, 1, 1);
    var material = new THREE.MeshBasicMaterial({
      color: 0x00ff00
    });
    var cube = new THREE.Mesh(geometry, material);
    scene.add(cube);

    camera.position.z = 5;

    var animate = function() {
      requestAnimationFrame(animate);

      cube.rotation.x += 0.01;
      cube.rotation.y += 0.01;

      renderer.render(scene, camera);
    };

    animate();
  </script>

</body>

</html>

还有我的天真什么时候都不会渲染任何东西;

<!DOCTYPE: html>
<html>

<head>
  <script src="https://threejs.org/build/three.js"></script>
</head>

<body>
  <canvas id="render_canv_1"></canvas>

  <script>
    var scene = new THREE.Scene();
    var camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);

    // THIS IS WHERE I STUCK...
    // get canvas object
    const canv = document.querySelector('render_canv_1')
    var renderer = new THREE.WebGLRenderer({
      canv
    });
    renderer.setSize(window.innerWidth, window.innerHeight);
    //

    var geometry = new THREE.BoxGeometry(1, 1, 1);
    var material = new THREE.MeshBasicMaterial({
      color: 0x00ff00
    });
    var cube = new THREE.Mesh(geometry, material);
    scene.add(cube);

    camera.position.z = 5;

    var animate = function() {
      requestAnimationFrame(animate);

      cube.rotation.x += 0.01;
      cube.rotation.y += 0.01;

      renderer.render(scene, camera);
    };

    animate();
  </script>

</body>

</html>

我对JS很陌生,如果有人可以通过错误引导我,我将非常高兴。

javascript html dom three.js webgl
1个回答
1
投票

您的第三个示例具有:

var renderer = new THREE.WebGLRenderer( { canv } );

应该是:

var renderer = new THREE.WebGLRenderer( { canvas: canv } );

您可以通过查看WebGLRenderer class的来源来查看正在发生的情况。

© www.soinside.com 2019 - 2024. All rights reserved.