我希望能够访问网格前面多边形的多边形id(PrimitiveID)。我只能在像素着色器中的光栅化器阶段之后看到这种情况。
我正在考虑创建一个追加缓冲区,但由于像素着色器被多次执行,它可能会多次追加相同的多边形ID。
我还想过创建一个数组布尔变量,并使用像素着色器中输入汇编程序阶段的原始id作为索引并将其设置为true,但是我必须首先将它们全部设置为false没有UAV缓冲区,除非我在那里遗漏了什么。
任何人都可以给我一些可能的解决方案。
编辑#1: 我正在为3D模型查看器实现“显示面法线”功能。我想只能在线框模式下看到绘制面的面法线。
编辑#2(可能的解决方案):现在我正试图用cuda或opencl来实现它。我想我不需要sv_primitiveId,如果我只是对观看截头音乐中的基元执行点积。这是Drop的回答。答案 0 :(得分:1)
免责声明:我从未尝试过任何此类操作,甚至不确定它是否有效甚至可实施。只是想法,思考。
BTW,我仍然很好奇为什么你需要这个;)
在真正的硬件剪辑之前,你可以自己模仿背面剔除
SV_PrimitiveID
添加到输出使用像素着色器输出id的方法:
std::vector
+ <algorithm>
可以解决问题。使用bool数组方法,您可能无法使用AppendStructuredBuffer
,但如果您在渲染之前知道原始计数,则可以使用StructuredBuffer
,用零初始化它并简单地写入它而不是追加。
当然,任何时候你都可以纯粹在CPU方面做到这一点。但那并不那么有趣。
由于评论而添加。哇,当你说&#34;在每个多边形面上画一些东西&#34;时,Nvidia DirectX 10 SDK中的SolidWireframe sample立即浮现在我脑海中。它是几何着色器的理想用法。基本上是:
SV_VertexID
,SV_InstanceID
进行欺骗:每个第一个顶点id,每个第二个顶点id,每个第三个顶点id。它会导致分支,但有希望在SM 3.0硬件上工作。希望它有所帮助。请留下评论,如果它会=)