【目标】

MaterialLOD QualitySwitch

【思路】

1 QualitySwitch

UE4有三挡

UE3


2 现在UE3需要添加三挡

3

UE3

class UMaterialExpressionQualitySwitch : public UMaterialExpression
{
public:
    //## BEGIN PROPS MaterialExpressionQualitySwitch
    FExpressionInput High;
    FExpressionInput Low;

4

【步骤】

1 修改UMaterialExpressionQualitySwitch 

\ue3\Development\Src\Engine\Classes\MaterialExpressionQualitySwitch.uc

var ExpressionInput High;
var ExpressionInput Mid;
var ExpressionInput Low;

2 修改EMaterialShaderQuality 添加中级

enum EMaterialShaderQuality
{
    MSQ_HIGH                =0,
    MSQ_MID                    =1,
    MSQ_LOW                 =2,
    MSQ_MAX                 =3,
    // Terrain only supports high quality
    MSQ_TERRAIN                =MSQ_HIGH,
    // Use an invalid value for default value to functions when not specifying a quality
    MSQ_UNSPECIFIED            =MSQ_MAX,
};

3 修改\ue3\Development\Src\Engine\Classes\Material.uc

var const native duplicatetransient pointer MaterialResources[3]{FMaterialResource};

修改UMaterial.MaterialResources 相关的

4 UMaterial.Serialize中有序列化的东西

还是要添加个版本号

EUnrealEngineObjectVersion

    // - Add MaterialShaderQuality Mid
    VER_UNIFORM_EXPRESSIONS_IN_SHADER_CACHE                = 872,

UMaterial.Serialize

            if (
                QualityIndex < 2 ||                    // MaterialResources's old size is 2
                (QualityIndex >=2 && Ar.Ver() >= VER_ADD_EXPRESSIONS_SHADERQUALITY_MID) 
                ) 
            {
                // Serialize the material resource.
                MaterialResources[QualityIndex]->Serialize(Ar);
                if (Ar.Ver() < VER_UNIFORM_EXPRESSIONS_IN_SHADER_CACHE)
                {
                    // If we are loading a material resource saved before texture references were managed by the material resource,
                    // Pass the legacy texture references to the material resource.
                    MaterialResources[QualityIndex]->AddLegacyTextures(ReferencedTextures_DEPRECATED);
                    // Empty legacy texture references on load
                    ReferencedTextures_DEPRECATED.Empty();
                }            
            }

4 修改MSQ_MAX  相关的

UMaterialInstance.StaticPermutationResources

UMaterialInstance.StaticParameters

\ue3\Development\Src\Engine\Classes\MaterialInstance.uc 改成3个

/**
* The set of static parameters that this instance will be compiled with.
* This is indexed by EMaterialShaderPlatform.
* Only the first entry is ever used now that SM2 is no longer supported,
* But the member is kept as an array to make adding future material platforms easier.
* The second entry is to work around the script compile error from having an array with one element.
*/
var const native duplicatetransient pointer StaticParameters[3]{FStaticParameterSet};
/**
* The material resources for this instance.
* This is indexed by EMaterialShaderPlatform.
* Only the first entry is ever used now that SM2 is no longer supported,
* But the member is kept as an array to make adding future material platforms easier.
* The second entry is to work around the script compile error from having an array with one element.
*/
var const native duplicatetransient pointer StaticPermutationResources[3]{FMaterialResource};

上面直接改uc数组大小的方式 貌似会有问题,序列化会出问题

make报错

手动改h文件 编译exe 再修改uc,make

5 修改FSystemSettings.bAllowHighQualityMaterials 相关

添加一个新的成员

    /** Materials Quality Level    */
    INT        QualityMaterialsLevel;

     /** Materials Quality Level    */
    { SST_INT, SSI_SCALABILITY, TEXT( "QualityMaterialsLevel" ), &GSystemSettings.QualityMaterialsLevel, &VSSMaterilQuality, TEXT( "Materials Quality Level." ) },

FSystemSettings.ApplySettings

    // Reattach components if world-detail settings have changed.
    if( OldSystemSettings.DetailMode != DetailMode || 
        OldSystemSettings.bAllowHighQualityMaterials != bAllowHighQualityMaterials ||
        OldSystemSettings.QualityMaterialsLevel != QualityMaterialsLevel)
    {

在BaseSystemSettings.ini配置

QualityMaterialsLevel=0

ExampleSystemSettings.ini同理

6 UMaterialInterface.GetDesiredQualityLevel 

        Quality = GSystemSettings.bAllowHighQualityMaterials ? MSQ_HIGH : MSQ_LOW;

改为

         Quality = EMaterialShaderQuality(GSystemSettings.QualityMaterialsLevel);

FMaterial.CacheShaders

    if (Quality == MSQ_UNSPECIFIED)
    {
        Quality = GSystemSettings.bAllowHighQualityMaterials ? MSQ_HIGH : MSQ_LOW;
    }

改为

     if (Quality == MSQ_UNSPECIFIED)
    {
        Quality = EMaterialShaderQuality(GSystemSettings.QualityMaterialsLevel);
    }

7 修改Material切换按钮响应

void WxEditorFrame::MenuMaterialQualityToggle( wxCommandEvent& In )
{
    // to be safe, we wait until rendering thread is complete
    FlushRenderingCommands();
    // toggle the system setting, mimicing what the console command does - it would be nice
    // if system settings had a function interface instead of console commands
//    GSystemSettings.bAllowHighQualityMaterials ^= 1;
    
    GSystemSettings.QualityMaterialsLevel ++;
    if (GSystemSettings.QualityMaterialsLevel >= EMaterialShaderQuality::MSQ_MAX)
        GSystemSettings.QualityMaterialsLevel = EMaterialShaderQuality::MSQ_HIGH;


8 显示出Quality值到编辑器

WxMaterialEditorBase.DrawMaterialInfoStrings.

        FLinkedObjDrawUtils::DrawShadowedString(
            Canvas,
            5,
            DrawPositionY,
            *FString::Printf(TEXT("Quality[%d] DrawCall: %d Instructions: %d DrawTime:%.6f ms"),
            GSystemSettings.QualityMaterialsLevel,
            PreviewMeshComponent->LastDrawCalls,PreviewMeshComponent->GetUsedMaterialsInstructionCounts(),PreviewMeshComponent->LastDrawTimes),
            FontToUse,
            FLinearColor(0.8,1,1)
            );

9

scale set QualityMaterialsLevel 0-2

【运行】

"/cgi-bin/micromsg-bin/auth";
"/cgi-bin/micromsg-bin/sendmsg";
"/cgi-bin/micromsg-bin/sync";
"/cgi-bin/micromsg-bin/uploadmsgimg";
"/cgi-bin/micromsg-bin/getmsgimg";
"/cgi-bin/micromsg-bin/init";
"/cgi-bin/micromsg-bin/getupdatepack";
"/cgi-bin/micromsg-bin/searchfriend";
"/cgi-bin/micromsg-bin/getinvitefriend";


3


16101301(MaterialLOD QualitySwitch)的更多相关文章

  1. git-简单流程(学习笔记)

    这是阅读廖雪峰的官方网站的笔记,用于自己以后回看 1.进入项目文件夹 初始化一个Git仓库,使用git init命令. 添加文件到Git仓库,分两步: 第一步,使用命令git add <file ...

  2. 读书笔记:JavaScript DOM 编程艺术(第二版)

    读完还是能学到很多的基础知识,这里记录下,方便回顾与及时查阅. 内容也有自己的一些补充. JavaScript DOM 编程艺术(第二版) 1.JavaScript简史 JavaScript由Nets ...

  3. Recurrent Neural Network系列1--RNN(循环神经网络)概述

    作者:zhbzz2007 出处:http://www.cnblogs.com/zhbzz2007 欢迎转载,也请保留这段声明.谢谢! 本文翻译自 RECURRENT NEURAL NETWORKS T ...

  4. 谈谈一些有趣的CSS题目(十二)-- 你该知道的字体 font-family

    开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...

  5. RxJS + Redux + React = Amazing!(译一)

    今天,我将Youtube上的<RxJS + Redux + React = Amazing!>翻译(+机译)了下来,以供国内的同学学习,英文听力好的同学可以直接看原版视频: https:/ ...

  6. ASP.NET Core 中文文档 第四章 MVC(3.8)视图中的依赖注入

    原文:Dependency injection into views 作者:Steve Smith 翻译:姚阿勇(Dr.Yao) 校对:孟帅洋(书缘) ASP.NET Core 支持在视图中使用 依赖 ...

  7. 从0开始搭建SQL Server AlwaysOn 第三篇(配置AlwaysOn)

    从0开始搭建SQL Server AlwaysOn 第三篇(配置AlwaysOn) 第一篇http://www.cnblogs.com/lyhabc/p/4678330.html第二篇http://w ...

  8. 恢复SQL Server被误删除的数据(再扩展)

    恢复SQL Server被误删除的数据(再扩展) 大家对本人之前的文章<恢复SQL Server被误删除的数据> 反应非常热烈,但是文章里的存储过程不能实现对备份出来的日志备份里所删数据的 ...

  9. 浅谈WEB页面提速(前端向)

    记得面试现在这份工作的时候,一位领导语重心长地谈道——当今的世界是互联网的世界,IT企业之间的竞争是很激烈的,如果一个网页的加载和显示速度,相比别人的站点页面有那么0.1秒的提升,那也是很大的一个成就 ...

随机推荐

  1. python之RabbitMQ

    一.安装RabbitMQ 1. 安装erlang 1 2 3 4 tar xf otp_src_18.3.tar.gz cd otp_src_18.3 ./configure --prefix=/ma ...

  2. sql中文日期格式转换(xxxx年x月x日)

    ) set @dd='2014年10月1日' select replace(replace( replace(@dd,'日',''),'月','-'),'年','-') 别人的方法 )='2012年1 ...

  3. js 操作数组封装

    function OperateArray(array) { this.array = array; } OperateArray.prototype.hasValue = function(val) ...

  4. js date 火狐不兼容 解决办法 火狐版本25,0

    <!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="UTF-8& ...

  5. 对json数据的遍历

    json格式变化多样,可嵌套好几层,这里只记录了一些遍历方法,具体数据格式具体分析~ "data1": { "key1": [ {"name" ...

  6. java模式-工厂模式

    今天在学习工厂模式,从最简单的简单工厂模式开始. 我们现在需要通过工厂Factory生产A,B两款产品(都是产品,实现了接口Product). 产品A: public class A implemen ...

  7. VB类模块中属性的参数——VBA中Range对象的Value属性和Value2属性的一点区别

    在VB中,属性是可以有参数的,而VBA中属性使用参数非常常见.比如最常用的:Worksheet.Range("A1:A10")  VB的语法,使用参数的不一定是方法,也有可能是属性 ...

  8. MyBatis 简介

    MyBatis的前身叫iBatis,本是apache的一个开源项目, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis ...

  9. 最新榜单!消金企业TOP10,数据、风控、催收服务方TOP5

    最新榜单!消金企业TOP10,数据.风控.催收服务方TOP5 布谷TIME2016-12-15 17:47:59消费 风控阅读(164)评论(0) 声明:本文由入驻搜狐公众平台的作者撰写,除搜狐官方账 ...

  10. javascript正则表达式

    引用:http://www.jb51.net/article/72192.htm