在几何着色器中写入纹理,在片段着色器中写入样本

Write to texture in geometry shader and sample in fragment shader

提问人:omniyo 提问时间:11/6/2023 最后编辑:Ken Whiteomniyo 更新时间:11/6/2023 访问量:57

问:

是否可以在几何着色器中写入纹理并在片段着色器中对此纹理进行采样?如果是这样,描述符的设置将如何完成?如何在几何着色器中VK_DESCRIPTOR_TYPE_STORAGE_IMAGE图像,而在片段着色器中VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER图像?

武尔坎

评论

0赞 Erel 11/6/2023
出于好奇,你想这样做的原因是什么?
0赞 omniyo 11/6/2023
这只是一个玩具示例,其中包含不同的方法来做大纲以熟悉 vulkan 和具体描述符。这种情况包括通过在几何着色器中生成法线纹理来执行轮廓效果,并比较每个片段、每个法线及其相邻片段法线,以获得平均增量角度,以了解该片段是否应勾勒出轮廓。我知道它效率不高,但它认为学习和做一些与已经存在的 vulkan 示例不同的事情可能会很有趣。出于好奇,你会采用什么方法来做这个 GS 练习?:)
1赞 Erel 11/6/2023
老实说,我会反对使用几何着色器......计算着色器在所有 Vulkan 实现中都是强制性的,它们在性能和工作流程语义方面都提供了更好的替代方案。我坚信它们被放在 Vulkan(带有 Transform Feedback 扩展)中,以帮助开发人员将他们的应用程序从 GL 移植到 Vulkan。我的意思是,即时生成基元对性能不利。撇开这一点不谈,如果你正在寻找一种聪明的方法来绘制轮廓,Ben Golus 写了一篇关于这个问题的非常好的文章,题为“对非常宽轮廓的追求”。

答:

0赞 Nicol Bolas 11/6/2023 #1

是否可以在几何着色器中写入纹理并在片段着色器中对此纹理进行采样?

不作为采样图像。

可以写入限定的存储映像,并将其作为限定的存储映像进行读取...只要您遵守可见性和可用性规则。coherentcoherent

GS 调用写入一个或多个基元。这些基元生成片段。这些片段的片段着色器只能读取由编写其基元的 GS 调用写入的数据(即使如此,也只能执行这些 GS 调用,直到它们调用自己的基元为止)。即使是理论上应该在提交顺序中更早发生的 GS 调用也无法访问。EmitPrimitive

评论

0赞 omniyo 11/6/2023
我不能在不调用 EmitVertex 的情况下在 GS 中使用“imageStore”生成法线纹理吗?并在片段着色器中读取当前片段及其相邻片段的纹理,以获取检测边缘的法线变化程度?我知道有更好的方法来做大纲,但只是想练习一些不同的东西。