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等文件要覆盖,

null

时间: 2024-10-25 00:33:43

16080401(面向摄像机的Instance模型)的相关文章

OSGI(面向Java的动态模型系统)

基本简介编辑 OSGI服务平台提供在多种网络设备上无需重启的动态改变构造的功能.为了最小化耦合度和促使这些耦合度可管理,OSGi技术提供一种面向服务的架构,它能使这些组件动态地发现对方.OSGi联 OSGI 盟已经开发了为例如象HTTP服务器.配置.日志.安全.用户管理.XML等很多公共功能标准组件接口.这些组件的兼容性插件实现可以从进行了不同优化和使用代价的不同计算机服务提供商得到.然而,服务接口能够基于专有权基础上开发. 因为OSGi技术为集成提供了预建立和预测试的组件子系统,所以OSGi技

OSGI 面向Java的动态模型系统

OSGI (面向Java的动态模型系统) OSGi(Open Service Gateway Initiative)技术是Java动态化模块化系统的一系列规范.OSGi一方面指维护OSGi规范的OSGI官方联盟,另一方面指的是该组织维护的基于Java语言的服务(业务)规范.简单来说,OSGi可以认为是Java平台的模块层. OSGi服务平台向Java提供服务,这些服务使Java成为软件集成和软件开发的首选环境.Java提供在多个平台支持产品的可移植性.OSGi技术提供允许应用程序使用精炼.可重用

Unity3D始终让物体面向主摄像机

m_Name.transform.LookAt(Camera.main.transform.position); m_Name.transform.rotation = Quaternion.Slerp(m_Name.transform.rotation, Quaternion.LookRotation(Camera.main.transform.position - m_Name.transform.position), 10 * Time.deltaTime); m_Name是需要面向摄像机

彩色模型

彩色模型(又称彩色空间或彩色系统)是描述色彩的一种方法,本质上,彩色模型就是坐标系统和子空间的规范,系统中的每种颜色由单个点来表示.下面介绍两种最常用的彩色模型. 一.RGB彩色模型: RGB模型是最通用的面向设备的彩色模型,主要用于彩色显示器和彩色视频摄像机.RGB模型利用了三原色原理,即大多数颜色都可由红.绿.蓝三原色按不同比例混合构成.该模型确定的彩色子空间如下: 红.绿.蓝在3个角上,青.深红.黄在另外3个角上,黑色在原点处,白色位于离原点最远的角上:灰度等级沿着主对角线从黑色到白色分布

面向行与面向列

最近看到H5.H2.HBase的,以为有啥关联,后来知道H5->HTML5(很多人在吐槽这个缩写), H2 -> 一个内存数据库, HBase是一个分布式的.面向列的开源数据库. -.- 原谅我着急的智商,以我对数据库的了(shui)解(ping),我之前根本不知道”基于行“与”面向列“这样的概念..只知道SELECT\UPDATE\DELETE... 好吧,好好搜搜,找到这么一篇(H2与HBase)面向行or面向列的存储模型? 数据库的内部结构不敢多谈,因为不清楚.-.- 大体上是采用了B-

Java的面向AOP编程

一. 引言 AOP(Aspect-Oriented Programming,面向切面的编程),是一种新型的编程范式,主张关注软件流程中的一个切面,将同样功能的代码整合打包在一起,降低系统的耦合性,增强其扩展性. 传统的软件设计,往往采取事件驱动模型带来类似的效果,通过在可能的事件切入点插入事件回调函数,将对应位置插入外置代码. 函数式编程,也有类似的解决方案,通过函数传递,将对应位置的扩展上新的功能. Java作为一门严谨的传统式开发语言,以安全性和可靠性为第一标准,语言并没有过多的新特性支持,

Unity3D让物体始终朝向摄像机的2中方法

1.设置rotation 此方法的基础是将对象绑定在场景中的一个对象上,然后设置对象的rotation或者lookat,需要在Update中时时更新 //方法1 //m_Name.transform.LookAt(Camera.main.transform.position); //m_Name.transform.rotation = Quaternion.Slerp(Quaternion.LookRotation(Camera.main.transform.position - m_Name

Win 10环境下6sV2.1模型编译心得

最新版本6sV2.1模型是通过FORTRAN95编写的,2017年11月代码编写完成,2018年11月发布在模型官网上.通常我们在使用过程中都是调用模型的.exe可执行文件,而下载下来的是FORTRAN源码,从源码到.exe我们需要经历一道编译的工作,如果不是特别熟悉可能会走很多弯路,目前网上关于编译的教程也是良莠不齐,参考一些教程,在自己的摸索下,在Win 10环境下成功的编译了6sV2.1FORTRAN源码. 编译过程主要有两步组成:1编译器下载与安装,2编译 1编译器下载与安装 FORTR

【深度学习】CNN模型可视化

神经网络本身包含了一系列特征提取器,理想的feature map应该是稀疏的以及包含典型的局部信息.通过模型可视化能有一些直观的认识并帮助我们调试模型,比如:feature map与原图很接近,说明它没有学到什么特征:或者它几乎是一个纯色的图,说明它太过稀疏,可能是我们feature map数太多了(feature_map数太多也反映了卷积核太小).可视化有很多种,比如:feature map可视化.权重可视化等等,我以feature map可视化为例. 模型可视化 用了keras做实验,以下图