5

我正在尝试使用行进立方体算法使用 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);
}

渲染时我可以看到一个漂亮的平面阴影。现在,据我所知,我需要对这些顶点法线进行插值以在交点处找到法线以获得 Gouraud 着色。我怎样才能插入顶点法线?

4

2 回答 2

11

首先,您没有计算顶点法线。您正在计算face normals。这是计算顶点法线过程中的第 1 步。

下一步不是插值任何东西。您所做的是为连接到顶点的每个面计算(未标准化的)面法线。然后将它们加在一起并标准化结果。那是顶点法线。

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

于 2013-03-26T03:20:01.983 回答
7

什么是a、b和c?

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

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

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

v = α*va + β*vb + (1 - α - β)*vc
n = α*na + β*nb + (1 - α - β)*nc

此插值法线 (n) 应用于 Gouraud 着色。

于 2013-03-25T21:32:16.317 回答