Three.js纹理有雾并且在缩小时重叠

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Three.js纹理有雾并且在缩小时重叠相关的知识,希望对你有一定的参考价值。

我想要做的是添加一个简单的平原并为其指定一个应拉伸和适合它的纹理。纹理显示在两侧。到目前为止,我有这个代码(需要优化,但我需要先解决这个问题)。

$( window ).on('load', function() {

  var container = $('main');

  var renderer = new THREE.WebGLRenderer({
      antialias: true,
      alpha: true,
      logarithmicDepthBuffer: true
  });

  renderer.setSize( container.outerWidth() - 10, container.outerHeight() - 10 );
  renderer.setClearColor( 0xeaeaea );

  var scene = new THREE.Scene();

  var camera = new THREE.PerspectiveCamera( 75, container.outerWidth() / container.outerHeight(), 2, 1000 );
  camera.position.z = 8;
  camera.position.x = 2;

  var controls = new THREE.OrbitControls( camera );
  controls.target.set( 0, 0, 0 )

  container.append(renderer.domElement);

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

    controls.update();

    renderer.render(scene, camera);
  };

  animate();

  var geometry = new THREE.PlaneGeometry( 8, 5, 32 );

  var texture = THREE.ImageUtils.loadTexture( "texture.png" );
  texture.wrapS = THREE.RepeatWrapping; 
  texture.wrapT = THREE.RepeatWrapping;
  texture.repeat.set( 1, 1 );

  var diffuse = THREE.ImageUtils.loadTexture( "diffuse.png" );
  diffuse.wrapS = THREE.RepeatWrapping;
  diffuse.wrapT = THREE.RepeatWrapping;
  diffuse.repeat.set( 1, 1 );

  var material = new THREE.MeshBasicMaterial( { map : texture } );
  material.alphaMap = diffuse;
  material.transparent = true;
  material.side = THREE.DoubleSide;

  var plane = new THREE.Mesh( geometry, material );
  plane.rotation.x = -60 * ( Math.PI/180 );

  scene.add( plane );
});

1.第一个问题

Close look

当围绕平面旋转或从一个角度观察时,会在平面周围添加此雾。我不希望这样。我希望纹理能够清楚地占据所有平面。没有雾,边缘没有消失。我不知道为什么会这样

1.第二个问题

Far look

缩小时,纹理会发生变化,并以某种方式重叠。我不知道这是否是某种LOD技术,但我不想要它。就像我已经说过的那样,我希望纹理能够贴合在平面内并完全覆盖它,而不会失去质量,有雾或以任何方式改变。我不知道是否需要使用雾或相机截头值。我尝试改变它们,但结果是一样的。

答案

我只需将其添加到纹理来解决此问题:

texture.minFilter = THREE.LinearFilter;
texture.magFilter = THREE.LinearFilter;

以上是关于Three.js纹理有雾并且在缩小时重叠的主要内容,如果未能解决你的问题,请参考以下文章

Three.js 中的自定义纹理着色器

THREE.js - 大型int作为Uniform

Three.js中同一网格面上的多个透明纹理

半小时学会制作三维扩散光圈(three.js实战2)

Three.js 不渲染纹理

three.js 图像纹理渲染为颜色(使用 ColladaLoader 加载)