UE4虚幻引擎增加GlobalShader——绘制纹理

3

主题

9

帖子

14

积分

新手上路

Rank: 1

积分
14
发表于 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);最终结果


回复

举报 使用道具

您需要登录后才可以回帖 登录 | 立即注册
快速回复 返回顶部 返回列表