我已经在iOS上将渲染设置为具有颜色和深度纹理的帧缓冲区,一切正常。然后我尝试通过APPLE扩展添加多重采样(我使用了这段代码Rendering to texture on iOS OpenGL ES—works on simulator, but not on device),但显然有一个问题。
将多重采样缓冲区解析为原始帧缓冲区(我用于后处理效果)后,我只解析了颜色缓冲区。 glResolveMultisampleFramebufferAPPLE()显然根本不触及我的深度纹理,所以如果我使用多重采样我必须放弃我的深度纹理效果。如果我使用多重采样,是否无法获得深度纹理?我知道多重采样是如何工作的,我只想在颜色纹理旁边有一个深度纹理。
答案 0 :(得分:0)
APPLE_framebuffer_multisample
上的规范告诉glResolveMultisampleFramebufferApple
解析颜色附件,这意味着你必须在额外的渲染过程中为颜色渲染缓冲区写入深度并解析它以获取深度信息。
答案 1 :(得分:0)
好的,经过几天的调查,我得到了答案。 所以APPLE扩展存在(并且与EXT扩展不同)只是因为它只解析颜色。 GL ES 3.0标准(可能来自iOS 7.1)或DesktopGL表示,为了解决颜色或深度,您可以使用glBlitFramebuffer来复制和解析事物。我用DesktopGL 4.2尝试了它,并且深度缓冲区可以工作。
我还回到了我的DirectX11渲染器并使用支持DirectX 11.1级别功能的GPU尝试了同样的事情,我很惊讶前沿硬件无法在单个解析调用中执行此操作。当您尝试解析绑定为深度的纹理时,ID3D11DeviceContext :: ResolveSubresource会引发错误。解决方法是要么有一个特殊的着色器通道来进行深度解析,但这意味着使用Texture2DMS(一个DirectX 10_1级别的功能)或者通过2个不绑定深度的单独纹理对纹理进行乒乓(表示1解析调用)和2个全深度纹理副本)。
在GL中使用相同的对应物意味着使用glTexImage2DMultisample图像而不是多重采样渲染缓冲区(Desktop OpenGL 3.1的一部分),然后在像素着色器中使用sampler2DMS进行实际的着色器纹理像素提取。
编辑:glBlitFramebuffer是否解析深度似乎被标记为依赖于实现。在桌面GL(HD7850)上它可以工作,在GLES3上它仍然无法解决它。