0

我已经在 iOS 上设置了渲染到具有颜色和深度纹理的帧缓冲区,一切正常。然后,我尝试通过 APPLE 扩展添加多重采样(我在 iOS OpenGL ES 上使用此代码渲染到纹理 - 适用于模拟器,但不适用于设备)但显然有一个问题。

在将多重采样缓冲区解析为我的原始帧缓冲区(用于后期处理效果)之后,我只解析了颜色缓冲区。glResolveMultisampleFramebufferAPPLE() 显然根本没有触及我的深度纹理,所以如果我使用多重采样,我必须放弃我的深度纹理效果。如果我使用多重采样,有没有办法获得深度纹理?我知道多重采样是如何工作的,我只想要颜色纹理旁边的深度纹理。

4

2 回答 2

0

Spec onAPPLE_framebuffer_multisample告诉glResolveMultisampleFramebufferApple解析颜色附件,这意味着您必须在附加渲染通道中将深度写入颜色渲染缓冲区并解析它以获取深度信息。

于 2013-07-17T17:19:36.237 回答
0

好的,经过几天的调查,我得到了答案。所以 APPLE 扩展存在(并且与 EXT 不同)只是因为它只解析颜色。GL ES 3.0 标准(可能会出现在 iOS 7.1 中)或 DesktopGL 表示,为了解析颜色或深度,您可以使用 glBlitFramebuffer 来复制和解析事物。我用 DesktopGL 4.2 尝试过,并且对深度缓冲区进行了 blitting。

我还回到了我的 DirectX11 渲染器,并在支持 DirectX 11.1 级别功能的 GPU 上尝试了同样的事情,我很惊讶领先的硬件无法在一次解析调用中做到这一点。当您尝试解析绑定为深度的纹理时,ID3D11DeviceContext::ResolveSubresource 会引发错误。解决方法是要么有一个特殊的着色器通道来进行深度解析,但这意味着使用 Texture2DMS(一个 DirectX 10_1 级别功能),或者通过 2 个不绑定深度的单独纹理来乒乓纹理(意味着 1 个解析调用和 2 个全深度纹理副本)。

在 GL 中使用相同的对应物意味着使用 glTexImage2DMultisample 图像而不是多重采样渲染缓冲区(桌面 OpenGL 3.1 的一部分),然后在像素着色器中使用 sampler2DMS 进行实际的着色器纹理提取。

编辑: glBlitFramebuffer 是否解析深度似乎被标记为依赖于实现。在桌面 GL (HD7850) 上它可以工作,在 GLES3 上它仍然无法解决它。

于 2013-08-03T09:14:28.637 回答