您的位置:首页 > 其它

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

2017-03-07 17:58 183 查看
【目标】

面向摄像机的模型

【思路】

1UE2中制作的

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

2在ATerrainInfo::RenderDecorations中

FRotatorrot;

if(DecoLayer.bBillboard)

{

FVectorViewLocation=SceneNode->ViewOrigin;

FVectorDirection(0,0,1);

FVectorProjTemp=Direction^(DecoInfo->Location-ViewLocation);

ProjTemp.Normalize();

rot=DecoInfo->Rotation+ProjTemp.Rotation();

}

else

rot=DecoInfo->Rotation;

[/code]

3参考

15110101(模型始终面向相机)

4植被绘制流程

每帧绘制的地方

FSceneRenderer.ProcessVisible中是StaticRelevance



FViewInfo.StaticMeshVisibilityMap



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



单独的参数设置FInstancedStaticMeshVertexFactoryShaderParameters.SetMesh

FInstancedStaticMeshVertexFactory.InitRHI中的顶点格式



在usf中



计算Instance位置的方式



数据来源于FInstancedStaticMeshRenderData.InstanceBuffer



在FInstancedStaticMeshRenderData.FInstancedStaticMeshRenderData中初始化



FStaticMeshInstanceBuffer.Init中赋值

instancetoworld矩阵直接赋值



后面的3个worldtoInstance



每个Instance的偏移矩阵

5图标绘制方式



这么多Sprite类型的

eg.特效的图标







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

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

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

答案是否

8D3D9多流处理

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





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





PS.注意上面的Stream的Index

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

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

下图就是Instance所有的Stream



上图可见,对应VEU_TextureCoordinate4,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

13google到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

BillboardedFoliageinUnrealEngine4

这里有UE3的

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





14实验

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



转动相机时的效果



移动模型时的效果



实验2:新建Custom节点



float4output;

float3CameraToObjVector;

//GetCameratoObjectVector

CameraToObjVector=normalize(CameraWorldPos-ObjectWorldPositionAndRadius);

//SetRGBofoutputtotheobjectsZ-Axis

output.r=ObjectOrientation.r;

output.b=ObjectOrientation.b;

output.g=ObjectOrientation.g;


//TransformVectorintoRadians.

output.a=atan2(CameraToObjVector.y,CameraToObjVector.x);

return(output);

[/code]







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



红框中是添加的

15现在需求随机xy轴的旋转

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

16

【步骤】

1先编译【!BuildAll】

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

null
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: