【问题标题】:Smooth shader in OpenGL for OBJ import?OpenGL中用于OBJ导入的平滑着色器?
【发布时间】:2016-03-02 21:12:52
【问题描述】:

我用的是OpenGL OBJ loader,可以下载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)。

有什么想法吗?

【问题讨论】:

    标签: c++ opengl glut blender cg


    【解决方案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 加载器,看看如何正确地从中提取文件中包含的法线。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-18
        • 2020-05-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多