2013-03-02 173 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); 
相關問題