Opengl 除了抗锯齿,我可以使用多采样缓冲区吗?

Opengl 除了抗锯齿,我可以使用多采样缓冲区吗?,opengl,directx,shader,transparency,multisampling,Opengl,Directx,Shader,Transparency,Multisampling,我做了一些搜索,但我发现的唯一结果是抗锯齿和它背后的机制 我想使用多样本缓冲区来处理除抗锯齿以外的其他事情。具体来说,我想到的是一种与顺序无关的透明度,在每个样本中存储不同的颜色和深度值(理想情况下是离相机最近的N个片段) 一开始这可能吗?以前做过吗?如果是,怎么做?即使有可能,它是否比只分配另一个N帧缓冲区更高效 如果像这样的东西需要一个计算着色器或OpenCL,那很好,我只是想看看它是否可能在第一位 这个问题并不特定于OpenGL或DirectX,因为这两种情况下的硬件都是相同的 PS.请不

我做了一些搜索,但我发现的唯一结果是抗锯齿和它背后的机制

我想使用多样本缓冲区来处理除抗锯齿以外的其他事情。具体来说,我想到的是一种与顺序无关的透明度,在每个样本中存储不同的颜色和深度值(理想情况下是离相机最近的N个片段)

一开始这可能吗?以前做过吗?如果是,怎么做?即使有可能,它是否比只分配另一个N帧缓冲区更高效

如果像这样的东西需要一个计算着色器或OpenCL,那很好,我只是想看看它是否可能在第一位

这个问题并不特定于OpenGL或DirectX,因为这两种情况下的硬件都是相同的


PS.请不要只向我指出与顺序无关的透明度的其他方法,这个问题特别是关于多采样缓冲区是否可以用于非典型手段。

最大的问题是,系统硬编码为使用多采样进行多采样,而不是用于存储任意数据

通过使用,可以将片段着色器的结果定向到多采样缓冲区的特定采样。然后,您可以使用着色器执行自定义多采样解析,以便执行透明度排序或您计划在此处执行的任何操作

当然,从理论上讲。然而,实际上,
gl_SampleMask
将与光栅化器为该片段计算的样本掩码进行逻辑和加密。因此,如果您将
gl_SampleMask
设置为写入片段未包含的特定样本,则不会写入任何内容

你对此无能为力。即使显式激活每采样片段着色器求值也不会对您有所帮助,因为系统仍将基于您渲染的几何体计算并使用该遮罩


因此,一般来说,不,除了抗锯齿,没有多少可以使用多重采样。

我不这么认为,除非你可以编程光栅化器。使用DX12可能是可行的,但我不知道。这可能使其可用于非抗锯齿使用。但你的想法似乎仍然不可能。我自己从未尝试过,但从OpenGL 4.0开始,可以使用
gl\u SampleMask
变量从片段着色器设置样例掩码。这是一个有趣的想法,但我看不出有任何效果。即使使用@BDL中的
gl\u SampleMask
,也无法正确处理三角形的边,因为无法写入未被基本体覆盖的像素。例如,当使用2x2多重采样时,您的原语覆盖了4个子像素中的3个子像素,第4个子像素无法写入。我将首先为每像素计数提供一个附加纹理。然后可以在片段着色器中设置样本掩码,以便将每个写入操作分发到另一个样本。基本上,它使用multisampletexture的采样来存储每个像素的不同值。在我看来,现在使用图像加载/存储功能会更容易,这使得编写这样的东西更容易。