【问题标题】:Flickering planes闪烁的平面
【发布时间】:2013-07-21 03:18:15
【问题描述】:

我有一个带有纹理的大型 2D 平面的应用程序,但我遇到了一些闪烁问题。

这里可以看到闪烁问题(平面没有纹理):EXAMPLE CODE

这是深度缓冲区(z-buffer)精度问题还是其他什么?

解决方案是缩小所有内容,而不是允许大型飞机/物体吗?最佳做法是什么?

我知道 z near 和 far 也会影响精度,因此将 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, 0, 1 * scale);
  scene.add(cubeMesh);

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

  var cubeGeometry = new THREE.PlaneGeometry(100 * scale, 100 * scale, 1, 1);
  var cubeMesh = new THREE.Mesh(cubeGeometry, 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();

【问题讨论】:

    标签: three.js webgl


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢,帮助很大:)
    • 如果你正在使用装载的 OBJ 飞机,你会以同样的方式解决它吗?
    • 我尝试将接近值设置为 100 并将对数深度缓冲区设置为 true。在某些模型中两者都不适合我。您还有其他建议吗?
    • 我遇到了同样的阴影闪烁问题,我需要将我的Spotlight 上的near 平面设置为100
    • 也为我修复了。我的飞机很大,当我缩小它时,它解决了问题
    【解决方案2】:

    试试这个代码,看看它是否有效:

    cubeMesh.position.set(0, 0, 1);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-08
      • 2013-12-13
      • 2012-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多