javascript - 使用预定义的 Canvas 作为渲染器会导致麻烦

标签 javascript html dom three.js

您好,我正在尝试遵循有关 Three.js 的教程,但在使用预定义的 Canvas 元素作为渲染器时遇到问题。如果我让 Three.js 创建渲染器 DOM 元素,一切都会正常。但是使用 getElementById 获取 Canvas 并将其发送到 WebGLRenderer 构造函数使其仅输出;

THREE.WebGLRenderer: WEBGL_draw_buffers extension not supported.

这是工作代码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 很陌生,如果有人能指导我解决问题,我会非常高兴。

最佳答案

您的第三个示例有:

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

应该是:

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

您可以通过查看WebGLRenderer class的来源来了解发生了什么。 。

编辑:
我也刚刚注意到你的选择器是错误的。
const canv = document.querySelector('render_canv_1')不会工作。
尝试使用const canv = document.getElementById('render_canv_1');

关于javascript - 使用预定义的 Canvas 作为渲染器会导致麻烦,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60012189/

相关文章:

javascript - 如何在js中添加target=blank?

javascript - 使用 md-select 和 md-option 的 Angular Material 下拉列表不显示

javascript - 如何获取 Chrome/WebKit 中过渡元素的当前颜色?

javascript - 检查 HTML 输入元素是否为空或没有用户输入的值

javascript - 在 Firefox 中记录并稍后回放 DOM 更改?

设置超时时的 JavaScript 闭环问题

javascript - Ace 编辑器(表单)- 我可以保留换行符/文本格式吗?

javascript - Enyo 自定义属性

javascript - AOT 清理加载程序出错,无法使用 AOT 模式构建 Angular 应用程序

javascript - 未捕获的语法错误 : Unexpected token '<'