【问题标题】:HLSL shaders and accessing current location the GPU is at in the index bufferHLSL 着色器和访问 GPU 在索引缓冲区中的当前位置
【发布时间】:2013-02-22 15:02:01
【问题描述】:

我的问题很基础。

在着色器代码中是否有 HLSL 着色器指令或任何方式来访问 GPU 在索引缓冲区数组中的当前位置?我正在使用 XNA Game Studio 4.0,它通过 GraphicsDevice.DrawIndexedPrimitives() 方法将 VertexBuffers 和 IndexBuffers 传递给每个网格的图形管道。我知道 GPU 在内部迭代 IndexBuffer,但我希望能够确定 GPU 当前位于 IndexBuffer 中的哪个条目:

用伪代码表达我的意思: IndexBuffer[i],我想知道GPU当前正在处理的i的值。

这样做的原因是我想知道当前正在渲染哪个多边形,而仅仅通过知道顶点是不可能知道的,因为单个顶点总是在多个多边形之间共享。

我的问题清楚了吗,谁能帮助我?

提前致谢。

【问题讨论】:

  • 在顶点着色器中,您只处理一个顶点,因此您无法知道实际渲染的是哪个图元(因为它实际上尚未组装)。在 DirectX 10+ 中,您可以知道顶点 ID(SV_VertexID 输入语义),但它仍然不是基于多边形的。出于兴趣,您想为此做什么,可能有助于为它提供更多定制的答案。
  • 感谢您的回复。我设计了一种将 uv 坐标分配给模型的方法,但它是基于多边形的。我通过创建一个与 IndexBuffer 不同步的“textureIndexBuffer”来实现这一点。即 indexBuffer[i] 对应于 textureIndexBuffer[i]。 textureIndexBuffer 只是一个构造数组:
  • mm 我想在这种情况下最好的方法是分割顶点,因为顶点是共享的,它们将共享 uv。唯一可以做到这一点的其他方法是使用几何着色器,并且 afaik 你不能在 xna 中访问它,否则如果你需要 2 个 uv 用于相同的顶点,那么你需要有 2 个顶点。
  • 嗯,好的。我将不得不对这个新信息进行头脑风暴。非常感谢您的帮助。

标签: xna hlsl


【解决方案1】:

简单的答案:不要共享顶点,并将多边形 ID 作为顶点属性包含在内。

如果您了解有关曲面细分的特殊事实(例如,它是一个球体,或者 UV 布置在一个网格中,等等 - 所以多边形的位置是可预测的),可能会有更奇特的答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多