使用OpenGL着色器正确照亮立方体的面

时间:2015-12-01 21:41:53

标签: opengl graphics

使用OpenGL着色器,我想渲染一个立方体并应用漫反射照明。我的立方体由8个顶点和12个三角形组成。我通过找到三角形的两个边之间的叉积来计算每个三角形的法线。然后,每个顶点的法线是它接触的三角形的加权(按面积)平均值。在顶点着色器中,为了计算每个顶点的光照,我然后计算顶点法线和光矢量之间角度的余弦。

然而,问题在于,虽然立方体的每个面都是平面的,但是计算面上每个像素的照度是在其四个顶点之间进行插值。假设每个顶点具有不同的法线,则面部的光照在每个顶点之间平滑变化,而实际上整个面部应该有单个照明值。

我应该怎么做才能解决这个问题?或者,如果不沿立方体面添加额外的顶点,是否无法处理此问题?

2 个答案:

答案 0 :(得分:3)

您使用术语“顶点”不一致,意味着一个位置在一个位置,而另一个位置在其他位置。

“位置”就是:空间中的位置。处理渲染时,“顶点”表示位置,法线,纹理坐标以及作为顶点着色器输入所需的任何其他内容。您的顶点着色器将单个顶点作为输入并输出单个顶点的数据。

一个立方体有8个位置。但是这6张脸中的每一张都有不同的法线。由于顶点必须具有位置和法线,如果希望每个面的顶点使用相同的法线值,则必须复制数据。

对于6个面中的每个面,位置和法线的唯一组合的数量(即:顶点数)必须为24:4。您将使用相同的位置和正常值,但您的顶点数组必须复制数据。因此前四个顶点将使用4个不同的位置,但它们将具有相同的正常值,重复4次。这将覆盖一面。

所以你必须为每张脸做这件事。

答案 1 :(得分:1)

处理此问题的常用方法是复制角点顶点,每个角点顶点对应包含该顶点的图元所需的每个不同法线。没有一种合理的方法可以使单个顶点具有每个基元的不同法线。