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

Posted 维尔福

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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等文件要覆盖,





以上是关于16080401(面向摄像机的Instance模型)的主要内容,如果未能解决你的问题,请参考以下文章

常用的图像彩色模型

PHP面向对象之工作单元

12-面向对象基础

面向对象-描述符

JAVA面向对象的学习 -------多态 Instance of 的学习(类型转换)

[PY3]——面向对象编程