在我的第一個Android OpenGL應用程序中,我想渲染一個帶紋理的簡單立方體到屏幕。我從obj文件加載我的對象,如果我用一種顏色渲染它,它的效果很好,但是使用紋理我有一些問題。我放棄了我的代碼,並查看所有數組,並發現所有文件都可以正常讀取。這裏是我的OBJ文件:告訴OpenGL三角形的正確紋理座標
v 1.000000 -1.000000 -1.000000
v 1.000000 -1.000000 1.000000
v -1.000000 -1.000000 1.000000
v -1.000000 -1.000000 -1.000000
v 1.000000 1.000000 -0.999999
v 0.999999 1.000000 1.000001
v -1.000000 1.000000 1.000000
v -1.000000 1.000000 -1.000000
vt -1.918677 2.918677
vt -1.918677 -1.918677
vt 2.918677 -1.918677
vt 2.918677 2.918677
f 2/1 3/2 4/3
f 8/1 7/2 6/3
f 1/4 5/1 6/2
f 2/4 6/1 7/2
f 7/1 8/2 4/3
f 1/1 4/2 8/3
f 1/4 2/1 4/3
f 5/4 8/1 6/3
f 2/3 1/4 6/2
f 3/3 2/4 7/2
f 3/4 7/1 4/3
f 5/4 1/1 8/3
要在屏幕上繪製的對象我有這些陣列(後來作爲緩衝區),這些OpenGL的方法:
float vertices[] = {1f, -1f, -1f, 1f, ... , -1f, 1f, -1f };
short order[] = { 1, 2, 3, 7, ... , 4, 0, 7 }; // f o/t | o - 1
float textures[] = { -1.918677, 2.918677, ... , 2.918677 2.918677 };
Matrix.multiplyMM(mvpMatrix, 0, vpMatrix, 0, modelMatrix, 0);
GLES20.glUniformMatrix4fv(shaderMatrix, 1, false, mvpMatrix, 0);
GLES20.glEnableVertexAttribArray(shaderPosition);
GLES20.glVertexAttribPointer(shaderPosition, 3, GLES20.GL_FLOAT, false, 0, vertexBuffer);
GLES20.glEnableVertexAttribArray(shaderTexCoordinate);
GLES20.glVertexAttribPointer(shaderTexCoordinate, 2, GLES20.GL_FLOAT, false, 0, textureBuffer);
GLES20.glDrawElements(GLES20.GL_TRIANGLES, orderBuffer.capacity(), GLES20.GL_UNSIGNED_SHORT, orderBuffer);
GLES20.glDisableVertexAttribArray(shaderPosition);
但是,這並不工作 - 質地沒有正確顯示。我推測OpenGL不知道使用女巫紋理座標繪製哪個三角形。那麼我怎麼能告訴這個OpenGL?我是否必須爲具有相同尺寸的頂點的紋理座標創建一個數組/緩衝區,以便OpenGL使用第一個頂點渲染三角形以及此三角形的前三個紋理拾取物?或者我該怎麼做呢?
所以總結一下:我可以設置類似drawOrder函數的東西,但是對於textureCoordinates?
查看http://stackoverflow.com/a/23356738和http://stackoverflow.com/a/23713424查找描述如何處理這個問題的答案。 –
請在這裏看到我自己的答案。我認爲我已經實現了僞代碼,現在紋理看起來很棒,但是現在多維數據集本身並不是完美的。頂點有什麼問題嗎? – Cilenco
這段代碼看起來很合理。我會使用一個簡單的例子,如多維數據集,並在調試器中逐步完成。應該相當明顯地發現問題出在哪裏。 –