ue4自定义Shader教程(一)

[复制链接]
查看27633 | 回复24 | 2017-8-3 23:36:30 | 显示全部楼层 |阅读模式
我们可以在ue4材质编辑器实现各种材质效果,不过这些操作最终都是转换成Shader代码运行的。那如果我们要想在ue4中使用自己的Shader要怎么做呢?国外有一个自定义Shader教程,不过那个是用第一人称射击工程来示范的,对于学习和参考来说太复杂, 我这里给出一个简化版的,仅使用完全新建的空白项目来实现,供大家参考。只使用了一个pixel shader, 最终效果如图:
223731wgnga26a6agaa1g6.png

首先,我们这里使用到的一个shader文件,名为ShaderExample.usf,就是实现以上一个简单颜色不断变化的效果,这里大家需要先把这个文件放入引擎的Engine\Shaders文件夹下面。ShaderExample.usf文件内容:

[mw_shl_code=c,true]/*
把这些内容拷贝出来,新建一个ShaderExample.usf文件拷进去即可。或者在这里使用你自定义的shader代码。
*/

//PIXEL SHADER
//////////////

void MainVertexShader(
        float4 InPosition : ATTRIBUTE0,
        float2 InUV : ATTRIBUTE1,
        out float2 OutUV : TEXCOORD0,
        out float4 OutPosition : SV_POSITION
        )
{
        OutPosition = InPosition;
        OutUV = InUV;
}

Texture2D<uint> TextureParameter;

void MainPixelShader(
        in float2 uv : TEXCOORD0,
        out float4 OutColor : SV_Target0
        )
{
        //First we need to unpack the uint material and retrieve the underlying R8G8B8A8_UINT values.
        float sizeX, sizeY;
        TextureParameter.GetDimensions(sizeX, sizeY);
        uint packedValue = TextureParameter.Load(int3(sizeX * uv.x, sizeY * uv.y, 0));
        uint r = (packedValue & 0x000000FF);
        uint g = (packedValue & 0x0000FF00) >> 8;
        uint b = (packedValue & 0x00FF0000) >> 16;
        uint a = (packedValue & 0xFF000000) >> 24;
         
        //Here we will just blend using the TextureParameterBlendFactor between our simple color change shader and the input from the compute shader
        float alpha = length(uv) / length(float2(1, 1));
        OutColor = lerp(PSConstant.StartColor, PSVariable.EndColor, alpha) * (1.0 - PSVariable.TextureParameterBlendFactor)
                           + float4(r, g, b, a) / 255.0 * PSVariable.TextureParameterBlendFactor;
}[/mw_shl_code]

然后大家新建一个空白的蓝图项目,假设名叫ShaderDemo,然后用ue4打开项目,在编辑器里新建一个C++类,选择父类为Actor,因为待会我们要让这个类能拖入场景中。名字随便起,我这里为默认的MyActor。以上步骤编辑器会自动在项目中创建一个名为MyActor的c++类。

然后,需要创建一个自定义Shader的插件模块,而这个插件里,就是封装shader功能的一些代码。 为什么叫"插件"呢,大家可以简单理解为ue4里的插件就是一个功能模块,我们这里使用插件是为了让我们的自定义shader在项目启动之前就加载到引擎里面。

这里我已经把插件的完整文件夹打包, Plugins.rar (6.6 KB, 下载次数: 195)

评分

参与人数 2能量币 +40 收起 理由
疯子恺 + 10 很给力!
lakaw + 30 赞一个!

查看全部评分

本帖被以下淘专辑推荐:

cg_bull | 2017-8-4 00:51:37 | 显示全部楼层
材质编辑器唯一的弱点就是不支持函数了。。。受楼主指导准备写一个SSS的透射试试(滑稽)
回复 支持 反对

使用道具 举报

bueez | 2017-8-4 01:37:27 | 显示全部楼层
学习学习
回复

使用道具 举报

HOGWARTS | 2017-8-4 16:40:04 | 显示全部楼层
学习学习,感谢分享。
回复 支持 反对

使用道具 举报

cg_bull | 2017-8-4 20:03:48 | 显示全部楼层
什么时候出续集滑稽
回复 支持 反对

使用道具 举报

蜗牛 | 2017-8-6 00:46:54 | 显示全部楼层
谢谢分享!
回复

使用道具 举报

道道 | 2017-8-7 13:22:51 | 显示全部楼层
这就很叼了
回复 支持 反对

使用道具 举报

shitouge | 2017-8-7 16:35:37 | 显示全部楼层
初学,有点点不太明白,用函数做吗
回复 支持 反对

使用道具 举报

zz_nirvana | 2017-8-7 18:08:07 | 显示全部楼层
多谢分享~~~
回复

使用道具 举报

chengchunqian | 2017-8-9 08:42:43 | 显示全部楼层
THK!!!!!!!!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

11

主题

21

回帖

226

积分

初阶编码师

积分
226