将DataTexture应用于three.js中以编程方式生成的网格

将DataTexture应用于three.js中以编程方式生成的网格,three.js,Three.js,实际问题: 我是否需要设置多个faceVertexUvs[0]才能在网格上对材质进行纹理处理?我不知道如何消除gldrawerelements错误。我试过使用不同的材料,如MeshPhongMaterial和MeshLambertMaterial,但坦率地说,我不确定区别是什么。我还尝试在我的基础几何体上调用computeVertexNormals()和computeTangents()。消防水带方法在这里不起作用 前面的描述 我正在运行时使用一个以三角形细分平面开始的几何体构建网格。我通过定期

实际问题:

我是否需要设置多个
faceVertexUvs[0]
才能在网格上对材质进行纹理处理?我不知道如何消除
gldrawerelements
错误。我试过使用不同的材料,如
MeshPhongMaterial
MeshLambertMaterial
,但坦率地说,我不确定区别是什么。我还尝试在我的基础几何体上调用
computeVertexNormals()
computeTangents()
。消防水带方法在这里不起作用

前面的描述

我正在运行时使用一个以三角形细分平面开始的几何体构建网格。我通过定期更新顶点的z坐标来变形网格。这一切都很好,但我在使用带有DataTexture的材质时遇到了问题

我得到这个错误:

glDrawElements: attempt to access out of range elements in attribute 0
我认为这条消息意味着它无法找到我的几何体的UV层,但这并不是因为缺少尝试插入向量。下面是将面加载到几何体中的代码,名为
model

for (j=0; j<vh-1; j++) {
for (i=0; i<vw-1; i++) {

    var a = j*vw+i;
    var b = (j+1)*vw+i;
    var c = (j*vw+i+1);
    var d = (j+1)*vw+i+1;

    model.faces.push( new THREE.Face3(a,b,c) );
    model.faces.push( new THREE.Face3(c,b,d) );

    model.faceVertexUvs[0].push( [ new THREE.Vector2(0,0),
                   new THREE.Vector2(1,1),
                   new THREE.Vector2(1,0) ] );
    model.faceVertexUvs[0].push( [ new THREE.Vector2(0,0),
                   new THREE.Vector2(1,1),
                   new THREE.Vector2(1,0) ] );

}
}
在代码的后面,我向这个材质添加了一个纹理,当上面的gL错误出现时(在Chrome javascript控制台中)


在构建几何体时,除了使用
faceVertexUVs
之外,我还尝试了使用
faceUVs
。也许我需要使用除MeshBasicMaterial之外的其他材质来完成此任务?

经过多次尝试和错误,我终于找到了答案

这里的问题是,我最初设置的
MeshBasicMaterial
没有纹理。添加纹理并为此材质设置
needsUpdate
标志后,它继续抛出gL错误

通过最初使用特定纹理创建材质(使用
ImageUtils.GenerateDateTexture
),系统接受随后添加的纹理,错误消失,我成功地在网格上绘制图片

var texture = THREE.ImageUtils.generateDataTexture(inputW, inputH, initColor );
var material = new THREE.MeshBasicMaterial( { map : texture });
var faceMesh = new THREE.Mesh(model, material);
material.map = new THREE.DataTexture(new Uint8Array(bytes, rgbByteIdx), 
                     inputW, inputH, THREE.RGBFormat);

material.needsUpdate = true;
var texture = THREE.ImageUtils.generateDataTexture(inputW, inputH, initColor );
var material = new THREE.MeshBasicMaterial( { map : texture });
var faceMesh = new THREE.Mesh(model, material);