【发布时间】:2012-02-12 03:25:14
【问题描述】:
我正在开发一个类似 Minecraft 的引擎作为一个爱好项目,看看体素地形的概念可以在现代硬件和 OpenGL >= 3 上推动多远。所以,我所有的几何体都由四边形或正方形组成准确一点。
我已经构建了一个光线投射器来估计环境光遮蔽,并使用“弯曲法线”技术来进行照明。所以我的法线不垂直于四边形,也没有单位长度;相反,它们大致指向发生遮挡最少的空间,并且当四边形接收到较少的光时更短。这种技术的优点是它只需要一次性计算遮挡,并且在渲染时基本上是免费的。
但是,当我尝试将不同的法线分配给同一个四边形的不同顶点以获得平滑照明时,我遇到了麻烦。因为四边形被分割成三角形,并且线性插值发生在每个三角形上,插值的结果清楚地表明三角形的存在是丑陋的对角线伪影:
问题在于 OpenGL 对每个三角形使用重心插值,这是 4 个角中 3 个角的加权和。理想情况下,我想使用双线性插值,其中所有 4 个角都用于计算结果。
我能想到一些解决方法:
将法线填充到 2x2 RGB 纹理中,并让纹理处理器进行双线性插值。这是以片段着色器中的纹理查找为代价的。为了提高效率,我还需要将所有这些迷你纹理打包成更大的纹理。
使用顶点属性将所有 4 个法线附加到每个顶点。还将一些 [0..1] 系数附加到每个顶点,就像纹理坐标一样,并在片段着色器中进行双线性插值。发生这种情况的代价是向着色器传递了 4 个法线,而不仅仅是 1 个。
我认为这两种技术都可以发挥作用,但它们让我觉得它们是一些应该更简单的东西的组合。也许我可以以某种方式转换法线,这样 OpenGL 的插值就会给出一个不依赖于所使用的特定三角剖分的结果。
(请注意,该问题并非特定于法线;它同样适用于需要在四边形上平滑插值的颜色或任何其他值。)
任何想法如何解决这个问题?如果不是,上述两种技术中的哪一种最好?
【问题讨论】:
-
GL_QUADS 在 opengl 3 中已弃用
标签: opengl glsl interpolation