three.js透明png纹理奇怪边框webgl

时间:2013-07-02 09:05:00

标签: javascript three.js

在使用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 } );

4 个答案:

答案 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;
            }

有一种更简单的方法可以将所有顶点移动半个像素吗?