1

私は OpenGL ES と OpenGL 全般についてかなり新しいと言って、これを前置きさせてください。

私たちの 3D 担当者が zBrush からエクスポートしたモデル オブジェクトがあります。.objファイルには法線がありません。それがこの動作の原因だと思います。obj2openglを使用して.h、頂点とテクスチャ座標を含むファイルを作成し、それらをインポートしてレンダリングしています。インポートは次のようになります。

glGenBuffers(1, &mushroomVertexBufferID);
glBindBuffer(GL_ARRAY_BUFFER, mushroomVertexBufferID);
glBufferData(GL_ARRAY_BUFFER, sizeof(mushroom01b_LowVerts), mushroom01b_LowVerts, GL_STATIC_DRAW);

glGenBuffers(1, &mushroomTextureBufferID);
glBindBuffer(GL_ARRAY_BUFFER, mushroomTextureBufferID);
glBufferData(GL_ARRAY_BUFFER, sizeof(mushroom01b_LowTexCoords), mushroom01b_LowTexCoords, GL_STATIC_DRAW);

オブジェクトを描画するときは、次のコードを使用します。

glBindBuffer(GL_ARRAY_BUFFER, mushroomVertexBufferID);
glEnableVertexAttribArray(GLKVertexAttribPosition);
glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 3, NULL);

glBindBuffer(GL_ARRAY_BUFFER, mushroomTextureBufferID);
glEnableVertexAttribArray(GLKVertexAttribTexCoord0);
glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 2, NULL);

self.effect.texture2d0.name = _mushroomTextureInfo.name;
self.effect.texture2d0.target = _mushroomTextureInfo.target;

[self.effect prepareToDraw];

glDrawArrays(GL_TRIANGLES, 0, mushroom01b_LowNumVerts);

これは機能し、モデルを Blender で開き、法線を修正し、法線を含む OBJ として再エクスポートした (上記のコードを 3 番目の配列バッファーに追加した) 場合、かなり見栄えがします。しかし、zBrush からエクスポートした OBJ をまったく変更しないと、次のようになります。

めちゃくちゃな法線

これは、 で顔カリングを有効にした状態glEnable(GL_CULL_FACE);です。有効にしないと、モデルが裏返しにレンダリングされているように見えます。

明らかに、zBrush のエクスポートが何らかの形で台無しになっています。私の質問は、それを修正する方法です。

4

2 に答える 2

4

モデルは三角測量されていません。アーティストに出力のボックスをチェックしてもらいます。

スクリプト ファイルを調べました。

クワッドが

a -- c
|    |
|    |
b -- d

.pl には、

長方形 => 2 番目の三角形

    if($5 != "")
    {
        @d = split('/', $5);
        $va_idx[$numFaces] = $a[0]-1;
        $ta_idx[$numFaces] = $a[1]-1;
        $na_idx[$numFaces] = $a[2]-1;

        $vb_idx[$numFaces] = $d[0]-1;
        $tb_idx[$numFaces] = $d[1]-1;
        $nb_idx[$numFaces] = $d[2]-1;

        $vc_idx[$numFaces] = $c[0]-1;
        $tc_idx[$numFaces] = $c[1]-1;
        $nc_idx[$numFaces] = $c[2]-1;

        $face_line[$numFaces] = $line;

        $numFaces++;
    }

これに並べ替えて、2 番目の三角形の巻き順を逆にする必要があるかどうかを確認してください

長方形 => 2 番目の三角形

    if($5 != "")
    {
        @d = split('/', $5);
        $va_idx[$numFaces] = $a[0]-1;
        $ta_idx[$numFaces] = $a[1]-1;
        $na_idx[$numFaces] = $a[2]-1;

                    $vb_idx[$numFaces] = $c[0]-1;
        $tb_idx[$numFaces] = $c[1]-1;
        $nb_idx[$numFaces] = $c[2]-1;

        $vc_idx[$numFaces] = $d[0]-1;
        $tc_idx[$numFaces] = $d[1]-1;
        $nc_idx[$numFaces] = $d[2]-1;



        $face_line[$numFaces] = $line;

        $numFaces++;
    }
于 2013-07-03T22:45:02.867 に答える