【问题标题】:Is it possible to access all vertices in a polygon in a vertex shader?是否可以在顶点着色器中访问多边形中的所有顶点?
【发布时间】:2012-01-18 18:24:30
【问题描述】:

我正在尝试在 Unity 中创建线框顶点/片段着色器。根据this paper,这似乎是可能的。一般的想法似乎是您将在顶点着色器中计算的距离向量传递给片段着色器中的每个片段,它可以使用它来确定根据线框线在多边形中的位置绘制线框线的亮度。

不过,从我读过的所有其他内容来看,您似乎只能访问顶点着色器中的单个顶点。对于 ecah 顶点,我需要访问多边形中的所有相邻顶点。该论文似乎暗示不需要几何着色器,这很好,因为 Unity 还不支持它们。

我错过了什么?是否永远不可能访问顶点着色器中的相邻顶点?如果没有几何着色器,我想要做的事情是不可能的吗?

【问题讨论】:

    标签: shader unity3d fragment-shader cg vertex-shader


    【解决方案1】:

    您似乎确实过度阅读了 2.1 中的段落

    步骤 G1 通常总是在顶点着色器中执行。步骤 G2 应该在几何着色器中执行,因为几何着色器 可以访问多边形的所有顶点(假设它是一个三角形)。 因此,如果不使用几何着色器,则顶点着色器 需要接收其他顶点作为属性才能计算 距离。这意味着应用程序代码不是一成不变的 是否使用线框方法,需要额外的数据 被传输,最后,索引原语的使用是 排除,因为顶点的属性取决于哪个三角形 绘制。

    因此,当不使用几何着色器时,您确实不知道三角形的其他顶点,因此必须将它们作为附加顶点属性传输。因此,对于三角形的每个顶点,您将获得两个额外的 vec3 属性,其中包含该三角形其他两个顶点的位置。当然,正如文中所说,您不能使用索引绘图,因为这两个属性不仅取决于顶点位置,还取决于该顶点所属的三角形。

    【讨论】:

    • 感谢您的帮助。您知道这些限制是否可以在 Unity 引擎中克服吗?是否可以在 Unity 使用的 Cg 着色器中传递这些额外信息?从哪里传球?
    • @aardvarkk 这些约​​束无法克服,因为它们是底层硬件/接口的约束,而不是引擎或着色语言的约束。顶点着色器只能访问单个顶点,您需要将另外两个作为该顶点的属性。我对 Unity 没有任何经验,但 Cg 当然具有每个顶点的属性,我确信 Unity 有一些方法可以为您的模型的顶点提供自定义属性。
    • @aardvarkk 那么您对原始问题还有其他问题吗(如果您可以在 VS 中访问邻居,并且如果没有 GS,您的目标是不可能的)?你不会从任何了解顶点和几何着色器的人那里得到任何不同的答案。 Unity 与它没有任何关系,因为它无法神奇地克服底层图形硬件的限制。
    • 嗯,您的回答肯定会有所帮助,但我希望获得有关如何在 Unity 中实现它的更具体的指导。我昨晚的想法是将三角形的另外两个顶点作为UV坐标传递,然后将它们解包到顶点着色器中进行距离计算。我不确定这是否现实甚至可能,但我想在接受答案之前尝试一下。
    • @aardvarkk 我猜到了,但是您可以更新您的问题或创建一个新问题(因为它不要求任何 Unity)。但没关系,如果 Unity 支持多个 3d texCoords,您的想法听起来是最好的方法。或者如果它只支持 2d texCoords,您可以使用 3 个 2d texCoords 并在着色器中自己将它们解压缩为 2 个 float3s。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-16
    • 1970-01-01
    相关资源
    最近更新 更多