游戏引擎Flax Engine分析(六)渲染

news/2024/10/17 6:32:06/

2021SC@SDUSC


一、简述

        这篇博客继续上一篇未分析完的部分继续分析,分析2D渲染服务。

二、分析

        我们先看一下我们曾在Render2D.h这个头文件中介绍过的开始渲染函数,其有多个重载:

API_FUNCTION() static void Begin(GPUContext* context, GPUTexture* output, GPUTexture* depthBuffer = nullptr);
API_FUNCTION() static void Begin(GPUContext* context, GPUTexture* output, GPUTexture* depthBuffer, API_PARAM(Ref) const Matrix& viewProjection);
API_FUNCTION() static void Begin(GPUContext* context, GPUTextureView* output, GPUTextureView* depthBuffer, API_PARAM(Ref) const Viewport& viewport);
API_FUNCTION() static void Begin(GPUContext* context, GPUTextureView* output, GPUTextureView* depthBuffer, API_PARAM(Ref) const Viewport& viewport, API_PARAM(Ref) const Matrix& viewProjection);

        (1)从最简单的,含有三个参数包括要使用的 GPU 命令上下文、输出目标和深度缓冲区:

ASSERT(output != nullptr);Begin(context, output->View(), depthBuffer ? depthBuffer->View() : nullptr, Viewport(output->Size()));

        对输出目标进行了判断,关于ASSERT这个预定义宏,目的是执行表达式的硬断言, 使引擎崩溃并在表达式失败时插入调试器中断。

        调用Begin()的重载, Viewpoint为输出视点,关于这个重载函数的实现我们在下面分析,在此之前我们先看第二个函数。

        (2)增加的一个参数viewProjection:视图*投影矩阵。,允许以 3D 或自定义转换呈现 GUI。

ASSERT(output != nullptr);Begin(context, output->View(), depthBuffer ? depthBuffer->View() : nullptr, Viewport(output->Size()), viewProjection);

        这里调用的是另一个Begin()的重载。

        (3)这里我们看关于(1)中所调用的Begin()的重载函数的实现(这里仅截取部分代码用于分析):

Matrix::OrthoOffCenter(-halfWidth, halfWidth, halfHeight, -halfHeight, zNear, zFar, projection);Matrix::Translation(-halfWidth, -halfHeight, 0, view);Matrix::Multiply(view, projection, viewProjection);Begin(context, output, depthBuffer, viewport, viewProjection);

        halfWith,halfHeight为视点宽度和高度的一半,zNear和zFar分别为浮点数的0和1。view, projection, viewProjection为Matrix类型,表示一个 4x4 的数学矩阵。

        OrthoOffCenter创建一个左手的、自定义的正交投影矩阵。参数含义依次为观测量的最小 x 值、观测量的最大 x 值、观测量的最小 y 值、观测量的最大 y 值、观测量的最小 z 值、观测量的最大 z 值、当方法完成时,包含创建的投影矩阵。

        Translation使用指定的偏移量创建平移矩阵。参数依次为X 坐标偏移、Y 坐标偏移、Z 坐标偏移、当方法完成时,包含创建的投影矩阵。

        Multiply计算两个矩阵的乘积。参数依次为矩阵1(左)、矩阵2(右)、结果。

        然后再调用最后一个重载函数。

        (4)这里我们介绍最后一个重载的Begin(),也就是上述几个Begin()函数调用的最底层:

ASSERT(Context == nullptr && Output == nullptr);
ASSERT(context != nullptr && output != nullptr);

        先对 命名空间内预先声明的GPUContext*(代码中的Context)和GPUTextureView*(Output)是否为空进行判断;同时判断形参是否有内容。

        设置:

    Context = context;Output = output;DepthBuffer = depthBuffer;View = viewport;ViewProjection = viewProjection;DrawCalls.Clear();

         初始化默认转换,清空转换层堆栈,再将默认转换压入栈中:

    const Matrix3x3 defaultTransform = Matrix3x3::Identity;TransformLayersStack.Clear();TransformLayersStack.Push(defaultTransform);TransformCached = defaultTransform;

        初始化默认剪辑蒙版: 

    const Rectangle defaultBounds(viewport.Location, viewport.Size);const RotatedRectangle defaultMask(defaultBounds);ClipLayersStack.Clear();ClipLayersStack.Add({ defaultMask, defaultBounds });

        初始化默认色调堆栈 :

    TintLayersStack.Clear();TintLayersStack.Add({ 1, 1, 1, 1 });

        只能为 2D 正投影启用剪刀,因此此处设置为false: 

IsScissorsRectEnabled = false;

        重置几何缓冲区: 

    VB.Clear();IB.Clear();VBIndex = 0;IBIndex = 0;

         到这里,开始渲染的整个流程已经分析结束,下一篇博客将关注结束时所作的工作以及其他2D渲染操作。

 

 

 

 

  

        


http://www.ppmy.cn/news/569980.html

相关文章

游戏引擎概述-Part1

一、简述自己的学习心路历程 自从业UNITY以来已经有4个月多了,回想起来自己从工作以来就很少写博客了,也算督促一下自己,回想自己从最早的Unity开始,入手C#和编辑器、Unity开发界面,再到自己学一些Unity的小项目…

Hazel游戏引擎

Hazel游戏引擎 Cherno开源项目gitee版本github到gitee(码云) Cherno开源项目gitee版本 看了b站的游戏引擎开发教学,内附的项目地址是github的,国内访问实在不便,遇到了诸多问题:所以将他的项目从github迁移到了gitee上。2021/10/…

Chrome V8引擎介绍

0.v8引擎出现的原因 这里先说一下什么是编译型语言和解释性语言: 编译型语言: 在程序执行之前必须进行专门的编译过程,有如下特点: 只须编译一次就可以把源代码编译成机器语言,后面的执行无须重新编译,直…

十大最牛游戏引擎

游戏引擎就像是游戏的发动机,好的游戏引擎能够让游戏开发事半功倍。而对玩家们来说,游戏引擎能够带来最直观的感受就是游戏的画面和细节表现。从光影声效到场景细节,从画面触感到各种细腻体验,再到人物表情的捕捉,花草…

HTML5开源RPG游戏引擎lufylegendRPG 0.1发布

一,小小开篇 首先不得不先介绍一下这个引擎: lufylegendRPG是lufylegend的拓展引擎,使用它时,需要引入lufylegend。同时您也需要了解lufylegend语法,这样才能更合理地运用lufylegendRPG。该引擎封装了lufylegend的一些…

游戏引擎简介

目录 什么是游戏引擎游戏引擎模块划分常见的游戏引擎碎碎念 什么是游戏引擎 游戏引擎是由多个子系统共同构成的复杂系统,它几乎涵盖了游戏开发过程中的所有重要环节。 以上来自百度百科,听起来很牛,上次听到这么牛的描述还是上次… 游戏引…

游戏引擎概述

定义: 游戏引擎是指一些已编写好的可编辑电脑游戏系统或者一些交互式实时图像应用程序的核心组件。这些系统为游戏设计者提供各种编写游戏所需的各种工具,其目的在于让游戏设计者能容易和快速地做出游戏程式而不用由零开始。大部分都支持多种操作平台&a…

OGRE渲染引擎

1.OGRE简介 OGRE(Object -Oriented Grapjics Rendering Engine),即面向对象的3D引擎,诞生于1999年。它是为了让开发人员更加容易、更直接地利用硬件加速的3D图形系统开发应用。这类库隐藏了底层系统库Direct3D和OpenGL的所有细节&#xff0c…