如何插入顶点法线?

Flo*_*ber 4 opengl interpolation marching-cubes normals

我正在尝试使用行进立方体算法渲染带有Gouraud着色的3D模型(来自volvis.org).到目前为止,我有每个顶点的法线:

GetNormalForVertex(vertex &b, vertex &a, vertex &c) {
    u.X = a.X - b.X;
    u.Y = a.Y - b.Y;
    u.Z = a.Z - b.Z;
    v.X = c.X - b.X;
    v.Y = c.Y - b.Y;
    v.Z = c.Z - b.Z;

    return  Cross(u,v);
}
Run Code Online (Sandbox Code Playgroud)

渲染时我可以看到一个漂亮的平面阴影.现在,据我所知,我需要插入这些顶点法线以在交叉点找到法线以获得Gouraud阴影.我怎么能插入顶点法线?

Nic*_*las 10

首先,您不是计算顶点法线.你正在计算面法线.这是计算顶点法线的过程中的第1步.

下一步不是内插任何东西.你所做的是计算附着在顶点上的每个面的(非标准化)面法线.然后将它们全部加在一起并将结果标准化.那是顶点法线.

如何确定哪些面附着到顶点是另一回事.在您的情况下,因为您通过行进立方体构建此数据,所以从相邻立方体生成或检索三角形应该不会太困难.但是如果您通过生成步骤并且只有一袋三角形,那么您将需要适当的网格拓扑数据结构.翼边四边都是不错的选择.


Rah*_*jee 5

什么是a,b和c?

如果它们是三角形的顶点,那么您计算三角形法线,而不是任何特定顶点.在这种情况下的假设是整个三角形是平坦的.这称为平面着色.

另一方面,如果您希望在三角形内部(在Gouraud着色中使用)内插曲面法线,则需要在三个顶点处开始使用三个不同的法线.这有点不那么琐碎,但仍然很容易.一种方法是平均共享顶点的所有三角形的法线,以便获得该顶点处的法线.这显然需要连接信息(或者您需要以某种方式提取它).

一旦你有三个不同的法线(比如na,nb,nc),那么任何内点的法线都可以通过重心坐标计算出来.设顶点为va,vb,vc,内点的重心坐标为α和β.然后,内部点v及其正常n由下式给出:

v = ?*va + ?*vb + (1 - ? - ?)*vc
n = ?*na + ?*nb + (1 - ? - ?)*nc
Run Code Online (Sandbox Code Playgroud)

该插值法线(n)应该用于Gouraud阴影.