在下面的代码中,我正在设置一个非常基本的场景,其中正交相机和画布被映射为平面几何体的纹理。
我在透明画布上放了一些白色文字,如果我使用canvas.toDataURL(),则效果不存在。
但是,当我将画布内容作为纹理应用于材质并在超标准的2D场景中渲染时,黑色线条勾勒出我的文本,可能是发生了奇怪的抗锯齿的结果。在此示例中,渲染器清除颜色,材质和文本都是纯白色。
以下是截图:
var camera = new THREE.OrthographicCamera(window.innerWidth / - 2,
window.innerWidth / 2,
window.innerHeight / 2,
window.innerHeight / - 2, 0, 10);
var scene = new THREE.Scene();
canvas = document.createElement('canvas');
canvas.width = 300;
canvas.height = 300;
var context = canvas.getContext('2d');
context.fillStyle = "white";
context.font = "bold 72px Arial";
context.fillText("Zibri", 50, 100);
var texture = new THREE.Texture(canvas);
var geometry = new THREE.PlaneGeometry(canvas.width, canvas.height);
texture.needsUpdate = true;
var material = new THREE.MeshBasicMaterial({ color: 0xffffff, map: texture, transparent: true });
var mesh = new THREE.Mesh(geometry, material);
scene.add(mesh);
renderer = new THREE.WebGLRenderer({ antialias: false });
renderer.setSize( window.innerWidth, window.innerHeight );
renderer.setClearColor(0xffffff)
document.body.appendChild( renderer.domElement );
camera.lookAt(scene.position);
renderer.render(scene, camera);
答案 0 :(得分:3)
我也一直在努力解决这个问题,WestLangley的解决方案来解决这个问题,但是渲染的文本留下了极差的抗锯齿边缘。经过广泛的研究,我想出了一个我很高兴的解决方案,我在这里概述。
在绘制文本之前,请使用与文本相同的颜色填充画布,但将alpha设置为0.01
context.fillStyle = 'rgba(255,255,255,0.01)';
context.fillRect(0,0,canvas.width,canvas.height);
然后使用材质的alphaTest属性来丢弃此不透明度的像素:
var material = new THREE.MeshBasicMaterial({
color: 0xffffff,
map: texture,
transparent: true,
alphaTest:0.01
});
最后,将纹理贴图的premultiplyAlpha值设置为false:
texture.map.premultiplyAlpha = false;
texture.map.needsUpdate = true;