在片元着色器内访问重心坐标

6
在片段着色器中,值会自然地进行插值。例如,如果我有三个顶点,每个顶点都有一个颜色:第一个顶点为红色,第二个顶点为绿色,第三个顶点为蓝色。如果我用它们来渲染一个三角形,期望的结果是常见的三角形
显然,OpenGL会为三角形内的每个点计算插值系数(a、b、c)。是否有任何方法可以显式访问这些值,还是需要计算三个顶点的片段坐标并自己找到点的重心坐标?我知道这是完全可行的,但我认为OpenGL可能已经提供了一些东西。

[GLSL规范4.5,第7章,内建函数](https://www.opengl.org/registry/doc/GLSLangSpec.4.50.pdf)没有说明内建函数具有重心坐标。也许您可以滥用[Tesselation](http://ogldev.atspace.co.uk/www/tutorial30/tutorial30.html),但我无法评论这是否可行。 - Stefan Hanke
2个回答

12

我不知道有没有内置的方法可以获取重心坐标。但是在片元着色器中你不需要进行任何计算。

你可以将三角形顶点的重心坐标作为属性传递到顶点着色器中。对于3个顶点,属性值分别是(1, 0, 0), (0, 1, 0)和(0, 0, 1)。然后将属性值通过传递到片元着色器(在旧版OpenGL中使用varying变量,在核心OpenGL中使用顶点着色器中的out和片元着色器中的in)。接收到的变量值就是片元的重心坐标。

这与通常将纹理坐标传递到顶点着色器中并将其传递到片元着色器的方式非常相似,后者接收到插值后的值。


明白了。虽然我的情况比这个三角形更复杂,但我可以使用相同的思路。谢谢你的回答,我会在能够时更新这里。 - Daniel Pinto Coutinho
4
我想补充一下,这将得到的结果 不是 GL 在栅格化期间计算的重心坐标,因为栅格化器在二维屏幕空间中工作。在此处获得的是相对于三角形的三维对象空间的重心坐标,不受透视扭曲的影响。如果您想要真正的屏幕空间重心坐标,您应该添加“noperspective”限定符。从问题中并不清楚哪些是所需的值。 - derhass
3
对于一个复杂的网格,每个顶点是否需要三个vec3重心坐标?或者只需要一个是否就可以了?如果需要三个,那么如何避免它们在不同但相邻的三角形之间发生冲突? 对于复杂的网格,每个顶点需要三个vec3重心坐标。这些坐标用于插值计算顶点在三角形内的位置。为了避免在不同但相邻的三角形之间出现冲突,可以使用“重心坐标插值”技术来确保在三角形边界处平滑过渡。 - Engineer
@NickWiggill 很好的问题...我不确定什么是最好的做法。如果你原本有共享顶点的网格,那么这肯定会变得棘手。你不能轻松地为被多个三角形使用的顶点共享这个新属性。如果我想到了什么,我会发帖的,听起来像是一个有趣的问题。 - Reto Koradi
@RetoKoradi,非常感谢。我实际上在你的另一个答案中找到了我的用例的部分解决方案!唯一的问题是我有一个四边形中心点,所以希望有两个对角线(x形式)。我认为可以通过检查x和y轴上的模数来确定我们离对角线有多近,并在那里渲染...这应该是一个完整的解决方案。如果是这样,我会在那里发布。 - Engineer
@ArcaneEngineer。我认为四色定理适用于具有平面连通性的网格上共享顶点。维基百科说,一个环面需要最多7种颜色。但也许vec4可以足够好地解决大多数问题。 - Samuel Danielson


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接