【问题标题】:OpenGL ES 2.0 on iOS: Importing .OBJ files from zBrush export without normalsiOS 上的 OpenGL ES 2.0:从没有法线的 zBrush 导出中导入 .OBJ 文件
【发布时间】:2013-07-01 17:25:40
【问题描述】:

让我先说一下我在 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); 启用的面部剔除。如果我不启用它,模型似乎是由内而外渲染的。

显然,zBrush 导出以某种方式搞砸了。我的问题是如何解决它。

【问题讨论】:

    标签: ios opengl-es-2.0


    【解决方案1】:

    尝试将剔除从顺时针更改为逆时针,如果您的工具尊重 obj 中的方向并且 zBrush 导出尊重它,这可能会有所帮助。

    【讨论】:

    • 听起来很可能。这看起来很正常,只是随机的。
    • 感谢您的建议。我尝试使用glFrontFace(GL_CCW);,但它的渲染与图像相似。
    【解决方案2】:

    模型未进行三角剖分。让您的艺术家在输出中选中该框。

    我去为你查看了脚本文件。

    假设四边形是

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

    【讨论】:

    • 谢谢。我有一个请求他们检查那个框,我会在这里更新它是怎么回事。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多