• 外国人就医计划示范医院授牌 天津医院泰达医院获认定 2019-07-21
  • 文体 —频道 春城壹网 七彩云南 一网天下 2019-07-18
  • 【理上网来喜迎十九大】苏格:习近平总书记外交思想领航中国特色大国外交 2019-07-18
  • 8种家居环境很败“性” 2019-06-28
  • 2018年全军院校招生计划下达:计划招收学员3.05万名 2019-06-15
  • 晋城市举办干部素质提升工程第十八期专题讲座 2019-06-15
  • 抖音广告出现对英烈邱少云不敬内容 今日头条致歉 2019-06-13
  • 超半数巴西民众对世界杯不感兴趣--旅游频道 2019-06-12
  • 外交部举行中外媒体吹风会:王毅介绍上合组织青岛峰会情况 2019-06-12
  • 2018网络中国节·端午 2019-06-04
  • 韩媒:韩美商定暂停原定8月“乙支自由卫士”联演 2019-06-03
  • 重庆市公安局交通管理局互联网交通安全服务管理平台 2019-06-03
  • 俄侦察船穿越英吉利海峡 英国急派军舰战机监视 2019-05-28
  • 网购陷阱多 女子花3000元买5套化妆品只有2套是真的 2019-05-28
  • 环保约谈濂溪区主要负责同志 谢一平要求立行立改真抓真改 2019-05-25
  • 南粤风采36选七开奖: Unreal教程 如何将全局着色器添加到UE4

    34
    回复
    8210
    查看
    打印 上一主题 下一主题
    [ 复制链接 ]
    排名
    9776
    昨日变化

    福建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

    蛮牛译员

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

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

    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 很给力!

    查看全部评分总评分 : 鲜花 +2

    7日久生情
    4402/5000
    排名
    2320
    昨日变化

    5

    主题

    3108

    帖子

    4402

    积分

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

    UID
    209186
    好友
    5
    蛮牛币
    1166
    威望
    0
    注册时间
    2017-3-1
    在线时间
    677 小时
    最后登录
    2019-7-19
    沙发
    2017-9-29 16:04:22 只看该作者
    谢谢分享
    排名
    20607
    昨日变化

    0

    主题

    6

    帖子

    59

    积分

    Rank: 2Rank: 2

    UID
    239875
    好友
    0
    蛮牛币
    34
    威望
    0
    注册时间
    2017-8-26
    在线时间
    27 小时
    最后登录
    2019-7-15
    板凳
    2017-9-29 19:15:39 只看该作者
    666666666厉害了
    排名
    48134
    昨日变化

    0

    主题

    17

    帖子

    35

    积分

    Rank: 1

    UID
    151000
    好友
    0
    蛮牛币
    70
    威望
    0
    注册时间
    2016-6-6
    在线时间
    14 小时
    最后登录
    2019-6-11
    地板
    2017-9-30 09:53:31 只看该作者
    感谢分享
    6蛮牛粉丝
    1427/1500
    排名
    2605
    昨日变化

    7

    主题

    253

    帖子

    1427

    积分

    Rank: 6Rank: 6Rank: 6

    UID
    241851
    好友
    0
    蛮牛币
    3115
    威望
    0
    注册时间
    2017-9-6
    在线时间
    621 小时
    最后登录
    2019-7-18
    5#
    2017-9-30 13:10:24 只看该作者
    感谢分享
    5熟悉之中
    925/1000
    排名
    2502
    昨日变化

    0

    主题

    71

    帖子

    925

    积分

    Rank: 5Rank: 5

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

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

    2

    主题

    64

    帖子

    2446

    积分

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

    UID
    71116
    好友
    0
    蛮牛币
    12568
    威望
    0
    注册时间
    2015-1-26
    在线时间
    548 小时
    最后登录
    2019-7-1
    7#
    2017-10-1 10:51:03 只看该作者
    好帖留名
    7日久生情
    2880/5000
    排名
    2524
    昨日变化

    2

    主题

    1849

    帖子

    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熟悉之中
    931/1000
    排名
    3560
    昨日变化

    0

    主题

    285

    帖子

    931

    积分

    Rank: 5Rank: 5

    UID
    229748
    好友
    0
    蛮牛币
    2678
    威望
    0
    注册时间
    2017-7-1
    在线时间
    226 小时
    最后登录
    2019-5-29
    9#
    2017-10-9 09:26:07 只看该作者
    学习了 收藏了

    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熟悉之中
    925/1000
    排名
    2502
    昨日变化

    0

    主题

    71

    帖子

    925

    积分

    Rank: 5Rank: 5

    UID
    97454
    好友
    1
    蛮牛币
    3717
    威望
    0
    注册时间
    2015-5-4
    在线时间
    280 小时
    最后登录
    2019-7-5
    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
    蛮牛币
    3063
    威望
    0
    注册时间
    2015-5-14
    在线时间
    320 小时
    最后登录
    2019-7-2
    12#
    2017-10-10 17:34:58 只看该作者
    这种东西是用来做PostProcess后处理的吧,叫全局不是太贴切。暂时还不懂。这类着色器不要传递什么参数,确实用用其他插件做也可以
    排名
    26984
    昨日变化

    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日久生情
    1714/5000
    排名
    2263
    昨日变化

    0

    主题

    643

    帖子

    1714

    积分

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

    UID
    182268
    好友
    2
    蛮牛币
    758
    威望
    0
    注册时间
    2016-11-9
    在线时间
    450 小时
    最后登录
    2019-4-22
    14#
    2017-10-25 17:04:05 只看该作者
    这种东西是用来做PostProcess后处理的吧,叫全局不是太贴切。暂时还不懂。这类着色器不要传递什么参数,确实用用其他插件做也可以
    6蛮牛粉丝
    1078/1500
    排名
    2055
    昨日变化

    0

    主题

    114

    帖子

    1078

    积分

    Rank: 6Rank: 6Rank: 6

    UID
    252416
    好友
    0
    蛮牛币
    1959
    威望
    0
    注册时间
    2017-11-3
    在线时间
    294 小时
    最后登录
    2019-7-21
    15#
    2017-11-13 09:51:09 只看该作者
    66666666666666666666666666
    您需要登录后才可以回帖 登录 | 注册帐号

    本版积分规则

  • 外国人就医计划示范医院授牌 天津医院泰达医院获认定 2019-07-21
  • 文体 —频道 春城壹网 七彩云南 一网天下 2019-07-18
  • 【理上网来喜迎十九大】苏格:习近平总书记外交思想领航中国特色大国外交 2019-07-18
  • 8种家居环境很败“性” 2019-06-28
  • 2018年全军院校招生计划下达:计划招收学员3.05万名 2019-06-15
  • 晋城市举办干部素质提升工程第十八期专题讲座 2019-06-15
  • 抖音广告出现对英烈邱少云不敬内容 今日头条致歉 2019-06-13
  • 超半数巴西民众对世界杯不感兴趣--旅游频道 2019-06-12
  • 外交部举行中外媒体吹风会:王毅介绍上合组织青岛峰会情况 2019-06-12
  • 2018网络中国节·端午 2019-06-04
  • 韩媒:韩美商定暂停原定8月“乙支自由卫士”联演 2019-06-03
  • 重庆市公安局交通管理局互联网交通安全服务管理平台 2019-06-03
  • 俄侦察船穿越英吉利海峡 英国急派军舰战机监视 2019-05-28
  • 网购陷阱多 女子花3000元买5套化妆品只有2套是真的 2019-05-28
  • 环保约谈濂溪区主要负责同志 谢一平要求立行立改真抓真改 2019-05-25
  • 英超曼城队新闻 透码头视频 三肖中特100% 双色球历史上的028期 浙江快乐彩十二选伍 彩谍足球竞彩足球比分 酷喜乐彩铅油性 4场进球推荐 二肖中特请大胆下注 福利彩票走势图怎么看 3d组六打5个号多少钱 北京快中彩开奖 94期香港马会三肖中特 河北时时彩开奖号码走势图表大全 北京赛车计划网站3码