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渲染操作。

游戏引擎Flax Engine分析(六)渲染相关推荐

  1. 游戏引擎Flax Engine分析(七)渲染

    2021SC@SDUSC 一.简述 上一篇博客将开始渲染的整个流程介绍完毕,这篇博客将对后续渲染服务进行进一步的分析(注:仍然仅关注于2D渲染部分) 二.分析 我们接下来分析的部分是结束渲染的操作,也 ...

  2. 游戏引擎Flax Engine源码分析(二)渲染

    2021SC@SDUSC 之后几篇博客主要围绕Flax Engine的渲染部分做分析,因此在源代码分析开始前将简单介绍一下渲染,让整个学习过程更加完整. 由于本人是边学习相关知识边进行代码分析,因此开 ...

  3. 游戏引擎Flax Engine源码分析(十一)渲染

    2021SC@SDUSC 一.概述 这篇博客继续分析2D渲染的后续内容. 二.分析 函数DrawBezier()绘制贝塞尔曲线.参数:p1起点.p2第一个控制点.p3第二个控制点.终点.color线条 ...

  4. 游戏引擎Flax Engine源码分析(十二)渲染

    2021SC@SDUSC 一.简述 在之前的博客中我们已经吧2D渲染中大部分内容都分析结束,接下来这篇博客将会对剩余内容进行分析,如字体等... 二.分析 首先是几个头文件: (一).font.h 结 ...

  5. 游戏引擎Flax Engine源码分析(十)渲染

    2021SC@SDUSC 一.概述 这篇博客我们继续之前的内容,分析2D渲染. 二.分析 接下来的大多数渲染方法,诸如 绘制纹理,绘制Sprite,绘制纹理(使用点采样器),绘制Sprite(使用点采 ...

  6. 游戏引擎Flax Engine源码分析(三)渲染2

    2021SC@SDUSC 一.简述 这篇博客将继续上一篇未完成的内容,也就是分析Render2D的具体内容,包括一些函数的具体实现,一部分结构体等. Render2D.cpp作为2D渲染部分最主要的部 ...

  7. 游戏引擎Flax Engine源码分析(一)综述

    2021SC@SDUSC 一.概述 第一篇综述主要介绍我们分析的项目和一些暂定的分工.这个过程将通过项目网站和项目部署的过程进行. Flax Engine是一款开源的轻量级游戏引擎,跨平台支持(Win ...

  8. 游戏引擎Flax Engine源码分析(十四)总结

    一.简述 这篇文章简单的对整个2D渲染做一个总结,也是对这次项目分析进行一次总结. 二.分析 从项目概述中我们就已经能够看出,Flax Engine作为一个融合Unity3D以及UE4的游戏引擎,其项 ...

  9. 游戏引擎UnityUnreal对比分析

    参考简书链接和百度百科:<ahref='https://www.jianshu.com/p/3868a1896b42'>https://www.jianshu.com/p/3868a189 ...

最新文章

  1. 深入浅出Javascript闭包
  2. CNN之性能指标:卷积神经网络中常用的性能指标(IOU/AP/mAP、混淆矩阵)简介、使用方法之详细攻略
  3. tmux与python虚拟环境问题
  4. how to find annual report for a stock market company
  5. python函数参数学习_python学习笔记-11.函数参数和返回值进阶
  6. saphana服务器硬件评估,华为SAP HANA一体机:你身边的数据计算专家
  7. 【英语学习】【WOTD】resurrection 释义/词源/示例
  8. python 表白程序代码_python抖音表白程序源代码
  9. 怎么样采集声音的波形和频率_示波器采集模式
  10. IMA-ADPCM 算法
  11. 如何在群晖系统中安装cpolar(群晖7.X版)
  12. Java-String类常用方法汇总
  13. html 实现复制功能
  14. 【密码学】七、密钥管理
  15. deepin 20 推荐邮件客户端 Bluemail 邮箱
  16. Spring Boot普通参数与基本注解
  17. 家禽也能有身份,XFS在畜牧业落地
  18. Linux系统部署apk配置nginx
  19. Visual Studio 2010打开工程提示“未知错误”解决办法
  20. 【UTAU插件】辅音速度重载

热门文章

  1. mysql using mrr_Using MRR(Multi-Range Read )
  2. 帆软亮相数博会:为企业发展提供“导航”
  3. 在线视频转gif的网站
  4. 禁忌搜索(Tabu Search(TS))
  5. 江西师范大学计算机考研经验分享
  6. MySQL时间查询不走索引,MySQL带时间字段的范围查询不走索引了?
  7. 给二十而惑的年轻人一些建议
  8. springboot毕设项目高速公路联网收费系统13z1s(java+VUE+Mybatis+Maven+Mysql)
  9. Interface Programming: Shareaza wxWindows
  10. 迈克菲详解FakeInstaller恶意伪装程序