如何对四边形上的法线进行双线性插值?

2024-02-06

我正在开发一个类似 Minecraft 的引擎,作为一个业余爱好项目,看看体素地形的概念在现代硬件和 OpenGL >= 3 上可以推广到什么程度。因此,我的所有几何体都由四边形(准确地说是正方形)组成。

我构建了一个光线投射器来估计环境光遮挡,并使用“弯曲法线”技术来进行照明。所以我的法线不垂直于四边形,也没有单位长度;相反,它们大致指向遮挡最少的空间,并且当四边形接收到的光线较少时,它们会更短。这种技术的优点是它只需要一次性计算遮挡,并且在渲染时基本上是免费的。

然而,当我尝试将不同的法线分配给同一四边形的不同顶点以获得平滑的照明时,我遇到了麻烦。因为四边形被分成三角形,并且每个三角形都发生线性插值,所以插值的结果清楚地表明三角形的存在是丑陋的对角线伪影:

问题是 OpenGL 在每个三角形上使用重心插值,这是 4 个角中的 3 个角的加权和。理想情况下,我想使用双线性插值,其中所有 4 个角都用于计算结果。

我可以想到一些解决方法:

  1. 将法线填充到 2x2 RGB 纹理中,并让纹理处理器进行双线性插值。这是以片段着色器中的纹理查找为代价的。为了提高效率,我还需要将所有这些迷你纹理打包成更大的纹理。

  2. 使用顶点属性将所有 4 个法线附加到每个顶点。还将一些 [0..1] 系数附加到每个顶点,就像纹理坐标一样,并在片段着色器中进行双线性插值。发生这种情况的代价是向着色器传递 4 个法线,而不是 1 个。

我认为这两种技术都可以发挥作用,但在我看来,它们是一些本应简单得多的东西的拼凑。也许我可以以某种方式变换法线,这样 OpenGL 的插值就会给出不依赖于所使用的特定三角测量的结果。

(请注意,该问题并不特定于法线;它同样适用于颜色或需要在四边形上平滑插值的任何其他值。)

还有什么想法可以解决这个问题吗?如果不是,以上两种技术中哪一种最好?


正如您清楚地了解的那样,GL 将执行的三角形插值不是您想要的。 所以普通数据不能直接来自顶点数据。

恐怕您所设想的解决方案是您能实现的最佳解决方案。无论您选择什么,都需要将 [0..1] 系数从顶点传递到着色器(包括 2x2 纹理。您需要它们作为纹理坐标)。

不过,您可以采取一些技巧来稍微简化该过程。

  • 使用顶点 ID 可以帮助您找到从顶点传递到片段着色器的顶点“角”(我们的 [0..1] 值)。对最低 2 位进行简单的位测试可以让您知道要传递哪个角,而无需输入实际的顶点数据。如果打包纹理数据,您仍然需要在纹理内传递标识符,因此这可能没有实际意义。
  • 如果您使用 2x2 纹理来允许插值,则会出现(是?)一些问题。如果源一开始的精度较低,则某些纹理插值器不一定能提供高精度插值。这可能需要您将纹理数据类型更改为更高精度,以避免出现条带伪影。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何对四边形上的法线进行双线性插值? 的相关文章

随机推荐

  • Django 多对多模型 DRF

    我有以下模型结构 class Project models Model author models ManyToManyField Account name models CharField max length 40 default Ne
  • 如何在View和ViewModel之间传递数据

    我是 MVVM 设计模式的新手 我正在尝试创建一个简单的应用程序 其中主窗口中显示学生列表 我希望用户能够将新学生添加到我已完成的列表中绑定学生数据所在的可观察集合 但如何通过从文本框中获取数据并将其用作命令中的参数来创建新用户 这是我的观
  • 如何测试飞行路线迁移?

    通常迁移脚本很简单 例如添加新列等 如果应用程序已部署 则一切正常 但有时需要测试一些复杂的逻辑 推荐的方法是什么 有一个单独的数据库用于测试 将其作为每个构建的一部分进行迁移 并针对它运行测试 您还可以根据需要添加额外的测试数据 包括用于
  • Laravel Sanctum 可以使用 Multiauth 防护

    我正在用 laravel sainttum 进行测试 但这里有一些问题 我正在创建管理员警卫 当我将中间件更改为 auth sanctum admin 它应该只能由管理员访问 但在这里我可以使用带有网络防护的普通用户帐户进行访问 我不知道为
  • 有没有一种方法可以创建一个 pandas 数据框,其行是整数,这些整数会增加直到每行达到某个值?

    例如 假设我有整数数组 5 3 7 6 4 我希望找到一种有效的方法来创建如下所示的 pandas 数据框 数据帧中的第一行应包含数字 1 到 5 第二行应包含数字 1 到 3 依此类推 有没有办法在不循环的情况下实现这一目标 一个简单的单
  • 将枚举值传递给 PowerShell 中的函数

    我有一个接受枚举值作为参数的函数 举个例子 考虑一下这样的事情 PS gt function IsItFriday System DayOfWeek dayOfWeek if dayOfWeek eq System DayOfWeek Fr
  • SQL 行之间的差异

    我有一个像这样的 SQL 2008 数据库表 name score steve 207 steve 205 steve 200 steve 139 我想得到行之间的差异 eqn 行 行 1 所以我理想地希望它是 steve 2 207 20
  • 如何编写 Nexus Rest Api 的 Get 方法?

    I have groupId artifactId and version 如何使用 Nexus Rest API 编写 GET 请求以获得进一步的工件描述 不确定您要查找什么信息 REST API 文档可在此处获取 Core API ht
  • 如何在 Xamarin Forms 中获取设备的 GPS 位置?

    我想在输入框名为时获取我的设备的经度和纬度实体位置 is focused 我在用Xamarin Essential 地理定位为了获取我的设备的 GPS 位置 我按照文档和教程进行操作 但仍然无法获取 GPS 位置 我已经在我的 Androi
  • 如何在 Android webview 中打开 Microsoft Teams 会议

    我正在尝试在 Web 视图中打开 Microsoft Teams 会议 当我在 Web 视图中打开会议网址时 它开始寻找 MS Teams 应用程序 这是我不想要的 我只想在 Web 视图中参加会议 请帮助我在 Android 应用程序的
  • 包括 ionic 2/Angular 2 的通用标题栏

    我有一个 ionic 2 标题栏 其中包含主页或注销按钮和公司标志这对于所有页面都是通用的 我如何编写一个通用函数 Injectable 这样就可以很容易地包含在所有页面中 而不是重复代码
  • Protractor + AngularJS + Jasmine 在xml文件上获取输出结果

    我正在尝试将量角器结果导出到 xml 文件 我在网上找到了这个很棒的链接 https github com angular protractor issues 60 https github com angular protractor i
  • QMessageBox 带有“不再显示”复选框

    如何显示下面带有 不再显示 复选框的消息框 我想象的东西看起来像这样 Qt 5 2 添加了添加QCheckBox to a QMessageBox 看一下QMessageBox setCheckbox http doc qt io qt 5
  • 同时在 iPhone 和模拟器上进行多点连接测试

    您好 我正在论坛的所有主题中搜索有关如何测试使用多点连接框架的应用程序的信息 有人可以告诉我如何同时使用 iPhone 设备和模拟器 设备上的播放器一和模拟器上的播放器二 来测试应用程序 反之亦然 我已经通过使用两个模拟器 每个 mac 一
  • Stack (Haskell) 使用 GitHub Actions 构建源文件的缓存

    当使用本地构建我的 Haskell 项目时stack build 仅重新编译更改的源文件 不幸的是 我无法让 Stack 在 GitHub Actions 上表现得像这样 请问有什么建议吗 Example 我创建了一个简单的例子Lib hs
  • 从根目录提供主页和静态内容

    在 Golang 中 如何在根目录之外提供静态内容 同时仍然拥有用于提供主页的根目录处理程序 使用以下简单的 Web 服务器作为示例 package main import fmt net http func main http Handl
  • AngularJS:观察尺寸的最佳方式?

    因此 我对此提出了一些解决方案 但我仍然不太确定什么是最好的 首先供参考 我可以找到一个类似的问题 尽管它有点旧了 这是供稍后阅读本文的任何人使用的 观察 Angular 中的尺寸变化 https stackoverflow com que
  • 无法访问androidx.lifecycle.LifecycleOwner,Android中的错误是什么意思?

    在什么情况下 android build android studio 显示这些错误 无法访问 androidx lifecycle LifecycleOwner 和无法访问 androidx lifecycle ViewModelStor
  • iPhone:为什么我收到此错误 --- HTTP 错误 401--- Twitter

    您好 我正在 iPhone 上开发 Twitter 客户端 这里我使用 MGTwitter 库和 OAuthentication 我正在进行身份验证 登录 并获取请求令牌 我的问题是 当我发送请求时我收到错误 请求 8DC1F854 0F1
  • 如何对四边形上的法线进行双线性插值?

    我正在开发一个类似 Minecraft 的引擎 作为一个业余爱好项目 看看体素地形的概念在现代硬件和 OpenGL gt 3 上可以推广到什么程度 因此 我的所有几何体都由四边形 准确地说是正方形 组成 我构建了一个光线投射器来估计环境光遮