|
发表于 2022-12-28 14:29:32
|
显示全部楼层
话说前头
之前写了一篇讲的是怎么添加GlobalShader,但是只是说了如果绘制纯色。这对于我们来说明显不够,所以增加一篇来将如何将纹理绘制出来。还是老样子,本篇文章的代码基于UE4.27.2版本来写的,所以只保证在此版本上不会出错。
Shader
首先就是要修改我们的Shader文件,加上用于采样的纹理,以及在VS中传递UV给PS用于纹理采样,最后将纹理的颜色再乘上一个颜色就完成了
#include "/Engine/Public/Platform.ush"
float4 SimpleColor;
Texture2D Texture1;
SamplerState TextureSample1;
void MainVS(
in float4 InPosition : ATTRIBUTE0,
in float2 InTexCoord : ATTRIBUTE1,
out float2 OutTexCoord : TEXCOORD0,
out float4 OutPosition : SV_POSITION
)
{
// screenspace position from vb
OutPosition = InPosition;
OutTexCoord = InTexCoord;
}
void MainPS(
in float2 InUV : TEXCOORD0,
out float4 OutColor : SV_Target0
)
{
OutColor = Texture1.SampleLevel(TextureSample1, InUV.xy, 0.0) * SimpleColor;
OutColor.a = 1;
}传递Texture以及SamplerState
首先将上一篇的MyShaderPS修改成下方这种形式,可以看到里面定义了SampleColor以及Texture1和TextureSample1的参数用于向Shader中传递数据。
class FMyShaderPS : public FGlobalShader
{
//DECLARE_SHADER_TYPE(FMyShaderPS, Global);
public:
DECLARE_GLOBAL_SHADER(FMyShaderPS);
SHADER_USE_PARAMETER_STRUCT_WITH_LEGACY_BASE(FMyShaderPS, FGlobalShader);
BEGIN_SHADER_PARAMETER_STRUCT(FParameters, )
SHADER_PARAMETER(FVector4, SimpleColor)
SHADER_PARAMETER_TEXTURE(Texture2D, Texture1)
SHADER_PARAMETER_SAMPLER(SamplerState, TextureSample1)
END_SHADER_PARAMETER_STRUCT()
};传递UVs
在VS中添加了InTexCoord这个数据,所以我们需要在CPU端往GPU中传递这个数据。
struct FTextureVertex
{
public:
FVector4 Position;
FVector2D UV;
}; 首先在上一篇的基础上添加一个FVector2D UV来保存我们的UV数据。有了这个数据以后,我们还需要告诉CPU我们定义的数据的内存布局
FVertexDeclarationElementList Elements;
const auto Stride = sizeof(FTextureVertex);
Elements.Add(FVertexElement(0, STRUCT_OFFSET(FTextureVertex, Position), VET_Float4, 0, Stride));
Elements.Add(FVertexElement(0, STRUCT_OFFSET(FTextureVertex, UV), VET_Float2, 1, Stride));
FVertexDeclarationRHIRef VertexDeclarationRHI = RHICreateVertexDeclaration(Elements);设置ShaderParameter
由于我们修改MyShaderPs的写法,所以在设置参数的时候也要换种写法。
PsParameter.SimpleColor = Color;
PsParameter.TextureSample1 = TStaticSamplerState<SF_Bilinear, AM_Clamp, AM_Clamp, AM_Clamp>::GetRHI();
PsParameter.Texture1 = Tex->GetResource()->GetTexture2DRHI();
SetShaderParameters(RHICmdList,PixelShader,PixelShader.GetPixelShader(),PsParameter);最终结果
 |
|