Warm tip: This article is reproduced from stackoverflow.com, please click
dom html javascript three.js

Using predefined canvas for renderer causes trouble

发布于 2020-04-08 23:38:52

Hello i am trying to follow tutorials about three.js and have trouble using my predefined canvas elements for renderer. If i let three.js create renderer DOM element everything works fine. But using getElementById to get canvas and sending it to WebGLRenderer constructor makes it output only;

THREE.WebGLRenderer: WEBGL_draw_buffers extension not supported.

Here is the working code 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>

and working code 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>

And my naive attemp that doesn't render anything;

<!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>

I am very new to JS and would be very happy if anyone can walk me trough whats wrong.

Questioner
Mert Beşiktepe
Viewed
52
2pha 2020-02-01 06:57

Your 3rd example has:

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

it should be:

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

You can see what is happening by looking at the source of the WebGLRenderer class.

EDIT:
I also just noticed your selector is wrong.
const canv = document.querySelector('render_canv_1') wont work.
Try using const canv = document.getElementById('render_canv_1');