OpenGL模型显示网格状线条

时间:2011-04-27 11:23:13

标签: objective-c opengl

阴影问题解决了;网格线仍然存在。见更新5

我正在使用Objective-C为OpenGL开发.obj文件加载器。

我正在尝试加载对象并使用着色渲染它们。除了单个光源之外,我没有使用任何纹理,材料等来修改模型。当我渲染任何模型时,阴影分布不正确(如下图所示)。我相信这与法线有关,但我不确定。

这些是我的结果:

Sphere Blender Monkey

这就是我想要达到的效果类型:

Goal

我认为问题在于我从文件中解析的法线不正确,但在自己计算并得到相同的结果后,我发现这不是真的。我还以为没有启用GL_SMOOTH问题,但我也错了。

所以我不知道我在这里做错了什么,如果这个问题看起来很模糊,那就很抱歉。如果需要更多信息,我会添加它。

更新: 链接到破碎的猴子头的更大图片:http://oi52.tinypic.com/2re5y69.jpg

更新2:如果在计算法线的过程中出现错误,这就是我正在做的事情:

  • 为每组索引创建一个三角形。
  • 计算三角形的法线并将其存储在矢量中。
  • 确保使用以下函数对矢量进行标准化

static inline void normalizeVector(Vector3f *vector) {
    GLfloat vecMag = VectorMagnitude(*vector);
    if (vecMag == 0.0) {
        vector->x /= 1.0; 
        vector->y /= 0.0;
        vector->z /= 0.0;
    }
    vector->x /= vecMag;
    vector->y /= vecMag;
    vector->z /= vecMag;
}

更新3:这是我用来创建法线的代码:

- (void)calculateNormals {
    for (int i = 0; i < numOfIndices; i += 3) {      
        Triangle triangle;
        triangle.v1.x = modelData.vertices[modelData.indices[i]*3];
        triangle.v1.y = modelData.vertices[modelData.indices[i]*3+1];
        triangle.v1.z = modelData.vertices[modelData.indices[i]*3+2];

        triangle.v2.x = modelData.vertices[modelData.indices[i+1]*3];
        triangle.v2.y = modelData.vertices[modelData.indices[i+1]*3+1];
        triangle.v2.z = modelData.vertices[modelData.indices[i+1]*3+2];

        triangle.v3.x = modelData.vertices[modelData.indices[i+2]*3];
        triangle.v3.y = modelData.vertices[modelData.indices[i+2]*3+1];
        triangle.v3.z = modelData.vertices[modelData.indices[i+2]*3+2];

        Vector3f normals = calculateNormal(triangle);
        normalizeVector(&normals);

        modelData.normals[modelData.surfaceNormals[i]*3] = normals.x;
        modelData.normals[modelData.surfaceNormals[i]*3+1] = normals.y;
        modelData.normals[modelData.surfaceNormals[i]*3+2] = normals.z; 

        modelData.normals[modelData.surfaceNormals[i+1]*3] = normals.x;
        modelData.normals[modelData.surfaceNormals[i+1]*3+1] = normals.y;
        modelData.normals[modelData.surfaceNormals[i+1]*3+2] = normals.z; 

        modelData.normals[modelData.surfaceNormals[i+2]*3] = normals.x;
        modelData.normals[modelData.surfaceNormals[i+2]*3+1] = normals.y;
        modelData.normals[modelData.surfaceNormals[i+2]*3+2] = normals.z; 
    }

更新4:进一步研究,似乎.obj文件的法线是曲面法线,而我需要顶点法线。 (也许)

如果顶点法线是我需要的,如果任何人都可以解释计算它们背后的理论,那就太好了。我尝试查找它,但我只找到了例子,而不是理论。 (例如“获取每张脸的十字架产品并将其标准化”)。如果我知道我必须做什么,如果我遇到困难并且不必继续更新,我可以查看一个单独的过程。

更新5:我重新编写了我的整个加载程序,并以某种方式让它工作。虽然它的阴影很好,但我仍然可以在原始结果中看到那些类似网格的线条。

2 个答案:

答案 0 :(得分:1)

您的normalizeVector功能显然是错误的。除以零永远不是一个好主意。应该在vecMag != 0.0时工作。你是如何计算法线的?使用跨产品?如果你让OpenGL计算法线会发生什么?

答案 1 :(得分:0)

你的法线的方向可能是错误的 - 如果它们是错误的方式那么你只会看到应该指向你的多边形。

尝试致电:

 glDisable(GL_CULL_FACE);

并查看您的输出是否发生变化。

鉴于我们正在看多边形边缘,我还要检查:

 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);