2015-09-17 96 views
3

我做了一些搜索,但是我发现的唯一结果是反锯齿和背后的机制。除了抗锯齿之外,我还可以使用多采样缓冲区吗?

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

这甚至可能摆在首位?它之前是否已经完成,如果是这样,怎么办?即使有可能,它是否比只分配另外N个帧缓存更有记忆效率?

如果是这样,这将需要计算着色器或OpenCL的,这很好,我只是好奇,看看它摆在首位是可能的。

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

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

+0

我不这么认为,除非你可以编程光栅化器。 DX12可能是可能的,但我不知道。这可能使其可用于非反走样使用。但你的想法似乎仍然不可能。 –

+0

从来没有尝试过,但从OpenGL 4.0开始,可以使用'gl_SampleMask'变量[(引用)](https://www.opengl.org/wiki/Built-in_Variable_( GLSL)#Fragment_shader_outputs)。 – BDL

+0

有趣的想法,但我不以任何方式看到这个工作。即使使用来自@BDL的'gl_SampleMask',三角形的边缘也无法正确处理,因为您无法写入未被基元覆盖的像素。例如,当使用2x2多重采样并且您的图元覆盖4个子像素中的3个时,不能写入第4个子像素。 – dari

回答

1

最大的问题是,系统是硬编码使用多重采样,以及多重采样,而不是存储任意数据。

通过使用gl_SampleMask output的,您可以直接片段着色器的结果给多重采样缓冲的一个特定的样本。然后,您可以使用着色器执行自定义多重样本解析,以便执行透明度排序或您计划在此处执行的任何操作。

理论上当然。然而在实践中,gl_SampleMask将逻辑地与由该光栅化器为该片段计算的样本掩码相关联。因此,如果您将gl_SampleMask设置为写入片段未涵盖的特定样本,则不会写入任何内容。

对此,您无能为力。即使明确激活每个样本片段着色器评估也不会对您有所帮助,因为系统仍将根据您渲染的几何图形计算并使用该遮罩。

所以一般来讲,没有,没有太多可以使用多级采样的抗锯齿之外。