【发布时间】:2016-03-06 14:09:56
【问题描述】:
所以我最近了解了 mipmapping 的定义,但我不确定如何在 three.js 中正确使用该技术。
我看过这个例子: http://threejs.org/examples/webgl_materials_texture_manualmipmap.html
我也看到了这个: http://threejs.org/examples/#webgl_materials_texture_anisotropy
两者似乎都使用 mipmapping。第一个例子有这段代码:
function mipmap( size, color ) {
var imageCanvas = document.createElement( "canvas" ),
context = imageCanvas.getContext( "2d" );
imageCanvas.width = imageCanvas.height = size;
context.fillStyle = "#444";
context.fillRect( 0, 0, size, size );
context.fillStyle = color;
context.fillRect( 0, 0, size / 2, size / 2 );
context.fillRect( size / 2, size / 2, size / 2, size / 2 );
return imageCanvas;
}
var canvas = mipmap( 128, '#f00' );
var textureCanvas1 = new THREE.CanvasTexture( canvas );
textureCanvas1.mipmaps[ 0 ] = canvas;
textureCanvas1.mipmaps[ 1 ] = mipmap( 64, '#0f0' );
textureCanvas1.mipmaps[ 2 ] = mipmap( 32, '#00f' );
textureCanvas1.mipmaps[ 3 ] = mipmap( 16, '#400' );
textureCanvas1.mipmaps[ 4 ] = mipmap( 8, '#040' );
textureCanvas1.mipmaps[ 5 ] = mipmap( 4, '#004' );
textureCanvas1.mipmaps[ 6 ] = mipmap( 2, '#044' );
textureCanvas1.mipmaps[ 7 ] = mipmap( 1, '#404' );
textureCanvas1.repeat.set( 1000, 1000 );
textureCanvas1.wrapS = THREE.RepeatWrapping;
textureCanvas1.wrapT = THREE.RepeatWrapping;
var textureCanvas2 = textureCanvas1.clone();
textureCanvas2.magFilter = THREE.NearestFilter;
textureCanvas2.minFilter = THREE.NearestMipMapNearestFilter;
materialCanvas1 = new THREE.MeshBasicMaterial( { map: textureCanvas1 } );
materialCanvas2 = new THREE.MeshBasicMaterial( { color: 0xffccaa, map: textureCanvas2 } );
var geometry = new THREE.PlaneBufferGeometry( 100, 100 );
var meshCanvas1 = new THREE.Mesh( geometry, materialCanvas1 );
meshCanvas1.rotation.x = -Math.PI / 2;
meshCanvas1.scale.set(1000, 1000, 1000);
var meshCanvas2 = new THREE.Mesh( geometry, materialCanvas2 );
meshCanvas2.rotation.x = -Math.PI / 2;
meshCanvas2.scale.set( 1000, 1000, 1000 );
不清楚的是:
textureCanvas1.mipmaps[ 1 ] = mipmap( 64, '#0f0' );
以及二维上下文的使用。
无论如何,鉴于示例的性质,我仍然不知道如何对行星进行 mipmap。所以是的,我不确定如何正确映射球体。首先,我需要我的行星/球体由单独的部分组成,以便我可以将分解纹理的不同部分放在球体的每个部分上。然后我创建了 2 种尺寸变化的幂,然后呢?
所以我的问题是,当用于立方体、球体等时,three.js 中的 mipmapping 看起来如何?非常感谢简化的演示,因为现有示例(很少见)似乎都过于臃肿或没有文档。
编辑:stackoverflow 中的另一个用户发布了这个:
var texture = THREE.ImageUtils.loadTexture( 'images/512.png', undefined, function() {
texture.repeat.set( 1, 1 );
texture.mipmaps[ 0 ] = texture.image;
texture.generateMipmaps = true;
texture.needsUpdate = true;
};
mipmaps 的关键似乎是 texture.mipmaps[]。在这里,这个人只指定了一张图片。我们不应该提供各种图像并让计算机根据您的距离来决定哪个合适吗?不确定这个 mipmapping 是如何工作的。
【问题讨论】:
-
mipmapping 覆盖了here,但我认为这不足以解决您的问题
-
MIP 映射用于将 1 个纹理转换为许多不同的分辨率,基本上是为了改善纹理在不同观看距离下的外观。不要认为这是你在这里寻找的东西。您必须手动编写代码。
-
我想知道是否应该编辑这个问题,使其标题中没有“行星”,因为它似乎是多余的。
标签: javascript three.js