【问题标题】:Accessing barycentric coordinates inside fragment shader在片段着色器中访问重心坐标
【发布时间】:2014-08-20 05:52:47
【问题描述】:

在片段着色器中,值是自然插值的。例如,如果我有三个顶点,每个顶点都有一种颜色,第一个顶点为红色,第二个顶点为绿色,第三个顶点为蓝色。如果我用它们渲染一个三角形,预期的结果是常见的 triangle.

显然,OpenGL 会计算三角形内每个点的插值系数 (a, b, c)。有什么方法可以显式访问这些值,还是我需要计算三个顶点的片段坐标并自己找到该点的重心坐标? 我知道这是完全可行的,但我认为 OpenGL 可以提供一些东西。

【问题讨论】:

标签: opengl glsl fragment-shader


【解决方案1】:

我不知道任何用于获取重心坐标的内置函数。但是您应该不需要在片段着色器中进行任何计算。

您可以将三角形顶点的重心坐标作为属性传递给顶点着色器。 3 个顶点的属性值就是 (1, 0, 0)、(0, 1, 0) 和 (0, 0, 1)。然后将属性值传递给片段着色器(在旧版 OpenGL 中使用 varying 变量,在顶点着色器中使用 out,在核心 OpenGL 中使用片段着色器中的 in)。那么片段着色器接收到的变量的值就是片段的重心坐标。

这与您通常将纹理坐标传递给顶点着色器的方式非常相似,然后它们将它们传递给片段着色器,后者接收插值。

【讨论】:

  • 明白。虽然我的场景比这个三角形更复杂,但我可以使用相同的想法。谢谢你的回答,有空我会在这里更新。
  • 我想补充一点,这将导致不是 GL 在光栅化期间将计算的重心坐标,因为光栅化器在二维屏幕空间中工作。你在这里得到的是相对于三角形的 3D 对象空间的重心坐标,没有被预失真。如果你想要真正的屏幕空间重心坐标,你应该添加noperspective 限定符。从这个问题中并不清楚哪些是期望值。
  • 对于复杂的网格,每个顶点是否需要三个vec3 重心坐标?或者你可以只用一个就逃脱?如果是三个,那么如何防止它们在不同但相邻的三角形之间发生冲突?
  • @NickWiggill 好问题......我不确定你会如何做到最好。如果您本来有共享顶点的网格,那么这看起来肯定会变得很棘手。您无法轻松地为多个三角形使用的顶点共享此新属性。如果想到什么,我会发布,听起来是个有趣的问题。
  • @RetoKoradi,非常感谢。实际上,我在one of your other answers 上为我的用例找到了部分解决方案!唯一的问题是我在四边形中有一个中心顶点,因此希望同时拥有两条对角线(以 x 形式)。我认为可以在片段着色器中通过检查 x 和 y 轴上的模数来确定我们与对角线的接近程度,并在那里渲染......这应该是一个完整的解决方案。如果有,会在那里发帖。
【解决方案2】:
猜你喜欢
  • 2014-05-17
  • 2020-03-03
  • 2015-08-30
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-27
  • 2018-10-03
相关资源
最近更新 更多