UE4 iOS Metal FrameBufferFetchMRT

本文讲述了在UE4中尝试在iOS上使用FrameBufferFetchMRT进行深度处理时遇到的问题,详细描述了从Android到iOS平台的差异,以及在iOS上SubpassFetchR_1()不起作用的调试过程。通过GPU Frame Capture和对比HLSL与Metal Shader,最终发现问题是由于spirv-cross导致的绑定错误,并通过修改宏定义解决了问题。
摘要由CSDN通过智能技术生成

最近在手机上尝试了一下把SceneColor改成R11G11B10, 使用FrameBufferFetch来读取深度.
在这里插入图片描述

Android上可以使用framebuffer_fetch_depth_stencil, 但是iOS上不支持DepthFetch.
所以就尝试使用MRT输出一个R16F的Depth, 需要依赖FramebufferFetchMRT的实现.
4.26中UE4已经增加了延迟渲染, FramebufferFetchMRT已经实现了vk和metal的, 所以很方便地就合并了过来, 用法是这样的:
fetch color : SubpassFetchRGBA_0()/SubpassFetchRGBA_1()/…
fetch float : SubpassFetchR_0()/SubpassFetchR_1()/…
这些宏会在Shader编译时被转换成平台相关的Shader, 然后我感觉我就掉进了一个坑.
在这里插入图片描述

代码写完后发现iOS上SubpassFetchR_1()怎么也不起作用(DepthFade的物体没了), 使用XCode GPU Frame Capture看了一下Shader, 结果发现gl_LastFragDataR_1竟然是绑定到了[[color(0)]]上?
在这里插入图片描述
继续把HLSL和DXC的代码dump出来, 没有发现问题, [[vk::input_attachment_index(1)]]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值