【目标】
面向摄像机的模型
【思路】
1 UE2中制作的
地形编辑器里面Decorations页面右键点击某一层,use billboard
2 在 ATerrainInfo::RenderDecorations中
FRotator rot;if (DecoLayer.bBillboard){FVector ViewLocation = SceneNode->ViewOrigin;FVector Direction(0,0,1);FVector ProjTemp = Direction ^ (DecoInfo->Location - ViewLocation);ProjTemp.Normalize();rot = DecoInfo->Rotation + ProjTemp.Rotation();}elserot = DecoInfo->Rotation;
3 参考
15110101(模型始终面向相机)
4 植被绘制流程
每帧绘制的地方
FSceneRenderer.ProcessVisible 中 是StaticRelevance


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

单独的参数设置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

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节点

float4 output;float3 CameraToObjVector;//Get Camera to Object VectorCameraToObjVector = normalize(CameraWorldPos - ObjectWorldPositionAndRadius);//Set RGB of output to the objects Z-Axisoutput.r = ObjectOrientation.r;output.b = ObjectOrientation.b;output.g = ObjectOrientation.g;//Transform Vector into Radians.output.a = atan2(CameraToObjVector.y,CameraToObjVector.x);return (output);



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

红框中是添加的
15 现在需求随机x y 轴的旋转
本身植被工具就有这个功能
16
【步骤】
1 先编译【!BuildAll】
【注】先把SYSTEM文件夹该为非只读属性,编译生成的dll等文件要覆盖,
浙公网安备 33010602011771号