gpt4 book ai didi

opengl - 顶点和片段着色器如何在 OpenGL 中通信?

转载 作者:行者123 更新时间:2023-12-04 19:36:28 26 4
gpt4 key购买 nike

我真的不明白片段着色器是如何工作的。

我知道

  • 顶点着色器每个顶点运行一次
  • 片段着色器每个片段运行一次

  • 由于片段着色器不是按顶点工作而是按片段工作,它如何将数据发送到片段着色器?顶点的数量和碎片的数量不相等。

    它如何决定哪个片段属于哪个顶点?

    最佳答案

    为了理解这一点,您需要考虑整个渲染管道。顶点着色器的输出(除了特殊的输出 gl_Position )作为顶点的“关联数据”传递到管道中的下一个阶段。

    虽然顶点着色器一次只处理一个顶点,根本不关心图元,但管道的进一步阶段确实考虑了图元类型(和顶点连接信息)。这就是通常所说的“原始组装”。现在,我们仍然拥有由 VS 生成的带有关联数据的单个顶点,但我们也知道哪些顶点被组合在一起以定义基本图元,如点(1 个顶点)、线(2 个顶点)或三角形(3顶点)。

    在光栅化期间,为属于图元的输出像素光栅中的每个像素位置生成片段。这样做时,定义原始数据的顶点的相关数据可以在整个原始数据上进行插值。在一行中,这相当简单:完成了线性插值。让我们用一些相关联的输出向量 v 来调用端点 A 和 B,这样我们就有了 v_A 和 v_B。穿过这条线,我们得到 v(x)=(1-x) * v_A + x * v_B 在每个端点的内插值,其中 x 在 0(在点 A)到 1(在点B)。对于三角形,使用所有 3 个顶点的数据之间的重心插值。因此,虽然顶点和片段之间没有 1:1 映射,但 VS 的输出仍然定义了 FS 的相应输入的值,只是不是以直接方式,而是通过跨使用的原始类型的插值间接定义。

    到目前为止我给出的公式有点简化。实际上,默认情况下会应用透视校正,有效地通过以考虑透视失真效果的方式修改公式。这只是意味着插值应该像它在对象空间中线性应用一样(在应用投影失真之前)。例如,如果你有一个透视投影和一些不平行于图像平面的图元,在屏幕空间向右移动 1 个像素确实意味着在真实物体上移动一个可变距离,这取决于实际点到的距离相机平面。

    您可以通过对 GLSL 中的 noperspective/in 变量使用 out 限定符来禁用透视校正。然后,按照我的描述使用线性/重心插值。

    您还可以使用 flat 限定符,这将完全禁用插值。在这种情况下,只有一个顶点(所谓的“激发顶点”)的值用于整个图元的所有片段。整数数据永远不能由 GL 自动插值,并且在发送到片段着色器时必须被限定为 flat

    关于opengl - 顶点和片段着色器如何在 OpenGL 中通信?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28333019/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com