游戏蛮牛学习群(纯技术交流,不闲聊):539178957
新宝娱乐城博彩打不开 手机端
查看: 4514|回复: 26
发新帖

新宝娱乐网: [Unreal教程] 如何将全局着色器添加到UE4

[复制链接]  [移动端链接]
排名
9100
昨日变化
9

新宝娱乐城博彩打不开 www.sl6cl.com.cn 263

主题

301

帖子

1552

积分

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

UID
159865
好友
9
蛮牛币
3981
威望
0
注册时间
2016-8-1
在线时间
626 小时
最后登录
2018-3-8

蛮牛译员

跳转到指定楼层
楼主
发表于 2017-9-29 14:11:10 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
如何将全局着色器添加到UE4


在虚幻引擎4中,全局着色器是可以从C ++方面使用的渲染后处理效果,调度计算着色器,清除屏幕等的着色器(即,不对材质或网格进行操作的着色器)。 有时,需要更高级的功能来实现

所需的外观,并且需要定制着色器传递。 这样做比较简单,我将在这里解释一下。
UE4从引擎/着色器文件夹中读取.usf文件(虚幻着色器文件)。 任何新的着色器都需要将源文件放在这里。 从4.17开始,着色器也可以从插件(插件/着色器)读取。 我建议在您的ConsoleVariables.ini文件中启用r.ShaderDevelopmentMode = 1以便于开发。 查看文档了解更多信息。

我们先从您的引擎/着色器文件夹中添加一个新的.usf文件。 我们称它为MyTest.usf。 然后添加一个简单的直通顶点着色器和一个返回自定义颜色的像素着色器:

[C++] 纯文本查看 复制代码
// MyTest.usf 

// Simple pass-through vertex shader

void MainVS(
        in float4 InPosition : ATTRIBUTE0,
        out float4 Output : SV_POSITION
)
{
        Output = InPosition;
}

// Simple solid color pixel shader
float4 MyColor;
float4 MainPS() : SV_Target0
{
        return MyColor;
}



现在,为了让UE4拿起着色器并开始编译,我们需要声明一个C ++类。 我们从顶点着色器开始:



这里有一些要求:



  • 这是FGlobalShader的子类。 因此,它将最终在全球着色器地图(这意味着我们不需要材料找到它)。
  • DECLARE_EXPORTED_SHADER_TYPE()宏的使用将生成着色器类型的序列化所需的导出等。第三个参数是一个外部链接的类型,用于代码??榈耐獠苛唇?,如果需要,着色器??榻妫ɡ?/font>C ++代码, t住在渲染器??橹校?。
  • 两个构造函数,默认和序列化。
  • 需要决定是否在特定情况下编译这个着色器的ShouldCache()函数(例如,我们可能不希望在具有非计算着色器的RHI上编译计算着色器)。



随着类声明,我们现在可以将着色器类型注册到UE4的列表中:

[C++] 纯文本查看 复制代码
// This needs to go on a cpp file
IMPLEMENT_SHADER_TYPE(, FMyTestVS, TEXT("MyTest"), TEXT("MainVS"), SF_Vertex);



该宏将类型(FMyTestVS)映射到.usf文件(MyTest.usf),着色器入口点(MainVS)和频率/着色器阶段(SF_Vertex)。 只要它的ShouldCache()方法返回true,它也会使着色器被添加到编译列表中。

注意:无论您将FGlobalShader添加到实际引擎启动前必须加载的???,或者您将得到一个assert,如“引擎初始化之后加载着色器类型,在??樯鲜褂肊LoadingPhase :: PostConfigInit以使其早期加载 “我们目前不允许在游戏或编辑器启动后加载自己的着色器类型的动态???。



现在我们来宣布更有趣的Pixel Shader:

[C++] 纯文本查看 复制代码
class FMyTestPS : public FGlobalShader
{
        DECLARE_EXPORTED_SHADER_TYPE(FMyTestPS, Global, /*MYMODULE_API*/);
 
        FShaderParameter MyColorParameter;
 
        FMyTestPS() { }
        FMyTestPS(const ShaderMetaType::CompiledShaderInitializerType& Initializer)
                : FGlobalShader(Initializer)
        {
                MyColorParameter.Bind(Initializer.ParameterMap, TEXT("MyColor"), SPF_Mandatory);
        }
 
        static void ModifyCompilationEnvironment(EShaderPlatform Platform, FShaderCompilerEnvironment& OutEnvironment)
        {
                FGlobalShader::ModifyCompilationEnvironment(Platform, OutEnvironment);
                // Add your own defines for the shader code
                OutEnvironment.SetDefine(TEXT("MY_DEFINE"), 1);
        }
 
        static bool ShouldCache(EShaderPlatform Platform)
        {
                // Could skip compiling for Platform == SP_METAL for example
                return true;
        }
 
        // FShader interface.
        virtual bool Serialize(FArchive& Ar) override
        {
                bool bShaderHasOutdatedParameters = FGlobalShader::Serialize(Ar);
                Ar << MyColorParameter;
                return bShaderHasOutdatedParameters;
        }
 
        void SetColor(FRHICommandList& RHICmdList, const FLinearColor& Color)
        {
                SetShaderValue(RHICmdList, GetPixelShader(), MyColorParameter, Color);
        }
};

// Same source file as before, different entry point
IMPLEMENT_SHADER_TYPE(, FMyTestPS, TEXT("MyTest"), TEXT("MainPS"), SF_Pixel);



在这个类中,我们现在正在从.usf文件中显示着色器参数MyColor:


  • FShaderParameter MyColorParameter成员被添加到类中,该类将保存运行时的信息,以便能够找到绑定,允许在运行时设置参数的值。
  • 在序列化构造函数中,我们通过名称将参数绑定到ParameterMap,这必须匹配.usf文件的名称。
  • 当相同的C ++类定义不同的行为并且能够在着色器中设置#define值时,将使用新的ModifyCompilationEnvironment()函数。
  • Serialize()方法是必需的。 这是从着色器的绑定(在序列化构造函数中匹配)的编译/烹饪时间信息在运行时被加载和存储的地方。
  • 最后,我们有一个自定义的SetColor()方法,它显示了如何在运行时使用指定的值设置MyColor参数。




现在,我们用一个简单的函数来绘制一个使用这些着色器类型的全屏四边形:

[C++] 纯文本查看 复制代码
void RenderMyTest(FRHICommandList& RHICmdList, ERHIFeatureLevel::Type FeatureLevel, const FLinearColor& Color)
{
        // Get the collection of Global Shaders
        auto ShaderMap = GetGlobalShaderMap(FeatureLevel);

        // Get the actual shader instances off the ShaderMap
        TShaderMapRef MyVS(ShaderMap);
        TShaderMapRef MyPS(ShaderMap);

        // Declare a bound shader state using those shaders and apply it to the command list
        static FGlobalBoundShaderState MyTestBoundShaderState;
        SetGlobalBoundShaderState(RHICmdList, FeatureLevel, MyTestBoundShaderState, GetVertexDeclarationFVector4(), *MyVS, *MyPS);

        // Call our function to set up parameters
        MyPS->SetColor(RHICmdList, Color);
 
        // Setup the GPU in prep for drawing a solid quad
        RHICmdList.SetRasterizerState(TStaticRasterizerState::GetRHI());
        RHICmdList.SetBlendState(TStaticBlendState<>::GetRHI());
        RHICmdList.SetDepthStencilState(TStaticDepthStencilState::GetRHI(), 0);
 
        // Setup the vertices
        FVector4 Vertices[4];
        Vertices[0].Set(-1.0f, 1.0f, 0, 1.0f);
        Vertices[1].Set(1.0f, 1.0f, 0, 1.0f);
        Vertices[2].Set(-1.0f, -1.0f, 0, 1.0f);
        Vertices[3].Set(1.0f, -1.0f, 0, 1.0f);

        // Draw the quad
        DrawPrimitiveUP(RHICmdList, PT_TriangleStrip, 2, Vertices, sizeof(Vertices[0]));
}



如果你想在你的代码库中测试这个,你可以尝试声明一个控制台变量,这样它就可以像运行时那样切换:

[C++] 纯文本查看 复制代码
static TAutoConsoleVariable CVarMyTest(
        TEXT("r.MyTest"),
        0,
        TEXT("Test My Global Shader, set it to 0 to disable, or to 1, 2 or 3 for fun!"),
        ECVF_RenderThreadSafe
);
 
void FDeferredShadingSceneRenderer::RenderFinish(FRHICommandListImmediate& RHICmdList)
{
        [...]
        // ***
        // Inserted code, just before finishing rendering, so we can overwrite the screen’s contents!
        int32 MyTestValue = CVarMyTest.GetValueOnAnyThread();
        if (MyTestValue != 0)
        {
                FLinearColor Color(MyTestValue == 1, MyTestValue == 2, MyTestValue == 3, 1);
                RenderMyTest(RHICmdList, FeatureLevel, Color);
        }
        // End Inserted code
        // ***
        FSceneRenderer::RenderFinish(RHICmdList);
        [...]
}



在这一点上,您应该可以测试我们的新的全球着色器! 运行您的项目,然后使用波浪号(?)拉起控制台并输入r.MyTest 1.然后键入r.MyTest 2和/或r.MyTest 3来更改颜色。 使用r.MyTest 0禁用通行证。


调试生成的源代码
看看博客文章调试着色器编译过程,如果你想能够调试.usf文件的编译和/或看到处理的文件。


总结
您可以在一个未用的游戏/编辑器运行时修改.usf文件,然后按Ctrl + Shift +。 (期间)或类型重编译器在控制台中更改,以拾取并重建您的着色器以进行快速迭代!






原文标题:How to Add Global Shaders to UE4


评分

参与人数 1鲜花 +2 收起 理由
北京烤鸭 + 2 很给力!

查看全部评分


7日久生情
4180/5000
排名
2754
昨日变化
5

5

主题

3111

帖子

4180

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
209186
好友
5
蛮牛币
5194
威望
0
注册时间
2017-3-1
在线时间
586 小时
最后登录
2018-7-19
沙发
发表于 2017-9-29 16:04:22 | 只看该作者
谢谢分享

排名
19842
昨日变化
13

0

主题

6

帖子

48

积分

Rank: 1

UID
239875
好友
0
蛮牛币
22
威望
0
注册时间
2017-8-26
在线时间
18 小时
最后登录
2017-12-14
板凳
发表于 2017-9-29 19:15:39 | 只看该作者
666666666厉害了

排名
44828
昨日变化
47

0

主题

16

帖子

32

积分

Rank: 1

UID
151000
好友
0
蛮牛币
68
威望
0
注册时间
2016-6-6
在线时间
12 小时
最后登录
2018-6-2
地板
发表于 2017-9-30 09:53:31 | 只看该作者
感谢分享

6蛮牛粉丝
1063/1500
排名
3131
昨日变化
3

7

主题

196

帖子

1063

积分

Rank: 6Rank: 6Rank: 6

UID
241851
好友
0
蛮牛币
3818
威望
0
注册时间
2017-9-6
在线时间
443 小时
最后登录
2018-7-27
5#
发表于 2017-9-30 13:10:24 | 只看该作者
感谢分享

5熟悉之中
913/1000
排名
2260
昨日变化
12

0

主题

71

帖子

913

积分

Rank: 5Rank: 5

UID
97454
好友
1
蛮牛币
3619
威望
0
注册时间
2015-5-4
在线时间
276 小时
最后登录
2018-7-26
6#
发表于 2017-9-30 15:05:05 | 只看该作者
在虚幻引擎4中,全局着色器是可以从C ++方面使用的渲染后处理效果,调度计算着色器,清除屏幕等的着色器(即,不对材质或网格进行操作的着色器)。 有时,需要更高级的功能来实现

所需的外观,并且需要定制着色器传递。 这样做比较简单,我将在这里解释一下。
UE4从引擎/着色器文件夹中读取.usf文件(虚幻着色器文件)。 任何新的着色器都需要将源文件放在这里。 从4.17开始,着色器也可以从插件(插件/着色器)读取。 我建议在您的ConsoleVariables.ini文件中启用r.ShaderDevelopmentMode = 1以便于开发。 查看文档了解更多信息。

7日久生情
2431/5000
排名
263
昨日变化

2

主题

63

帖子

2431

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
71116
好友
0
蛮牛币
12545
威望
0
注册时间
2015-1-26
在线时间
542 小时
最后登录
2018-5-13
7#
发表于 2017-10-1 10:51:03 | 只看该作者
好帖留名

7日久生情
2535/5000
排名
3464
昨日变化
6

2

主题

1780

帖子

2535

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
241666
好友
0
蛮牛币
10199
威望
0
注册时间
2017-9-6
在线时间
362 小时
最后登录
2018-6-7
8#
发表于 2017-10-6 06:36:15 来自Mobile--- | 只看该作者
感谢分享

5熟悉之中
836/1000
排名
3626
昨日变化
3

0

主题

265

帖子

836

积分

Rank: 5Rank: 5

UID
229748
好友
0
蛮牛币
2493
威望
0
注册时间
2017-7-1
在线时间
199 小时
最后登录
2018-7-28
9#
发表于 2017-10-9 09:26:07 | 只看该作者
学习了 收藏了
[发帖际遇]: 苏洛 乐于助人,奖励 3 蛮牛币. 幸运榜 / 衰神榜

0

主题

5

帖子

5

积分

Rank: 1

UID
247608
好友
0
蛮牛币
6
威望
0
注册时间
2017-10-9
在线时间
3 小时
最后登录
2017-10-17
10#
发表于 2017-10-9 13:10:22 | 只看该作者
666666666666

5熟悉之中
913/1000
排名
2260
昨日变化
12

0

主题

71

帖子

913

积分

Rank: 5Rank: 5

UID
97454
好友
1
蛮牛币
3619
威望
0
注册时间
2015-5-4
在线时间
276 小时
最后登录
2018-7-26
11#
发表于 2017-10-10 10:07:06 | 只看该作者

如何将全局着色器添加到UE4


在虚幻引擎4中,全局着色器是可以从C ++方面使用的渲染后处理效果,调度计算着色器,清除屏幕等的着色器(即,不对材质或网格进行操作的着色器)。 有时,需要更高级的功能来实现

所需的外观,并且需要定制着色器传递。 这样做比较简单,我将在这里解释一下。
UE4从引擎/着色器文件夹中读取.usf文件(虚幻着色器文件)。 任何新的着色器都需要将源文件放在这里。 从4.17开始,着色器也可以从插件(插件/着色器)读取。 我建议在您的ConsoleVariables.ini文件中启用r.ShaderDevelopmentMode = 1以便于开发。 查看文档了解更多信息

6蛮牛粉丝
1303/1500
排名
1135
昨日变化
2

1

主题

48

帖子

1303

积分

Rank: 6Rank: 6Rank: 6

UID
100193
好友
1
蛮牛币
3060
威望
0
注册时间
2015-5-14
在线时间
320 小时
最后登录
2018-1-11
12#
发表于 2017-10-10 17:34:58 | 只看该作者
这种东西是用来做PostProcess后处理的吧,叫全局不是太贴切。暂时还不懂。这类着色器不要传递什么参数,确实用用其他插件做也可以

排名
25138
昨日变化
22

0

主题

16

帖子

53

积分

Rank: 2Rank: 2

UID
224027
好友
0
蛮牛币
29
威望
0
注册时间
2017-5-27
在线时间
24 小时
最后登录
2018-4-4
13#
发表于 2017-10-11 15:39:35 | 只看该作者
感谢分享

6蛮牛粉丝
1263/1500
排名
3178
昨日变化
33

0

主题

518

帖子

1263

积分

Rank: 6Rank: 6Rank: 6

UID
182268
好友
2
蛮牛币
586
威望
0
注册时间
2016-11-9
在线时间
325 小时
最后登录
2018-7-27
14#
发表于 2017-10-25 17:04:05 | 只看该作者
这种东西是用来做PostProcess后处理的吧,叫全局不是太贴切。暂时还不懂。这类着色器不要传递什么参数,确实用用其他插件做也可以
[发帖际遇]: 15910553283 乐于助人,奖励 1 蛮牛币. 幸运榜 / 衰神榜

5熟悉之中
558/1000
排名
4207
昨日变化
47

0

主题

107

帖子

558

积分

Rank: 5Rank: 5

UID
252416
好友
0
蛮牛币
647
威望
0
注册时间
2017-11-3
在线时间
135 小时
最后登录
2018-7-28
15#
发表于 2017-11-13 09:51:09 | 只看该作者
66666666666666666666666666

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

快速回复 新宝娱乐城博彩打不开 返回列表
  • 李思思元元月亮姐姐 盘点央视主持人与子女温馨合影 2018-12-11
  • “忻州工匠”“忻州技能标兵”评选活动启动 2018-12-11
  • 包住内力,在不断变化中寻找契机,可出击可借力亦可卸力。 2018-12-10
  • 广州中考首用计算机辅助命题 满满的广州元素 2018-12-09
  • 植树、采茶、挖野菜…… 这才是春天正确的打开方式 2018-12-08
  • 【纯黑】《生化危机7》克里斯DLC不是英雄 2018-12-08
  • 150块地铁灯牌高调“炫父” 温暖南京城 2018-12-07
  • 【光明网专论】鞠立新:习近平新时代中国特色社会主义经济思想的内涵、逻辑和特质 2018-12-06
  • 江西“放管服”改革再出实招 2018-12-05
  • 首列商用磁浮2.0版列车下线 适用中心城市到卫星城间交通--旅游频道 2018-12-05
  • 空警-500改进型新照曝光,监控效率成倍提升 2018-12-04
  • 对美敲诈老手不能软越软越诈你要打就来 2018-12-04
  • 赵旭日:对阵恒大很有缘 比赛要一场一场去踢 2018-12-03
  • 《数码宝贝故事》第三阶段首发初回特典公布--人民网游戏 2018-12-03
  • 端午小长假自驾游归来 车辆保养完整攻略 2018-12-02
  • 275| 817| 565| 892| 446| 338| 14| 202| 656| 797|