首先,我要说我是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/