簡體   English   中英

OpenGL ES20-點亮立方體,如何獲得法線?

[英]OpenGL ES20 - Light a cube, how to get normals?

要為我的OpenGL ES20多維數據集添加一些閃電,我需要計算每個平面的法線。 我找到了有關閃電的“教程”,但他們只是將法線硬編碼到多維數據集中,在我看來,這不是最佳選擇,因為它似乎很有限?

因此,我對多維數據集的處理方法如下:

private float[] mVertices = {
        -1, -1, -1, // bottom left
        1, -1, -1, // bottom right   back
        1, 1, -1, // top right
        -1, 1, -1, // top left
        -1, -1, 1, // bottom left
        1, -1, 1, // bottom right   front
        1, 1, 1, // top right
        -1, 1, 1 // top left
};

private float[] mColors = {
        0.6f, 0f, 0.6f,
        0.6f, 0f, 0.6f,
        0.6f, 0f, 0.6f,
        0.6f, 0f, 0.6f,

        0.8f, 0f, 0.6f,
        0.8f, 0f, 0.6f,
        0.8f, 0f, 0.6f,
        0.8f, 0f, 0.6f
};

private float[] mNormal = new float[?]; ?

private short[] mIndices = {
        0, 4, 5,
        0, 5, 1,

        1, 5, 6,
        1, 6, 2,

        2, 6, 7,
        2, 7, 3,

        3, 7, 4,
        3, 4, 0,

        4, 7, 6,
        4, 6, 5,

        3, 0, 1,
        3, 1, 2
};

即我已經定義了所有8個頂點以及關於如何將它們組合成三角形的索引。 為了得到普通矩陣,我讀過我應該將矩陣求逆,然后轉置它。 所以我嘗試了這個:

    float[] mTempMatrix = new float[mVertices.length];
    Matrix.invertM(mTempMatrix, 0, mVertices, 0);
    Matrix.transposeM(mNormal, 0, mTempMatrix, 0);

但這總是充滿零,並且我的立方體保持黑色。 我應該如何舉例計算法線矩陣? 模型矩陣應該有東西嗎? 如果是,我應該在哪里做,因為它們真正組合的唯一位置是在着色器中? 還有另一種方法更合適嗎?

您面臨的問題是在立方體面之間共享頂點。 法線是指向平面垂直於平面的向量。

以上/右/前頂點為例(與前,右和頂面共享)。

在正面使用時,法線需要指向您的方向為0,0,1在正面使用時,法線需要指向您的方向為1,0,0在正面使用時,法線需要指向您的方向為1,0,0需要指向0,1,0

那么如何調和呢? 您可以將頂點的法線設置為從角落指向,例如為0.707、0.707、0.707。 這很可能會在拐角處為您提供有趣的照明效果,但可能並非您所追求的。

另一種解決方案是不重用面之間的頂點。 因此,您需要24個(每邊4個)而不是8個。每個頂點將具有3個版本,但是每個頂點現在僅屬於一個面,因此可以將法向矢量設置為垂直於該面。 您也將能夠只為該面孔設置顏色,因為您將不再與其他面孔共享頂點。

暫無
暫無

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

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