当前位置: 首页 > news >正文

UE4 CustomDepthMobile流程小记

原生UE opaque材质中获取CustomDepth/CustomStencil会报错

在其Compile中调用的函数中没有看到报错逻辑

材质节点的逻辑都没有什么问题,所以看一下报错

在HLSLMaterialTranslator::Translate中

修改之后 mobile流程的不透明材质可以直接获取SceneTexture::customdepth节点结果

但是PC流程会崩

材质编译的时候mobile和PC流程都会走 ,deffered流程CustomDepth是在BasePass之后走的,所以拿不到,会报uniformbuffer的错。改官方引擎的话,为了防止报错材质里需要加feature switch。PC这个流程改CustomDepth的渲染顺序改动太大,不如自己新开一个自定义的深度pass。

(以下讨论的都是Mobile流程在opaque材质中用customdepth,非后处理材质的情况)

到这里,Mobile流程的Opaque材质中用节点获取customdepth是可用的,但马上又遇到了下一个问题,在customnode中直接写采样CustomDepthTexture的结果是不对的

截帧查看,场景中物件勾上RenderCustomDepthPass的开关,材质中不用customdepth节点的时候,或者用自定义的custom节点中直接拿采样结果的时候,CustomDepth pass都是没有的。

那就可以确认一点,材质的SceneTexture节点一定有一些引擎相关flag/uniformbuffer相关的配置设置,是否渲CustomDepth pass不只是由模型勾选是否渲自定义深度决定的,材质的compile结果中一定有一些配置相关逻辑。

过一下流程,可以根据Template采样结果定位uniformbuffer,看和后面的分析对不对得上

再看看SceneTexture的Compile中做了哪些操作

在MobileSceneRenderer::InitViews中判断

该buffer包含了PC和Mobile

uniformbuffer的传参是对应上的

到这一步为止,如果我需要写一个循环采样customdepth的结果,是没法直接在材质的customnode中写采样CustomDepthTexture的。需要单独加一个自定义节点,Compile中实现SceneTexture节点配置部分相同的逻辑,然后在Template中添加自定义函数自定义采样逻辑才行。

但是,如果说我就是不想反复改代码,就想要在材质customnode里写呢。

其实是可以的,比如是否可以如下修改

这样修改后,原本是场景物体要勾RenderCustomDepthPass开关,并且材质节点SceneTexture走Complie逻辑后beShouldRenderCustomDepth才为true。而修改后是场景中物体只要勾了RenderCustomDepthPass开关,beShouldRenderCustomDepth就会true。这样改的好处是材质customnode中就可以直接写采样MobileSceneTextures的结果了,但是坏处是这样改不太符合管线设计的逻辑,比如这样场景中物件只要打了勾,后面材质没有到自定义深度信息,customdepthpass也是一直走的,不安全。总结就是能用,但最合理的方案还是单加上述的材质自定义节点。

相关文章:

  • 业务逐字稿
  • 在探最大模定理
  • TR-069/TR-369设备管理
  • vue3 el-pagination 将组件中英文‘goto’ 修改 为 中文到‘第几’
  • Google Chrome 中出现 ERR_SSL_KEY_USAGE_INCOMPATIBLE 错误
  • yolov5 deepsort 行人/车辆(检测 +计数+跟踪+测距+测速)
  • 在数字化营销的大背景下,企业微信营销的挑战与应对策略
  • 【C++】wxWidgets编程的程序入口点
  • 桥接模式解析
  • 【vue】vue.config.js里面获取本机ip:
  • QML语法 | 导入语句(import)
  • WPF自定义控件,聚合器模式传递消息
  • 面试题整理
  • C语言每日一题(49)二叉树的三种基本遍历方法
  • Web开发8:前后端分离开发
  • 自己简单写的 事件订阅机制
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • 2017年终总结、随想
  • django开发-定时任务的使用
  • Git 使用集
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • JAVA之继承和多态
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • mysql 5.6 原生Online DDL解析
  • MySQL主从复制读写分离及奇怪的问题
  • PHP 小技巧
  • socket.io+express实现聊天室的思考(三)
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 浮动相关
  • 复习Javascript专题(四):js中的深浅拷贝
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 爬虫进阶 -- 神级程序员:让你的爬虫就像人类的用户行为!
  • 如何使用 JavaScript 解析 URL
  • UI设计初学者应该如何入门?
  • 湖北分布式智能数据采集方法有哪些?
  • #{} 和 ${}区别
  • #Datawhale AI夏令营第4期#AIGC方向 文生图 Task2
  • (1)Map集合 (2)异常机制 (3)File类 (4)I/O流
  • (20050108)又读《平凡的世界》
  • (undone) MIT6.824 Lecture1 笔记
  • (六)vue-router+UI组件库
  • (七)理解angular中的module和injector,即依赖注入
  • (十二)springboot实战——SSE服务推送事件案例实现
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • .chm格式文件如何阅读
  • .locked1、locked勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .net core使用RPC方式进行高效的HTTP服务访问
  • .NET 表达式计算:Expression Evaluator
  • .net 调用php,php 调用.net com组件 --
  • .net打印*三角形
  • .Net高阶异常处理第二篇~~ dump进阶之MiniDumpWriter
  • .net连接oracle数据库
  • .NET中使用Protobuffer 实现序列化和反序列化
  • /dev/VolGroup00/LogVol00:unexpected inconsistency;run fsck manually