我们可以在ue4材质编辑器实现各种材质效果,不过这些操作最终都是转换成Shader代码运行的。那如果我们要想在ue4中使用自己的Shader要怎么做呢?国外有一个自定义Shader教程,不过那个是用第一人称射击工程来示范的,对于学习和参考来说太复杂, 我这里给出一个简化版的,仅使用完全新建的空白项目来实现,供大家参考。只使用了一个pixel shader, 最终效果如图:
首先,我们这里使用到的一个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, 下载次数: 202)
|
评分
-
查看全部评分
|