2013-03-02 23 views
0

实际的问题:应用一个DataTexture到程序生成的网格在three.js所

我是否需要设置比faceVertexUvs[0]更多的纹理在网格中的材料?我不知道如何摆脱glDrawElements错误。我曾尝试使用不同的材质,例如MeshPhongMaterialMeshLambertMaterial,但坦率地说,我不确定它们有什么不同。我也试着在底层几何图形上调用computeVertexNormals()computeTangents()。流水的做法是行不通的在这里..

前面的描述

我在运行时使用开始作为一个三角形tesselated平面几何图形建立网格。我通过周期性地更新顶点的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) ]); 

} 
} 

然后我用材料的faceMesh,这又加入到场景中添加这种模式下,沿着:

var material = new THREE.MeshBasicMaterial(); 
var faceMesh = new THREE.Mesh(model, material); 

它是后来在我的纹理添加到该材料中的代码,而这是当上述gL的错误显示(在Chrome JavaScript控制台)

material.map = new THREE.DataTexture(new Uint8Array(bytes, rgbByteIdx), 
        inputW, inputH, THREE.RGBFormat); 

material.needsUpdate = true; 

我已经使用试图除了构建几何时的faceVertexUVs。也许我需要为此使用除MeshBasicMaterial之外的其他东西?

回答

2

经过多次试验和错误,我想通了。

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

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

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