16080401(面向摄像机的Instance模型)
2017-03-07 17:58
183 查看
【目标】
面向摄像机的模型
【思路】
1UE2中制作的
地形编辑器里面Decorations页面右键点击某一层,usebillboard
2在ATerrainInfo::RenderDecorations中
[/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节点
[/code]
实验3:修改现有的Material'zb_201.zb_grass_t01_template_Mat'
红框中是添加的
15现在需求随机xy轴的旋转
本身植被工具就有这个功能
16
【步骤】
1先编译【!BuildAll】
【注】先把SYSTEM文件夹该为非只读属性,编译生成的dll等文件要覆盖,
null
面向摄像机的模型
【思路】
1UE2中制作的
地形编辑器里面Decorations页面右键点击某一层,usebillboard
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多流处理
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
BillboardedFoliageinUnrealEngine4
这里有UE3的
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等文件要覆盖,
相关文章推荐
- 摄像机成像、畸变模型
- [学习笔记]Java面向对象思想和内存模型
- 面向组件,状态机,消息驱动,三合一的编程模型
- 《火球——UML大战需求分析》(第3章 分析业务模型-类图)——3.1 面向过程与面向对象
- 透视几何与摄像机模型
- ecm 面向连接电子模型开发工具包
- GraphLab面向机器学习的并行框架『针对图数据处理模型』
- OpenCV学习笔记(0)—— 摄像机模型与标定1
- 系统架构逻辑参考图【强调了领域模型+面向服务编程理念】
- opencv中摄像机的模型与标定
- 【iOS开发-48】九宫格布局案例:自己主动布局、字典转模型运用、id和instancetype差别、xib反复视图运用及与nib关系
- (学习笔记)摄像机模型与标定——三个坐标系及其之间关系
- 关于数据建模(面向ER)和领域模型建模(面向OO)在企业应用中的作用的讨论
- 摄像机模型与标定(二):opencv2相关函数介绍
- 面向对象-第一个代码模型
- [导入]利用扩大模型以及摄像机空间法线贴图来实现盔甲的发光。
- 摄像机模型与标定——三个坐标系及其之间关系
- 6、面向接口_概念模型分析实例1
- Unity3D始终让物体面向主摄像机
- 系统架构逻辑参考图【强调了领域模型+面向服务编程理念】