美文网首页
二,初始化及渲染流程简介

二,初始化及渲染流程简介

作者: 马脸剑之初 | 来源:发表于2020-06-16 16:11 被阅读0次

本节主要内容


  • 渲染步骤简介

渲染步骤

  • 通过初始化包括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中的具体实现。

相关文章

网友评论

      本文标题:二,初始化及渲染流程简介

      本文链接:https://www.haomeiwen.com/subject/hwapzhtx.html