微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

three.js – 闪烁飞机

我有一个应用程序与大型2D飞机与纹理,但我遇到一些闪烁的问题.

有可能看到闪烁的问题在这里(飞机是witt纹理):EXAMPLE CODE

这个深度缓冲区(z-buffer)精度问题还是别的什么?

解决方案是缩小一切,不允许大型飞机/物体?最好的做法是什么?

我知道z近和远也影响精度,所以设置z接近1000修复了这个例子中的闪烁.

代码

/*
 * Scale = 1,no flickering. Scale = 1000,flickering. 
 */
  var scale = 1000;

  var scene = new THREE.Scene();

  var camera = new THREE.PerspectiveCamera(45,window.innerWidth / window.innerHeight,1000,1000000);
  camera.position.x = 0;
  camera.position.y = 0;
  camera.position.z = 100 * scale;
  var renderer = new THREE.Webglrenderer({
      antialias: false
  });
  renderer.setSize(window.innerWidth,window.innerHeight);
  document.body.appendChild(renderer.domElement);

  var light = new THREE.AmbientLight(0xFFFFFF);
  scene.add(light);

  var material = new THREE.MeshBasicMaterial({
      transparent: false,side: THREE.DoubleSide,fog: false,color: 0xFFFF00,opacity: 1.0
  });

  var cubeGeometry = new THREE.PlaneGeometry(50 * scale,50 * scale,1,1);
  var cubeMesh = new THREE.Mesh(cubeGeometry,material);
  cubeMesh.position.set(0,1 * scale);
  scene.add(cubeMesh);

  var material = new THREE.MeshBasicMaterial({
      transparent: false,color: 0xFF0000,opacity: 1.0
  });

  var cubeGeometry = new THREE.PlaneGeometry(100 * scale,100 * scale,material);
  scene.add(cubeMesh);

  function render() {
      var time = Date.Now() * 0.5;
      camera.position.x = Math.sin(time / 1000) * 150 * scale;
      camera.position.y = 0;
      camera.position.z = Math.cos(time / 1000) * 150 * scale;
      camera.lookAt(scene.position);
      renderer.render(scene,camera);  
      requestAnimationFrame(render);
  }
  render();

解决方法

您所看到的是GPU的精度不足,因为您使用的范围太大.通过将相机的近平面设置为100(而不是1),闪烁消失.

http://jsfiddle.net/GYQ5v/74/

原文地址:https://www.jb51.cc/js/152898.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐