Opengl 如何插值顶点法线?

Opengl 如何插值顶点法线?,opengl,interpolation,normals,marching-cubes,Opengl,Interpolation,Normals,Marching Cubes,我正在尝试使用marching cubes算法渲染一个带有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;

我正在尝试使用marching cubes算法渲染一个带有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着色。如何插值顶点法线

什么是a、b和c

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

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

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

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

此插值法线(n)应用于古劳德着色。

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

下一步不是插值任何内容。您要做的是为附着到顶点的每个面计算(未标准化的)面法线。然后将它们全部相加,并对结果进行规格化。这是顶点法线


如何确定哪些面附着到顶点是另一回事。在您的例子中,因为您是通过移动立方体构建数据的,所以从相邻立方体生成或检索三角形应该不会太困难。但是,如果您通过了生成步骤,并且只有一包三角形,那么您将需要一个适当的网格拓扑数据结构。或者两者都是不错的选择。

使用着色器?或者你想如何实现这一点?它可以是一个着色器(更快吗?)是的,a、b和c是三角形的顶点,我使用函数GetNormalForVertex计算每个顶点的法线。如果我有一个三角形结构数组,我怎么能得到共享顶点呢?这就是我在写“这不那么琐碎”时的意思。我建议你参考上面@Nicol的答案。好的,Nicol非常感谢你的澄清,我会努力的。当做