OpenGL GLSL:从着色器到内存的输出



我需要在图形内存中有一些变量/对象,可以在我的片段着色器和我的正常c#代码中访问。最好是16字节的vec4

我想做什么:

  1. [在c#中]从图形内存读取变量到cpu内存
  2. [在c#中]设置变量为零
  3. [在c#中]执行场景的法线绘制
  4. [In Shader] 一个的片段传递写一些东西到变量(UPDATE)
  5. 重启循环

(更新)我将当前鼠标坐标传递给带有统一变量的片段着色器。然后片段着色器检查它是否是相应的像素。如果是,它会将一种特定的颜色写入到变量中。我不写FS输出的原因是,我根本没有找到任何解决方案在互联网上如何得到这个输出到我的正常内存。此外,我将为每个像素输出,而不是一个

我想要的基本上是一个统一的变量,着色器可以写入。

是否有任何类型的变量/对象适合我的需要,如果是的话,它的性能如何?

你的着色器可以写入的"统一"是错误的术语。Uniform的意思是一致的(在任何地方都是相同的值)。如果一个特定的着色器调用改变了这个值,它就不再是统一的了。

你可以使用原子计数器来处理这类事情;为每个通过的测试增加计数器,然后检查非零状态。这比设置一个通用的着色器存储缓冲对象,然后担心内存访问它的一致性要简单得多。

闭塞查询也可用于较旧的硬件。它们的工作原理与原子计数器惊人地相似,在原子计数器中,您可以(非常粗略地)计算通过深度测试的片段数量。不要指望它的准确性,使用discard在你的片段着色器的任何像素,没有通过你的测试条件,然后测试非零片段计数在查询读回。


至于性能,只要在发出命令和随后使用结果之间能够处理几个帧的延迟,就应该没问题。

如果您尝试使用原子计数器或遮挡查询,并在同一帧内回读结果,您将停止管道并消除CPU/GPU并行性。

我建议在命令流中插入一个fence同步对象,然后在尝试读取结果之前每帧检查一次fence的状态。

相关内容

  • 没有找到相关文章