【问题标题】:Correctly illuminating the faces of a cube with OpenGL shaders使用 OpenGL 着色器正确照亮立方体的面
【发布时间】:2016-03-05 23:38:51
【问题描述】:

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

但是,这样做的问题是,虽然我的立方体的每个面都是平坦的,但面上每个像素的照明是在其四个顶点之间进行插值计算的。鉴于每个顶点有不同的法线,面部的光照在每个顶点之间平滑变化,而实际上整个面部应该只有一个光照值。

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

【问题讨论】:

    标签: opengl graphics


    【解决方案1】:

    您对“顶点”一词的使用不一致,意思是在一个位置的一件事,但在别处的另一件事。

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

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

    位置和法线的唯一组合数(即:顶点数)对于 6 个面中的每一个必须为 24:4。您将使用相同的位置和法线值,但您的顶点数组必须复制数据。所以前四个顶点将使用 4 个不同的位置,但它们将具有相同的正常值复制 4 次。那会遮住一张脸。

    所以你必须对每张脸都这样做。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-18
        • 1970-01-01
        • 2018-11-24
        • 1970-01-01
        相关资源
        最近更新 更多