本节主要内容
- 渲染步骤简介
渲染步骤
- 通过初始化包括manager管理器对象的创建,具体的渲染对象的创建,以及效果配置文件的导入及解析
- 效果渲染及管理,简单调用控制函数,能方便的对效果进行解析和控制(包括其位置,大小,颜色的改变)
初始化
// Create a renderer of effects
// エフェクトのレンダラーの作成
auto renderer = ::EffekseerRendererGL::Renderer::Create(5000, EffekseerRendererGL::OpenGLDeviceType::OpenGL2);
// Create a manager of effects
// エフェクトのマネージャーの作成
auto manager = ::Effekseer::Manager::Create(5000);
// Sprcify rendering modules
// 描画モジュールの設定
manager->SetSpriteRenderer(renderer->CreateSpriteRenderer());
manager->SetRibbonRenderer(renderer->CreateRibbonRenderer());
manager->SetRingRenderer(renderer->CreateRingRenderer());
manager->SetTrackRenderer(renderer->CreateTrackRenderer());
manager->SetModelRenderer(renderer->CreateModelRenderer());
// Specify a texture, model and material loader
// It can be extended by yourself. It is loaded from a file on now.
// テクスチャ、モデル、マテリアルローダーの設定する。
// ユーザーが独自で拡張できる。現在はファイルから読み込んでいる。
manager->SetTextureLoader(renderer->CreateTextureLoader());
manager->SetModelLoader(renderer->CreateModelLoader());
manager->SetMaterialLoader(renderer->CreateMaterialLoader());
// Specify a position of view
// 視点位置を確定
auto g_position = ::Effekseer::Vector3D(10.0f, 5.0f, 20.0f);
// Specify a projection matrix
// 投影行列を設定
renderer->SetProjectionMatrix(::Effekseer::Matrix44().PerspectiveFovRH(
90.0f / 180.0f * 3.14f, (float)windowWidth / (float)windowHeight, 1.0f, 500.0f));
// Specify a camera matrix
// カメラ行列を設定
renderer->SetCameraMatrix(
::Effekseer::Matrix44().LookAtRH(g_position, ::Effekseer::Vector3D(0.0f, 0.0f, 0.0f), ::Effekseer::Vector3D(0.0f, 1.0f, 0.0f)));
// Load an effect
// エフェクトの読込
auto effect = Effekseer::Effect::Create(manager, EFK_EXAMPLE_ASSETS_DIR_U16"test.efk");
- 创建manager对象:作为管理器管理粒子效果的配置,渲染,更新,启动与结束。
- 创建render对象:作为效果的渲染器,直接负责粒子效果的最终渲染逻辑。可以分为sprite,ribbon,ring,track,model渲染器。此外创建3个loader类加载资源.
- 创建effect对象:解析粒子效果的配置文件。
Manager初始化
- 初始化一个size=64的drawsets
- 假设最大粒子数8000,则初始化实例块对象池(每个实例块包含16个实例Instance);size=500
- 初始化一个size为20个实例块队列instanceChunks_(每个队列包含maxSize/16个实例块);
- 初始化一个size=8000的实例Groups对象池
- 初始化一个size=8000的实例Containers对象池
创建池的目的主要是为了节省对象生成和销毁的时间。
以IntanceContainer为例,new一个对象包含三步:获得一块内存空间、调用构造函数、返回正确的指针。
IntanceContainer*p=(IntanceContainer*)new int8_t[sizeof(IntanceContainer)] ;
IntanceContainer container=new(p)IntanceContainer();
注意:通过该方法生成对象内存需要手动释放。
一个effect对应一个Drawset;一个node节点对应一个InstanceContainer;InstanceContainer包含若干IntanceGroup;IntanceGroup包含若干Intance
Render初始化(没什么好讲的,这块一般在移植的时候需要分离出来)
- 创建GL环境
- 编译两个shader(顶点渲染,背景扭曲)并指定参数
Effect初始化
- 解析二进制文件
-
生成一个树形节点结构(每个node对应一个单独的粒子效果的全部属性)
image.png
比如上图这个效果,就是由一个root节点和5个sprite节点构成,最后生成的树形结构就类似于这幅图。
生成node的时候会同时进行一些纹理的解析和load。这个东西将渲染流程和业务逻辑进行了绑定,一般也是需要分离的。
假设如果有多个效果需要同时发射,则要初始化多个Effect。
效果渲染及管理
Effekseer的例子中是按照帧来管理具体的粒子效果的。ManagerImplent中提供了一套管理效果的函数,通过这些函数能方便的进行不同效果的组合变化:
//控制效果的进度
Handle Play(Effect* effect, float x, float y, float z) override;
void StopEffect(Handle handle) override;
void SetPaused(Handle handle, bool paused) override;
//改变效果的位置大小颜色
void SetRotation(Handle handle, float x, float y, float z) override;
void SetScale(Handle handle, float x, float y, float z) override;
void SetLocation(Handle handle, const Vector3D& location) override;
void AddLocation(Handle handle, const Vector3D& location) override;
void SetAllColor(Handle handle, Color color) override;
说到粒子系统,虽然很多开源系统结构复杂,有自己独特的架构甚至是极其有特色的发射器,以此来组合纷繁复杂的效果。但究其本质无非是包括两个方面(顶点更新,顶点渲染)。接下来将粗略介绍这两块在effekseer中的具体实现。
网友评论