ios - iOS上的OpenGL ES 2.0:在没有法线的情况下从zBrush导出导入.OBJ文件

标签 ios opengl-es-2.0

首先,我要说我是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导出以某种方式被弄乱了。我的问题是如何解决它。

最佳答案

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

我去找了你的脚本文件。

假设四边形是

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

关于ios - iOS上的OpenGL ES 2.0:在没有法线的情况下从zBrush导出导入.OBJ文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17457869/

相关文章:

ios - iPhone 6 Plus 中的搜索图标变形 - 被压成蛋形

android - 使用强制延迟在 openles 2.0 中渲染相机

ios - 是否可以通过 Facebook open graph api 标记用户/页面?

ios - 类型剪贴板在 swift 中没有成员 'objects'

Android 在 OpenGL|ES 中卡住(CPU 可能已固定。再试一次。)

android - 加载均匀矩阵 1104 GL_Invalid_Operation Android OpenGLES 2.0

iphone - 如何在OpenGL-ES 2.0中绘制透明多边形?

ios - GLKMathUnproject : detecting a tap on an object

ios - macOS swift AVCaptureSession sessionPreset 不起作用

iphone - 有关 iPhone 中被阻止调用的信息