zoukankan      html  css  js  c++  java
  • 《Note --- Unreal 4 --- B project --- Second UV issue》

    Second uv 可以通过editor来生成;

    这部分内容都是在staticMeshEditor这个文件夹下面的代码里;

    关于UI的相应机制,有个文件UICommandList.cpp例如我点击static mesh editor里面的tool bar 里面的UVbutton,会生成一条command,最终传到UICommandList.cpp文件的ExecuteAction函数里面,这也是一个action,然后这个从command中剖离出来的action会在这个函数里面调用Action->Execute(),Execute函数里面有调用如下“return (MutableUserObject->*MethodPtr)(DELEGATE_PARAM_PASSTHRU_COMMA_PAYLOAD_PASSIN)”,从这个函数来看,每个button都有有一个函数作为回调赋给了命令处理中心;再往下走,下面就调到了UV显示的函数;

    即,如果想要自动化生成第二套uv的过程,需要生成一系列的command,进而成为一系列的action被执行;

    StaticMeshEditor.cpp中,SetEditorMesh设定当前处理的static mesh,OnChangeMesh函数也有些用处;

    IStaticMeshEditor.h文件里面有不少有用的函数,比如GetCurrentUVChannel或者GetNumUVChannels()或者GetStaticMesh();其具体实现是在StaticMeshEditor.cpp文件里面;

    点击“Save”按钮,进行保存的时候,调用的函数是AssetEditorToolkit.cpp里面的SaveAsset_Execute();

    最终的表现形式应该是,使用Commandlet.cpp这个文件里的一个类,这个类用于处理一个批处理命令,我们的工具应该和这个类结合,同样,类似用到这个文件的功能的还有文件“BatchImportCommandlet.h”,可参照这个工具的写法。

    在commandlet中,要求,原生的过程,啥都没有,也就是说,需要做所有package导入的过程(这个之前是否有人已经做过了?),然后逐个拿到uasset,然后再进行转换;

    关于commandlet,在文件ContentCommandlets.cpp文件中,有一个函数的实现体如下:

    Int32 UListStaticMeshesImportedFromSpeedTreesCommandlet:: Main(const FString & Params);

    是UE4的4.2新增的函数,其内部会遍历得到所有的static mesh,存在一个array中,因为package都是固定的地方存放(content文件夹下面),所以不用传入路径参数;其内部也有遍历每一个UStaticMesh* 的操作,这样的每一个UStaticMesh可以传到Static Mesh Editor系统的StaticMeshEditor.h文件里的void SetEditoMesh(UStaticMesh*InStaticMesh)函数里设定当前处理的是哪个static mesh。

    比如,要执行一个commandlet,其规则可以见Commandlet.h文件中官方描述的,又如参照BatchImportCommandlet.cpp里面的,例如如果写一个bat文件,这个bat文件需要放在UE4Editor.exe同级目录下,其内容是:UE4Editor.exe CityUE4(这个是uproject名) 类名(这个类名是我们继承自Commandlet的那个子类) [参数]

    例如:UE4Editor.exe xxxxUE4(projectName) ListStaticMeshesImportedFromSpeedTreesCommandlet

    在UE4里面手工在Static Mesh Editor里面做的话需要步骤为:

    1. Generate Unique UVs面板里选择Layout using 0 channel;
    2. Static Mesh Setting下Light Map Resolution填light map的大小;
    3. Generate Unique UVs 面板下选 Apply,生成了second uv
    4. Static Mesh Setting下Light Map Coordinate Index选择1(刚生成的UV)
    5. 保存

    如果已经有第二套UV的话。。。就应该跳过不生成,要指定下第二套UV作为lightmap的uv

    貌似只能最多两套uv不能第三套

    “Wing”这个static mesh有两套uv,但是,有两套uv的,第二套也没设定为lightmap使用;

    有两套的应该都是已经设定使用第二套index为1的是lightmap的uv了,我看的是这样;

    Light map的分辨率:

    StaticMeshEditorTools.cpp

    StaticMesh->LightMapResolution = GroupSettings.GetDefaultLightMapResolution();

    StaticMesh.h

    Int32 LightMapResolution;

    在StaticMeshEditorTools.cpp文件中的OnApply函数内部:

                    if(bOnlyLayoutUVs)

                    {

                        uint32 LightmapResolution = StaticMesh->LightMapResolution ? StaticMesh->LightMapResolution : 256;

                        bStatus = MeshUtils.LayoutUVs(RawMesh, LightmapResolution, ChosenUVChannel, Error);

                    }      

    因此,在调用onapply之前,应该可以直接对StaticMesh->LightMapResolution进行lightmap分辨率的赋值;同样,LightMapCoordinateIndex也能被赋值;

    Light map使用uv index:

    StaticMesh.h

    Int32 LightMapCoordinateIndex;

    当前共有几个uv channel,用于判断是否需要生成第二套uv

    在文件StaticMeshEditor.cpp文件中GetNumUVChannels(0)用于获取共有几个uv channel,传入的参数是LOD Level,也就是说,生成第二套UV还需要考虑LOD方面的内容!!!不同的lod level可以有不同的uv channel number,可能是较远的就不再用light map,以提升效率;

    在Generate Unique UVs面板中,生成second UV的过程中必须选择“Layout using 0 channel”复选框

    在代码中就意味着在StaticMeshEditorTools.cpp中进行了如下代码:

    void SGenerateUniqueUVs::OnCreationModeChanged( ESlateCheckBoxState::Type NewRadioState, ECreationModeChoice RadioThatChanged )

    {

        if (NewRadioState == ESlateCheckBoxState::Checked)

        {

            CurrentCreationModeChoice = RadioThatChanged;

        }

    }

    其中传入这个函数的参数是:

    OnCreationModeChanged(ESlateCheckBoxState::Checked, UseChannel0 );

    即,在调用SGenerateUniqueUVs::OnApply(),前必须调用这个函数这行代码!!!

    点击Apply 按钮生成lightmap

    代码是:

    StaticMeshEditorTools.cpp

    FReply SGenerateUniqueUVs::OnApply();

    最终要选择保存

    在代码中AssetEditorToolkit.cpp:

    Void FAssetEditorToolkit::SaveAsset_Execute()

    是真正执行save的操作,也就是static mesh editor的save button的响应函数;

    以上可以生成第二套uv,但是,light map的烘焙怎样生成?是build的时候生成的吗?应该不是,light map保存在umap文件中,即使没有点击build也会有umap。。。

    上帝为我关上了窗,我绝不洗洗睡!
  • 相关阅读:
    POJ 1797 Heavy Transportation
    洛谷 P3379 【模板】最近公共祖先(LCA)
    洛谷 P1351 联合权值
    51nod 1272 最大距离
    codevs 1664 清凉冷水
    COGS 1176. [郑州101中学] 月考
    HDU
    HDU
    一坨计算几何的板子
    bzoj2618[Cqoi2006]凸多边形
  • 原文地址:https://www.cnblogs.com/DeanWang/p/6206663.html
Copyright © 2011-2022 走看看