首页 > 代码库 > 16080401(面向摄像机的Instance模型)

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等文件要覆盖,



null


16080401(面向摄像机的Instance模型)