首页 > 代码库 > 16080401(面向摄像机的Instance模型)
16080401(面向摄像机的Instance模型)
【目标】
面向摄像机的模型
【思路】
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();
}
else
rot = 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
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节点
float4 output;
float3 CameraToObjVector;
//Get Camera to Object Vector
CameraToObjVector = normalize(CameraWorldPos - ObjectWorldPositionAndRadius);
//Set RGB of output to the objects Z-Axis
output.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等文件要覆盖,
16080401(面向摄像机的Instance模型)