• 机器人占领就业市场后:人类还能从事这些工作 2019-03-04
  • 以网络文化建设推进文化惠民 2019-03-03
  • 贸易战,只能是双输。我们是众志成城,美国却不一定。 2019-02-26
  • 辣评2016年9月最HOT 轿车获奖榜单 2019-02-22
  • 交通运输部路网中心:端午假期高速通行不免费 2019-02-18
  • 《陕西省县域经济社会发展监测考评办法》解读 2019-02-18
  • 西部网(陕西新闻网)www.cnwest.com 2019-02-13
  • 短途一日游 游客量猛增 小长假新疆接待游客353.6万人次 2019-02-13
  • 南昌重拳整治酒驾毒驾 2019-02-08
  • 女性之声——全国妇联 2019-02-08
  • 信息网络传播视听节目许可证 2019-02-03
  • 打开书籍,了解文物背后的中国温度 2019-02-03
  • 中央环保督察组:石家庄市无极县“敷衍整改” 2019-02-02
  • China Focus Dragon Boat Festival celebrated across China - Culture News - CQNEWS 2019-02-02
  • 铁路迎端午客流最高峰 今日预计发送旅客1318万人次 2019-01-28
  • 【游戏技术群】959392658  【游戏出海群】12067810
    福建36选7和值走势图 手机端
    查看: 7117|回复: 34
    发新帖

    福建体彩3选7走势图: [Unreal教程] 如何将全局着色器添加到UE4

    [复制链接]  [移动端链接]
    排名
    9767
    昨日变化
    2

    福建36选7和值走势图 www.00-na.com 263

    主题

    301

    帖子

    1602

    积分

    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日久生情
    4376/5000
    排名
    2317
    昨日变化
    4

    5

    主题

    3109

    帖子

    4376

    积分

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

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

    排名
    20597
    昨日变化
    13

    0

    主题

    6

    帖子

    55

    积分

    Rank: 2Rank: 2

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

    排名
    48115
    昨日变化
    20

    0

    主题

    16

    帖子

    32

    积分

    Rank: 1

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

    6蛮牛粉丝
    1419/1500
    排名
    2603
    昨日变化

    7

    主题

    253

    帖子

    1419

    积分

    Rank: 6Rank: 6Rank: 6

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

    5熟悉之中
    924/1000
    排名
    2499
    昨日变化

    0

    主题

    71

    帖子

    924

    积分

    Rank: 5Rank: 5

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

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

    7日久生情
    2441/5000
    排名
    323
    昨日变化

    2

    主题

    63

    帖子

    2441

    积分

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

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

    7日久生情
    2880/5000
    排名
    2523
    昨日变化
    1

    2

    主题

    1851

    帖子

    2880

    积分

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

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

    5熟悉之中
    923/1000
    排名
    3560
    昨日变化
    3

    0

    主题

    283

    帖子

    923

    积分

    Rank: 5Rank: 5

    UID
    229748
    好友
    0
    蛮牛币
    2654
    威望
    0
    注册时间
    2017-7-1
    在线时间
    220 小时
    最后登录
    2019-1-10
    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熟悉之中
    924/1000
    排名
    2499
    昨日变化

    0

    主题

    71

    帖子

    924

    积分

    Rank: 5Rank: 5

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

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


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

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

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

    1

    主题

    48

    帖子

    1303

    积分

    Rank: 6Rank: 6Rank: 6

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

    排名
    26972
    昨日变化
    9

    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 | 只看该作者
    感谢分享

    7日久生情
    1707/5000
    排名
    2259
    昨日变化
    1

    0

    主题

    639

    帖子

    1707

    积分

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

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

    6蛮牛粉丝
    1017/1500
    排名
    2065
    昨日变化
    8

    0

    主题

    113

    帖子

    1017

    积分

    Rank: 6Rank: 6Rank: 6

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

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

    本版积分规则

    快速回复 福建36选7和值走势图 返回列表
  • 机器人占领就业市场后:人类还能从事这些工作 2019-03-04
  • 以网络文化建设推进文化惠民 2019-03-03
  • 贸易战,只能是双输。我们是众志成城,美国却不一定。 2019-02-26
  • 辣评2016年9月最HOT 轿车获奖榜单 2019-02-22
  • 交通运输部路网中心:端午假期高速通行不免费 2019-02-18
  • 《陕西省县域经济社会发展监测考评办法》解读 2019-02-18
  • 西部网(陕西新闻网)www.cnwest.com 2019-02-13
  • 短途一日游 游客量猛增 小长假新疆接待游客353.6万人次 2019-02-13
  • 南昌重拳整治酒驾毒驾 2019-02-08
  • 女性之声——全国妇联 2019-02-08
  • 信息网络传播视听节目许可证 2019-02-03
  • 打开书籍,了解文物背后的中国温度 2019-02-03
  • 中央环保督察组:石家庄市无极县“敷衍整改” 2019-02-02
  • China Focus Dragon Boat Festival celebrated across China - Culture News - CQNEWS 2019-02-02
  • 铁路迎端午客流最高峰 今日预计发送旅客1318万人次 2019-01-28