前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >UE4 iOS Metal FrameBufferFetchMRT

UE4 iOS Metal FrameBufferFetchMRT

作者头像
逍遥剑客
发布2020-12-01 10:29:46
1.7K0
发布2020-12-01 10:29:46
举报

最近在手机上尝试了一下把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)]]里面的index是1

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

所以证明代码写得应该没有问题, 问题出在HLSL转换Metal Shader这一步. 猜测可能是没有[[color(0)]], [[vk::input_attachment_index(1)]]就给绑定到了[[color(0)]]上了? 于是尝试把DepthFetch的宏定义改成这个样子:

代码语言:javascript
复制
#define DepthbufferFetchES2() (SubpassFetchRGBA_0().w * 0 + SubpassFetchR_1())

在这里插入图片描述
在这里插入图片描述

可以看到生成的HLSL里已经有[[vk::input_attachment_index(0)]]了

在这里插入图片描述
在这里插入图片描述

Metal Shader这边终于正确地绑定到了[[color(1)]], 而且[[color(0)]]因为乘零的关系还被优化掉了. 撞大运式编程又解决了一个问题…虽然还是没找到根源@_@

在这里插入图片描述
在这里插入图片描述

确定了是spirv-cross 的锅, 4.26改了一下

在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-11-27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档