Oge中Mesh的渲染流程详述

2024-01-31 23:59
文章标签 流程 渲染 详述 mesh oge

本文主要是介绍Oge中Mesh的渲染流程详述,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

转自:http://blog.csdn.net/yanonsoftware/article/details/1041396

 首先一个Entity对象必须Attach到一个SceneNode

1. 创建一个 SceneNode SceneManager::getRootSceneNode() (在 SceneManager::init 时会创建一个 RootNode
à SceneNode::createChildSceneNode()
à Node::createChild() 主要的操作在这个函数中完成,首先调用虚函数 SceneNode::createChildImpl (),此函数又会调用 OctreeSceneManager::createSceneNode (),此函数会 new 一个 SceneNode 的派生类对象,这里是 OctreeNode ,并加入到 SceneNodeList mSceneNodes 中;随后又进行了坐标变换;最后将此指针又加入到 ChildNodeMap mChildren 中,然后返回此指针;
2. Entity Attach SceneNode SceneNode:: attachObject()
3. 渲染从 Root::startRendering() 函数开始,此函数启动一个循环,每次执行 Root::renderOneFrame ()
à Root::_updateAllRenderTargets
à RenderSystem::_updateAllRenderTargets()
à RenderWindow::update()
à D3D9RenderWindow::update(bool swap)
à RenderTarget::update()
à Viewport::update()
à Camera::_renderScene()
à SceneManager::_renderScene(Camera* camera, Viewport* vp, bool includeOverlays)
4. 绕了好大一圈,才来到了 SceneManager::_renderScene() ,此函数想必是渲染的主要操作所在;
5.SceneManager:: _updateSceneGraph() root node 开始递归的调用了所有 scene node update ,主要是计算了 transform
6. AutoParamDataSource 设置了一系列参数,这个类是用来为 gpu programs 提供一些参数的;
7.SceneManager::prepareRenderQueue ()。这里有一个 Ogre 场景管理的概念 RenderQueue 。粗略的看,这个类主要是为了把 Objects 按照材质分组,它还将管理对象的渲染优先权;
8.OctreeSceneManager::_findVisibleObjects ()
à OctreeSceneManager::walkOctree
à OctreeNode::_addToRenderQueue 如果想显示包裹盒的话,则会调用 ” sn->_addBoundingBoxToQueue(queue);” 可见这个操作利用 SceneManager 的空间管理算法来对所有的 SceneNode 进行了可见性判断,如果可能可见,则加入到 RenderQueue 中;
9. 在计算好了 RenderQueue 之后,开始调用 RenderSystem 的一系列函数,例如 _setProjectionMatrix 等等开始为真正的渲染操作做好准备;
10.SceneManager::_renderVisibleObjects ,渲染操作就在这里了。
à SceneManager::renderVisibleObjectsDefaultSequence
à SceneManager::_renderQueueGroupObjects
à SceneManager::renderBasicQueueGroupObjects (此函数遍历 RenderQueueGroup 中的每个 RenderPriorityGroup ,然后先渲染 solids ,再渲染 transparents
à SceneManager::SceneMgrQueuedRenderableVisitor::visit
11.  à SceneManager::renderSingleObject ,此函数设置了灯光、 GPU programs ,然后使用一个 RenderOperation 对象来调用 D3D9RenderSystem::_render ,也就是真正的 Draw call RenderOperation 对象是由 SubEntity::getRenderOperation à SubMesh::_getRenderOperation 来设置的,主要是 IndexData VertexData
这里有几个细节需要注意:
1. SceneManager::renderObjects 函数中用到了一个 visitor 模式来访问 QueuedRenderableCollection (这个类的实例用来在 RenderPriorityGroup 中包括 solids transparents 等等)。
2.Entity 是从 MoveableObject 派生的,而 SubEntity 才是从 Renderable 派生的;
3. 一个 SceneNode 可以 Attach 多个 Entity ;实际上 SceneNode 可以 Attach 任何的 MoveableObject
4. 前面只提到了 IndexData VertexData ,而对于渲染来说 Material 更是关注的焦点, Mesh 的材质是如何与 RenderSystem 交互的呢?
总结: SceneManager 进行可见性判断之后,形成一个 RenderQueue ,然后对于队列中的每个 Object 再使用 RenderOpertation RenderSystem 联系,来执行渲染操作。 总体感觉有些地方相当复杂,有些觉得比较罗索,例如通过 root 然后找到 RenderTarget 然后知道 ViewPort ,再找到 Camear ,最后才执行到 SceneManager 的渲染函数,为什么不把 ViewPort 做完 SceneManaer::_renderScene 的一个参数,交给上层来控制呢?毕竟多数程序要一个 RenderWindow ,一个 ViewPort 就够了。又比如 RenderQueue (见下图),不知道是不是因为要处理 Shadow 等才搞得这么复杂。
  对于 Objects 按照 Material 分组,然后对于每个 Group 再先显然 Solids 再渲染 transparents ,这种透明处理方式明显是不安全的,如果两个组中都有透明物体,那画面肯定会出问题的。

转载于:https://www.cnblogs.com/hnfxs/p/3185367.html

这篇关于Oge中Mesh的渲染流程详述的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/665472

相关文章

在DataGrip中操作MySQL完整流程步骤(从登录到数据查询)

《在DataGrip中操作MySQL完整流程步骤(从登录到数据查询)》DataGrip是JetBrains公司出品的一款现代化数据库管理工具,支持多种数据库系统,包括MySQL,:本文主要介绍在D... 目录前言一、登录 mysql 服务器1.1 打开 DataGrip 并添加数据源1.2 配置 MySQL

Nginx分布式部署流程分析

《Nginx分布式部署流程分析》文章介绍Nginx在分布式部署中的反向代理和负载均衡作用,用于分发请求、减轻服务器压力及解决session共享问题,涵盖配置方法、策略及Java项目应用,并提及分布式事... 目录分布式部署NginxJava中的代理代理分为正向代理和反向代理正向代理反向代理Nginx应用场景

Spring Boot分层架构详解之从Controller到Service再到Mapper的完整流程(用户管理系统为例)

《SpringBoot分层架构详解之从Controller到Service再到Mapper的完整流程(用户管理系统为例)》本文将以一个实际案例(用户管理系统)为例,详细解析SpringBoot中Co... 目录引言:为什么学习Spring Boot分层架构?第一部分:Spring Boot的整体架构1.1

nodejs打包作为公共包使用的完整流程

《nodejs打包作为公共包使用的完整流程》在Node.js项目中,打包和部署是发布应用的关键步骤,:本文主要介绍nodejs打包作为公共包使用的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言一、前置准备二、创建与编码三、一键构建四、本地“白嫖”测试(可选)五、发布公共包六、常见踩坑提醒

Ubuntu向多台主机批量传输文件的流程步骤

《Ubuntu向多台主机批量传输文件的流程步骤》:本文主要介绍在Ubuntu中批量传输文件到多台主机的方法,需确保主机互通、用户名密码统一及端口开放,通过安装sshpass工具,准备包含目标主机信... 目录Ubuntu 向多台主机批量传输文件1.安装 sshpass2.准备主机列表文件3.创建一个批处理脚

一个Java的main方法在JVM中的执行流程示例详解

《一个Java的main方法在JVM中的执行流程示例详解》main方法是Java程序的入口点,程序从这里开始执行,:本文主要介绍一个Java的main方法在JVM中执行流程的相关资料,文中通过代码... 目录第一阶段:加载 (Loading)第二阶段:链接 (Linking)第三阶段:初始化 (Initia

Git打标签从本地创建到远端推送的详细流程

《Git打标签从本地创建到远端推送的详细流程》在软件开发中,Git标签(Tag)是为发布版本、标记里程碑量身定制的“快照锚点”,它能永久记录项目历史中的关键节点,然而,仅创建本地标签往往不够,如何将其... 目录一、标签的两种“形态”二、本地创建与查看1. 打附注标http://www.chinasem.cn

通过Docker容器部署Python环境的全流程

《通过Docker容器部署Python环境的全流程》在现代化开发流程中,Docker因其轻量化、环境隔离和跨平台一致性的特性,已成为部署Python应用的标准工具,本文将详细演示如何通过Docker容... 目录引言一、docker与python的协同优势二、核心步骤详解三、进阶配置技巧四、生产环境最佳实践

MyBatis分页查询实战案例完整流程

《MyBatis分页查询实战案例完整流程》MyBatis是一个强大的Java持久层框架,支持自定义SQL和高级映射,本案例以员工工资信息管理为例,详细讲解如何在IDEA中使用MyBatis结合Page... 目录1. MyBATis框架简介2. 分页查询原理与应用场景2.1 分页查询的基本原理2.1.1 分

redis-sentinel基础概念及部署流程

《redis-sentinel基础概念及部署流程》RedisSentinel是Redis的高可用解决方案,通过监控主从节点、自动故障转移、通知机制及配置提供,实现集群故障恢复与服务持续可用,核心组件包... 目录一. 引言二. 核心功能三. 核心组件四. 故障转移流程五. 服务部署六. sentinel部署