簡體   English   中英

OpenGL ES20-Wavefront-> glDrawElements->沒有金字塔,但是形狀怪異?

[英]OpenGL ES20 - Wavefront -> glDrawElements -> no pyramid, but a weird shape?

編輯2:

解決方案:復制粘貼錯誤:發送顏色緩沖區作為位置緩沖區。


解析代表金字塔的我的.obj(波前),在必要時進行三角剖分,然后將其全部傳遞到緩沖區中。 緩沖區如下所示:

頂點緩沖區:

private FloatBuffer mPositionBuffer = null;
// from looping through buffer + print:
#0 = -0.5, 0.0, -0.5
#3 = 0.5, 0.0, -0.5
#6 = 0.5, 0.0, 0.5
#9 = -0.5, 0.0, 0.5
#12 = 0.5, 0.0, 0.5
#15 = 0.5, 0.0, -0.5
#18 = 0.0, 1.0, 0.0
#21 = 0.5, 0.0, -0.5
#24 = -0.5, 0.0, -0.5
#27 = 0.0, 1.0, 0.0
#30 = -0.5, 0.0, -0.5
#33 = -0.5, 0.0, 0.5
#36 = 0.0, 1.0, 0.0
#39 = -0.5, 0.0, 0.5
#42 = 0.5, 0.0, 0.5
#45 = 0.0, 1.0, 0.0

顏色緩沖區:

private ByteBuffer mColorBuffer = null;
#0 = 1, 1, 1, 1
#4 = 1, 1, 1, 1
#8 = 1, 1, 1, 1
#12 = 1, 1, 1, 1
#16 = 1, 1, 1, 1
#20 = 1, 1, 1, 1
#24 = 1, 1, 1, 1
#28 = 1, 1, 1, 1
#32 = 1, 1, 1, 1
#36 = 1, 1, 1, 1
#40 = 1, 1, 1, 1
#44 = 1, 1, 1, 1
#48 = 1, 1, 1, 1
#52 = 1, 1, 1, 1
#56 = 1, 1, 1, 1
#60 = 1, 1, 1, 1

普通緩沖區:

private FloatBuffer mNormalBuffer = null;



#0 = 0.0, 0.0, 0.0
#3 = 1.0, 0.0, 0.0
#6 = 1.0, 1.0, 0.0
#9 = 0.0, 1.0, 0.0
#12 = 0.0, 0.0, 0.0
#15 = 1.0, 0.0, 0.0
#18 = 0.5, 1.0, 0.0
#21 = 0.0, 0.0, 0.0
#24 = 1.0, 0.0, 0.0
#27 = 0.5, 1.0, 0.0
#30 = 0.0, 0.0, 0.0
#33 = 1.0, 0.0, 0.0
#36 = 0.5, 1.0, 0.0
#39 = 0.0, 0.0, 0.0
#42 = 1.0, 0.0, 0.0
#45 = 0.5, 1.0, 0.0

指標緩沖區:

private ShortBuffer mIndexBuffer = null;
#0 = 0, 1, 3
#3 = 1, 2, 3
#6 = 4, 5, 6
#9 = 7, 8, 9
#12 = 10, 11, 12
#15 = 13, 14, 15

在我的腦海中將頂點+面組合在一起時,它就像應該的那樣等於一個金字塔。 簡單的模型。 我將其繪制如下:

// data above are put in these buffers





    mColorBuffer.position(0);
    mNormalBuffer.position(0);
    mIndexBuffer.position(0);
    mPositionBuffer.position(0);

    GLES20.glVertexAttribPointer(mShader.getGLLocation(BaseShader.A_POSITION), 3, GLES20.GL_FLOAT, false,
            0, mColorBuffer);

    GLES20.glEnableVertexAttribArray(mShader.getGLLocation(BaseShader.A_POSITION));

    GLES20.glVertexAttribPointer(mShader.getGLLocation(BaseShader.A_COLOR), 4, GLES20.GL_BYTE, false,
                0, mColorBuffer);

    GLES20.glEnableVertexAttribArray(mShader.getGLLocation(BaseShader.A_COLOR));

    GLES20.glVertexAttribPointer(mShader.getGLLocation(BaseShader.A_NORMAL), 3, GLES20.GL_FLOAT, false,
                0, mNormalBuffer);

    GLES20.glEnableVertexAttribArray(mShader.getGLLocation(BaseShader.A_NORMAL));

    Matrix.multiplyMM(mMVPMatrix, 0, mViewMatrix, 0, mModelMatrix, 0);
    Matrix.multiplyMM(mMVPMatrix, 0, mProjectionMatrix, 0, mMVPMatrix, 0);
    GLES20.glUniformMatrix4fv(mShader.getGLLocation(BaseShader.U_MVPMATRIX), 1, false, mMVPMatrix, 0);
    GLES20.glDrawElements(GLES20.GL_TRIANGLE_FAN, mIndexBuffer.capacity(), GLES20.GL_UNSIGNED_SHORT, mIndexBuffer);

但是有一個對象,它實際上看起來並不像金字塔,並且“搖晃”,即如果我翻譯它(不旋轉,但是代碼看起來像這樣(並在圖一之前執行)):

    Matrix.translateM(mModelMatrix, 0, mTranslation[0], mTranslation[1], mTranslation[2]);
    Matrix.scaleM(mModelMatrix, 0, mScale[0], mScale[1], mScale[1]);

    Matrix.rotateM(mModelMatrix, 0, mRotation[0], 0, 1, 0);
    Matrix.rotateM(mModelMatrix, 0, mRotation[1], 1, 0, 0);
    Matrix.rotateM(mModelMatrix, 0, mRotation[2], 0, 0, 1);
    Matrix.multiplyMM(mMVMatrix, 0, mViewMatrix, 0, mModelMatrix, 0);

在我看來,索引傳輸不正確? 不幸的是,僅金字塔的一側被繪制。

我必須為glDrawElements函數使用其他值嗎? 如果需要,我可以發布翻譯動畫的屏幕截圖或屏幕截圖。 非常感謝您的幫助!

編輯:

如果這與它有任何關系:

我稱這些為:

    GLES20.glClearColor(0, 0, 0, 1);
    GLES20.glEnable(GLES20.GL_DEPTH_TEST);
    GLES20.glDepthFunc(GLES20.GL_LEQUAL);

我不太確定,但它看起來像是一個剔除問題(您是否設置過剔除?我不知道默認值是什么)。 ...您還確定GL_TRIANGLE_FAN是索引的排列方式嗎? 看起來更像是GL_TRIANGLE_STRIP安排。

編輯:現在,我看着您的頂點,我認為GL_TRIANGLES是您需要使用的,所以我第一次錯了。 抱歉

現在讓我們看一下不同索引排列如何工作的示例:讓我們采用最簡單的3d形式四面體。 還可以使用一些非常簡單的坐標,您可以根據需要選擇它們:

(0,0,0, // point0
,1,0,0, // point1
,0,1,0, // point2
,0,0,1) // point3

因此,這將為我們提供12個長數組,其中包含4組坐標,現在這是如果我們使用GL_TRIANGLE_STRIP時索引的外觀:

(0,1,2,3,0,1) 

這意味着我們繪制第一個三角形-(0,1,2),然后使用(3)在其旁邊再添加一個,然后返回(0),依此類推。

如果我們使用的是GL_TRIANGLES,則外觀將如下所示:

(0,1,2,
2,1,3,
3,1,0,
0,2,3)

正如您使用GL_TRIANGLES所看到的,我們只是一個接一個地列出三角形,而沒有順序。 (我選擇了那些是逆時針方向的,不確定這是否是默認的剔除值)

在您的情況下,似乎您有重復的頂點,因此牆壁可以具有適當的法線並看起來平坦。 因此,即使每個牆與下一個牆重合,您也要為每個牆有單獨的頂點。 同樣,我的建議是只留下一個三角形-三個頂點,三個索引,並一個接一個地添加,直到獲得完整的圖形。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM