在使用pngs作为three.js中的纹理时,我遇到了一个奇怪的问题。 png在可见和透明之间的区域有奇怪的边界。我已经尝试过使用alphatest值,但有时候图像会在1px线条很薄的区域中完全消失。有解决方案如何解决这个问题?
var explosionTexture = new THREE.ImageUtils.loadTexture( 'explosion.png' );
boomer = new TextureAnimator( explosionTexture, 4, 4, 16, 55 ); // texture, #horiz, #vert, #total, duration.
var explosionMaterial = new THREE.MeshBasicMaterial( { map: explosionTexture } );
explosionMaterial.transparent = true;
var cube2Geometry = new THREE.PlaneGeometry( 64, 64, 1, 1 );
cube2 = new THREE.Mesh( cube2Geometry, explosionMaterial );
cube2.position.set(100,26,0);
scene.add(cube2);
// renderer
//renderer = new THREE.WebGLRenderer( { antialias: false, premultipliedAlpha: true } );
renderer = new THREE.WebGLRenderer( { antialias: false } );
答案 0 :(得分:8)
试试这个:
explosionTexture.anisotropy = 0;
explosionTexture.magFilter = THREE.NearestFilter;
explosionTexture.minFilter = THREE.NearestFilter;
在构建渲染器时,也不应该使用反锯齿:
renderer = new THREE.WebGLRenderer({antialias: false});
这是预览我的世界纹理包,效果很好: - )
答案 1 :(得分:4)
恭喜,您已直接进入Texel-to-Pixel-mapping-trap。 :)
This应该可以帮助你摆脱困境,虽然它不是WebGL的基础知识仍然适用。
答案 2 :(得分:0)
好的,所以我尝试了这个页面上的所有解决方案。他们都失败了。
对我来说有用的是对精灵纹理使用正确的Texture.wrapS
(水平包装)和Texture.wrapT
(垂直包装)。
我个人在我的精灵顶部发现了这个丑陋的边缘。我只需要确保我的Texture.wrapT
设置为THREE.ClampToEdgeWrapping
而不是THREE.RepeatWrapping
。
在不弄乱alpha测试值,纹理滤镜,顶点或抗锯齿的情况下完美解决了这个问题。
答案 3 :(得分:-2)
var c2GVertices = cube2Geometry.vertices;
for (var i = 0; i < c2GVertices.length; i++) {
c2GVertices[i].x = c2GVertices[i].x - 0.5;
c2GVertices[i].y = c2GVertices[i].y - 0.5;
}
有一种更简单的方法可以将所有顶点移动半个像素吗?