写一个自己的移动端shading model!

3 篇文章 0 订阅
2 篇文章 0 订阅

先说一下这个是基于UE4 4.24版本的,貌似每个版本的API都有点小改动。

由于项目需要做一些定制化的shader,又是UE4手游,找了下大部分文章都是deferred管线的自定义shading model,刚好研究了一周搞定了一个基础版本的效果,在此做一下记录。

关于各向异性头发的算法网上一搜一大堆,由于本篇的核心内容在于如何自定义一个移动端的shading model故在shader部分不会过多进行解释。

 

EngineTypes.h

首先开始我们自定义shading model的第一步,添加一个枚举成员。

记得要写在MSM_NUM前面,枚举可以转换为整形。

 

Material.cpp

找到switch (InProperty){},将customdata0~1的接口开放给我们的自定义shading model

 

HLSLMaterialTranslator.h

 

MaterialGraph.cpp

这里是用来修改材质列表显示的名字的地方。 例如Customdata0和Customdata1,我不喜欢这两个默认的名字,所以我把它们改成了我自定义的名字:

自此C++部分就修改完成了,你可以直接编译引擎,等待一阵子后打开该引擎创建的项目,随便创建一个材质球就可以看到:

已经有我们的自定义shading model啦!

有没有发现我有些接口名也变了?其实道理是一样的,你可以把这些默认的接口名都改成你自己想要自定义的名称!

 

MobileBasePassPixelShader.usf

前面我们自定义界面UI已经做完了,接下来就是写shader的部分了。移动端其实蛮简单的,C++部分完了就直接来这里写自己想要的效果即可,延迟渲染部分其实还要设置很多地方,比如将数据传给Gbuffer就需要额外修改几个ush文件,这里暂时不做赘述。

观察一下,官方的水shading model原来在移动端也有定义,而它怎么分辨这一段shader是属于水的是靠我们之前在HLSLMaterialTranslator.h中的定义:

看到这串眼熟的代码 ,是不是和我们定义的那段字符串很像?

所以如果想单独对我们的shading model进行全部/部分着色器的定制化,也可以直接使用这个宏:

如果要写shader,必须写在Main函数里面。 用过unity的小伙伴应该知道,顶点着色器和像素着色器里面是不能写函数方法的,要写的话只能写在外面。其实DX的原理是一样的,把Void Main(){}当做是顶点着色器和像素着色器就好,方法写在Main函数外面即可。

因为我这个案例是各向异性头发,其实涉及不到顶点部分,所以这里只修改到了MobileBasePassPixelShader.usf, 如果有需求要修改到顶点着色器部分,则在MobileBasePassVertexShader.usf部分。

 

MaterialTemplate.ush

一个比较有用的接口库,可以在这里找到大部分想要的涉及到shader光照计算的数据以及材质UI的接口函数。

例如这三个GetMaterial函数,其实就是获取的

这三个地方的输入值,相当于unity中 float4 Color : TexCoord3的意思,texcoord存储器。这些get函数可以很容易的在MaterialTemplate.ush文件中找到。

此外还可以找到顶点色,世界法线,顶点法线,灯光方向等等信息。

 

最后,我自己的shading model初版

希望这篇文章对你写自己的移动端shading model有所帮助。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值