簡體   English   中英

iOS上的OpenGL ES 2.0:在沒有法線的情況下從zBrush導出導入.OBJ文件

[英]OpenGL ES 2.0 on iOS: Importing .OBJ files from zBrush export without normals

首先,我要說一下我在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的模型(在上面添加代碼以用於第三個數組緩沖區),它看起來還不錯。 但是,如果我根本不修改從zBrush導出的OBJ,這就是我得到的:

混亂的法線

現在,這是通過glEnable(GL_CULL_FACE);啟用人臉剔除的glEnable(GL_CULL_FACE); 如果我不啟用它,則該模型似乎是由內而外渲染的。

顯然,zBrush導出以某種方式被弄亂了。 我的問題是如何解決。

該模型未三角剖分。 讓您的藝術家在輸出中選中該復選框。

我去找了你的腳本文件。

假設四邊形是

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

在.pl中,您會找到

矩形=>第二個三角形

    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++;
    }

嘗試對此重新排序,以查看是否需要反轉第二個三角形的纏繞順序

矩形=>第二個三角形

    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++;
    }

如果您的工具遵循obj中的方向,而zBrush導出遵循此方向,則嘗試從順時針更改為逆時針剔除,這可能會有所幫助。

暫無
暫無

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

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