zoukankan      html  css  js  c++  java
  • 16080401(面向摄像机的Instance模型)

    【目标】

    面向摄像机的模型

    【思路】

    1 UE2中制作的

    地形编辑器里面Decorations页面右键点击某一层,use billboard



    2 在 ATerrainInfo::RenderDecorations中

    1. FRotator rot;
    2. if (DecoLayer.bBillboard)
    3. {
    4. FVector ViewLocation = SceneNode->ViewOrigin;
    5. FVector Direction(0,0,1);
    6. FVector ProjTemp = Direction ^ (DecoInfo->Location - ViewLocation);
    7. ProjTemp.Normalize();
    8. rot = DecoInfo->Rotation + ProjTemp.Rotation();
    9. }
    10. else
    11. rot = DecoInfo->Rotation;


    3 参考

    15110101(模型始终面向相机)



    4 植被绘制流程


    每帧绘制的地方

    FSceneRenderer.ProcessVisible 中 是StaticRelevance



    FViewInfo.StaticMeshVisibilityMap



    绘制透明的模型是这个流程



    单独的参数设置FInstancedStaticMeshVertexFactoryShaderParameters.SetMesh



    FInstancedStaticMeshVertexFactory.InitRHI 中的顶点格式



    在usf中



    计算Instance位置的方式



    数据来源于FInstancedStaticMeshRenderData.InstanceBuffer 


    在FInstancedStaticMeshRenderData.FInstancedStaticMeshRenderData 中初始化



    FStaticMeshInstanceBuffer.Init中赋值

    instance to world矩阵直接赋值



    后面的3个 world to Instance


    每个Instance的偏移矩阵






    5 图标绘制方式


    这么多Sprite类型的


    eg.特效的图标









    6 FInstancedStaticMeshVertexFactoryShaderParameters.SetMesh 这个 只要打开编辑器实时 或者移动相机 每帧都会调用

    所以每帧修改数据是可以更新到的


    7 需要确定FStaticMeshInstanceBuffer.Init这个函数是否每帧都会去调用

    答案是 否


    8 D3D9 多流处理

    http://dev.gameres.com/Program/Visual/3D/multistream.htm




    http://blog.csdn.net/pizi0475/article/details/6628323




    PS.注意上面的Stream的Index

    顶点元素 每条声明和 VertextBuffer的关联是靠 SetStreamSource的






    9 Instance的偏移数据在单独的流 VertexBuffer中

    下图就是Instance所有的Stream


    上图可见,对应VEU_TextureCoordinate 4,5,6



    10 关键就是FInstancedStaticMeshVertexFactory.DataType.InstancedTransformComponent 这个数据是否可以更新

    这个数据仅在FInstancedStaticMeshRenderData.InitStaticMeshVertexFactories中关联FInstancedStaticMeshRenderData.InstanceBuffer 



    关联图




    全图如下






    11 现在看FInstancedStaticMeshRenderData.InstanceBuffer 是否可更新

    仅在FStaticMeshInstanceBuffer.Init 中填充数据



    初始化一次

    没有其他地方更新了



    12 问题:如何去更新InstanceBuffer?

    目前只有在FScene.AddPrimitive调用时才会去新建SceneProxy



    • 需要在渲染线程更新数据
    • 类似于骨骼动画FSkeletalMeshObjectGPUSkin.Update、FSkeletalMeshObjectGPUSkin.Update.NewDynamicData 


    13 google到 UE4中实现FaceCamera

    https://docs.unrealengine.com/latest/INT/Resources/Showcases/Stylized/Materials/index.html





    https://answers.unrealengine.com/questions/40413/3d-object-always-facing-playercamera.html



    http://www.gamedev.net/page/resources/_/technical/graphics-programming-and-theory/billboarded-foliage-in-unreal-engine-4-r4246

    Billboarded Foliage in Unreal Engine 4


    这里有UE3的 

    http://polycount.com/discussion/79143/rotating-an-object-orientation-towards-the-player-in-udk




    14 实验

    实验1:先使用CameraPosition节点和ObjectPosition节点 计算两个值的方向向量作为颜色值


    转动相机时的效果


    移动模型时的效果




    实验2:新建Custom节点



    1. float4 output;
    2. float3 CameraToObjVector;
    3. //Get Camera to Object Vector
    4. CameraToObjVector = normalize(CameraWorldPos - ObjectWorldPositionAndRadius);
    5. //Set RGB of output to the objects Z-Axis
    6. output.r = ObjectOrientation.r;
    7. output.b = ObjectOrientation.b;
    8. output.g = ObjectOrientation.g;
    9. //Transform Vector into Radians.
    10. output.a = atan2(CameraToObjVector.y,CameraToObjVector.x);
    11. return (output);






    实验3:修改现有的Material'zb_201.zb_grass_t01_template_Mat' 


    红框中是添加的


    15 现在需求随机x y 轴的旋转

    本身植被工具就有这个功能


    16







    【步骤】

    1 先编译【!BuildAll

    【注】先把SYSTEM文件夹该为非只读属性,编译生成的dll等文件要覆盖,





  • 相关阅读:
    传输对象模式
    服务定位器模式
    拦截过滤器模式
    前端控制器模式
    数据访问对象模式
    组合实体模式
    业务代表模式
    MVC 模式
    访问者模式
    模板模式
  • 原文地址:https://www.cnblogs.com/username/p/6516047.html
Copyright © 2011-2022 走看看