用于OBJ导入的OpenGL中的平滑着色器?

时间:2015-11-29 00:52:13

标签: c++ opengl glut blender cg

我正在使用OpenGL OBJ加载程序,可以下载here!

我从Blender导出了一个OBJ模型。 问题是我想要实现平滑的阴影。 As you can see, it is not smooth here. 我该如何实现这一目标?也许正常的矢量计算器出了问题?

float* Model_OBJ::calculateNormal( float *coord1, float *coord2, float *coord3 )
{
   /* calculate Vector1 and Vector2 */
   float va[3], vb[3], vr[3], val;
   va[0] = coord1[0] - coord2[0];
   va[1] = coord1[1] - coord2[1];
   va[2] = coord1[2] - coord2[2];

   vb[0] = coord1[0] - coord3[0];
   vb[1] = coord1[1] - coord3[1];
   vb[2] = coord1[2] - coord3[2];

   /* cross product */
   vr[0] = va[1] * vb[2] - vb[1] * va[2];
   vr[1] = vb[0] * va[2] - va[0] * vb[2];
   vr[2] = va[0] * vb[1] - vb[0] * va[1];

   /* normalization factor */
   val = sqrt( vr[0]*vr[0] + vr[1]*vr[1] + vr[2]*vr[2] );

    float norm[3];
    norm[0] = vr[0]/val;
    norm[1] = vr[1]/val;
    norm[2] = vr[2]/val;


    return norm;
}

设置了glShadeModel(GL_SMOOTH)。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

如果您想要进行平滑着色,则不能像现在这样在每个三角形的基础上简单地计算每个三角形顶点的法线。这会产生平面阴影。

要进行平滑着色,您需要将为每个三角形计算的法线求和到相关顶点,然后对每个顶点的结果进行标准化。这将产生一种指向平滑方向的平均向量。

基本上采取您正在做的事情,并将生成的三角形法线添加到其所有顶点。然后归一化每个顶点的求和向量。它看起来像这样(伪代码):

for each vertex, vert:
    vert.normal = vec3(0, 0, 0)

for each triangle, tri:
     tri_normal = calculate_normal(tri)
     for each vertex in tri, vert:
          vert.normal += tri_normal

for each vertex, vert:
    normalize(vert.normal)

然而,当从这样的OBJ文件加载时通常不需要这样做,并且像这样的硬表面模型通常需要折痕和尖角的部分看起来正常,法线在任何地方都不是完全平滑和连续的。 OBJ文件通常存储内部每个顶点的法线,就像艺术家希望模型看起来一样。所以我看看你的OBJ加载器,看看如何正确地获取文件中包含的法线。

答案 1 :(得分:0)

谢谢朋友!我在Blender中找到了导出法向量的选项,所以现在我已经完全重写了数据结构来管理法向量。现在看起来很顺利! image