• 室内小场景
  • 发布:UE4资源管理软
  • 请问这么清晰的一个投
    • 引擎世界丨EngineWorld.CN
    • 引擎世界丨EngineWorld.CN
    • 引擎世界丨EngineWorld.CN
    • 引擎世界丨EngineWorld.CN
    • 引擎世界丨EngineWorld.CN
    • 引擎世界丨EngineWorld.CN

ue4自定义Shader教程(一)

23
回复
14403
查看
[复制链接]

11

主题

32

帖子

224

积分

初阶编码师

Rank: 1

积分
224
发表于 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, 下载次数: 150)
参与人数 2引擎币 +40 收起 理由
疯子恺 + 10 很给力!
lakaw + 30 赞一个!

查看全部评分总评分 : 引擎币 +40

33

主题

298

帖子

2606

积分

中阶编码师

Rank: 2

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

使用道具 举报

0

主题

61

帖子

20

积分

初阶编码师

Rank: 1

积分
20
发表于 2017-8-4 01:37:27 | 显示全部楼层
学习学习
回复

使用道具 举报

6

主题

313

帖子

160

积分

初阶编码师

Rank: 1

积分
160
发表于 2017-8-4 16:40:04 | 显示全部楼层
学习学习,感谢分享。
回复

使用道具 举报

33

主题

298

帖子

2606

积分

中阶编码师

Rank: 2

积分
2606
发表于 2017-8-4 20:03:48 | 显示全部楼层
什么时候出续集滑稽
回复

使用道具 举报

0

主题

129

帖子

23

积分

初阶编码师

Rank: 1

积分
23
发表于 2017-8-6 00:46:54 | 显示全部楼层
谢谢分享!
回复

使用道具 举报

5

主题

127

帖子

619

积分

中阶编码师

帅气的

Rank: 2

积分
619

创阶使勋章无常勋章架构师勋章高阶编码勋章初阶编码勋章

发表于 2017-8-7 13:22:51 | 显示全部楼层
这就很叼了
回复

使用道具 举报

0

主题

23

帖子

52

积分

初阶编码师

Rank: 1

积分
52
发表于 2017-8-7 16:35:37 | 显示全部楼层
初学,有点点不太明白,用函数做吗
回复

使用道具 举报

69

主题

1816

帖子

3693

积分

中阶编码师

Rank: 2

积分
3693
发表于 2017-8-7 18:08:07 | 显示全部楼层
多谢分享~~~
回复

使用道具 举报

0

主题

708

帖子

2987

积分

中阶编码师

Rank: 2

积分
2987
发表于 2017-8-9 08:42:43 | 显示全部楼层
THK!!!!!!!!!
回复

使用道具 举报

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

本版积分规则

用艺术创造世界
专业的开发者社区,汇聚众多创作人 提供作品展示
项目交流 工作机会等行业服务
社区邮箱:engineworld@qq.com

扫一扫捐助我们

Powered by 引擎世界中文社区™®© Engine World Inc.( 陕ICP备20012463号 )