【发布时间】: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 个顶点。
-
嗯,好的。我将不得不对这个新信息进行头脑风暴。非常感谢您的帮助。