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

相关文章

Spring Security中用户名和密码的验证完整流程

《SpringSecurity中用户名和密码的验证完整流程》本文给大家介绍SpringSecurity中用户名和密码的验证完整流程,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定... 首先创建了一个UsernamePasswordAuthenticationTChina编程oken对象,这是S

Android ViewBinding使用流程

《AndroidViewBinding使用流程》AndroidViewBinding是Jetpack组件,替代findViewById,提供类型安全、空安全和编译时检查,代码简洁且性能优化,相比Da... 目录一、核心概念二、ViewBinding优点三、使用流程1. 启用 ViewBinding (模块级

SpringBoot整合Flowable实现工作流的详细流程

《SpringBoot整合Flowable实现工作流的详细流程》Flowable是一个使用Java编写的轻量级业务流程引擎,Flowable流程引擎可用于部署BPMN2.0流程定义,创建这些流程定义的... 目录1、流程引擎介绍2、创建项目3、画流程图4、开发接口4.1 Java 类梳理4.2 查看流程图4

java Long 与long之间的转换流程

《javaLong与long之间的转换流程》Long类提供了一些方法,用于在long和其他数据类型(如String)之间进行转换,本文将详细介绍如何在Java中实现Long和long之间的转换,感... 目录概述流程步骤1:将long转换为Long对象步骤2:将Longhttp://www.cppcns.c

spring-gateway filters添加自定义过滤器实现流程分析(可插拔)

《spring-gatewayfilters添加自定义过滤器实现流程分析(可插拔)》:本文主要介绍spring-gatewayfilters添加自定义过滤器实现流程分析(可插拔),本文通过实例图... 目录需求背景需求拆解设计流程及作用域逻辑处理代码逻辑需求背景公司要求,通过公司网络代理访问的请求需要做请

使用JavaConfig配置Spring的流程步骤

《使用JavaConfig配置Spring的流程步骤》JavaConfig是Spring框架提供的一种基于Java的配置方式,它通过使用@Configuration注解标记的类来替代传统的XML配置文... 目录一、什么是 JavaConfig?1. 核心注解2. 与 XML 配置的对比二、JavaConf

Python Selenium动态渲染页面和抓取的使用指南

《PythonSelenium动态渲染页面和抓取的使用指南》在Web数据采集领域,动态渲染页面已成为现代网站的主流形式,本文将从技术原理,环境配置,核心功能系统讲解Selenium在Python动态... 目录一、Selenium技术架构解析二、环境搭建与基础配置1. 组件安装2. 驱动配置3. 基础操作模

Java对接Dify API接口的完整流程

《Java对接DifyAPI接口的完整流程》Dify是一款AI应用开发平台,提供多种自然语言处理能力,通过调用Dify开放API,开发者可以快速集成智能对话、文本生成等功能到自己的Java应用中,本... 目录Java对接Dify API接口完整指南一、Dify API简介二、准备工作三、基础对接实现1.

将Java项目提交到云服务器的流程步骤

《将Java项目提交到云服务器的流程步骤》所谓将项目提交到云服务器即将你的项目打成一个jar包然后提交到云服务器即可,因此我们需要准备服务器环境为:Linux+JDK+MariDB(MySQL)+Gi... 目录1. 安装 jdk1.1 查看 jdk 版本1.2 下载 jdk2. 安装 mariadb(my

Spring AI ectorStore的使用流程

《SpringAIectorStore的使用流程》SpringAI中的VectorStore是一种用于存储和检索高维向量数据的数据库或存储解决方案,它在AI应用中发挥着至关重要的作用,本文给大家介... 目录一、VectorStore的基本概念二、VectorStore的核心接口三、VectorStore的