当前位置: 华文问答 > 游戏

1、【虚幻4 Shader入门】

2022-06-27游戏

简介

看了一年半的虚幻源代码,终于要开始学习一下材质编辑器入门了,掩饰不了激动之余,就想把这些新手村遇到的东西写点小作文,帮助同样在新手村的同学们走的更稳。文中使用到的资源我会贴在文章的某个地方,比如文章末尾或者文章开头。其他的东西都属于虚幻内置的东西,你使用虚幻4.27可以实现本文中的效果。

内容

本文实现一个逐顶点渲染的Lambert光照效果,效果可能会比较挫,面向的人群是像我这样的TA萌新,如果你学完了OpenGL的什么课程,我希望通过这种类似的内容把你在OpenGL里学到的东西映射到虚幻里面来,作为你熟悉和用上虚幻的开始。如果你觉得本文章分享的效果太差了,那确实如此,毕竟重点不在于效果,而在于教会大家虚幻材质编辑器的基本使用方法。

如果你觉得虚幻什么地方用起来不舒服,也可以一起交流交流,我们可以探讨一下怎么改它。

如果你学到什么地方发现你不会了,那请你告诉我,我补充一下这部分前置内容,如果没人反馈那就当你们都明白了。

当你开始学习一个东西的时候,你才能写出好的教程 --- 罗老师

1、首先新建一个材质球叫:M_LegacyLighting

2、然后双击材质球M_LegacyLighting,考虑到我们要实现逐顶点的光照运算,所以首先你把材质球的ShadingModel选成:Unlit。如下图所示:

如果你不知道什么时候连连看产生的HLSL代码在Vertex Shader里,什么时候在Pixel Shader里,那么你可以参考下面这一篇小作文,关于连连看的工作原理:

3、考虑到我们要实现逐顶点的光照运算,要通过Vertex Shader到Pixel Shader的属性传递来把Vertex Shader阶段算出来的光照信息传到Pixel Shader那边去。所以对材质球进行如下的设置,使用2个额外的UV,来作为VS到PS的属性传递通道,这个地方需要你知道什么是逐顶点光照(OpenGL1.0里那种光照或者我先前出过的Shader课程里的逐顶点光照):

为了方便你找到材质球的属性,建议你在

< style data-emotion-css="19xugg7"> .css-19xugg7{position:absolute;width:100%;bottom:0;background-image:linear-gradient(to bottom,transparent,#ffffff 50px);} < style data-emotion-css="12cv0pi"> .css-12cv0pi{box-sizing:border-box;margin:0;min-width:0;height:100px;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;position:absolute;width:100%;bottom:0;background-image:linear-gradient(to bottom,transparent,#ffffff 50px);}
< style data-emotion-css="1pr2waf"> .css-1pr2waf{font-size:15px;color:#09408e;}
编辑于 2022-06-27 14:13
< style data-emotion-css="ch8ocw"> .css-ch8ocw{position:relative;display:inline-block;height:30px;padding:0 12px;font-size:14px;line-height:30px;color:#1772F6;vertical-align:top;border-radius:100px;background:rgba(23,114,246,0.1);}.css-ch8ocw:hover{background-color:rgba(23,114,246,0.15);}
< style data-emotion-css="1xlfegr"> .css-1xlfegr{background:transparent;box-shadow:none;} < style data-emotion-css="1gomreu"> .css-1gomreu{position:relative;display:inline-block;}
亚当·兰伯特(Adam Lambert)