游戏引擎Flax Engine分析(六)渲染
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分析(六)渲染相关推荐
- 游戏引擎Flax Engine分析(七)渲染
2021SC@SDUSC 一.简述 上一篇博客将开始渲染的整个流程介绍完毕,这篇博客将对后续渲染服务进行进一步的分析(注:仍然仅关注于2D渲染部分) 二.分析 我们接下来分析的部分是结束渲染的操作,也 ...
- 游戏引擎Flax Engine源码分析(二)渲染
2021SC@SDUSC 之后几篇博客主要围绕Flax Engine的渲染部分做分析,因此在源代码分析开始前将简单介绍一下渲染,让整个学习过程更加完整. 由于本人是边学习相关知识边进行代码分析,因此开 ...
- 游戏引擎Flax Engine源码分析(十一)渲染
2021SC@SDUSC 一.概述 这篇博客继续分析2D渲染的后续内容. 二.分析 函数DrawBezier()绘制贝塞尔曲线.参数:p1起点.p2第一个控制点.p3第二个控制点.终点.color线条 ...
- 游戏引擎Flax Engine源码分析(十二)渲染
2021SC@SDUSC 一.简述 在之前的博客中我们已经吧2D渲染中大部分内容都分析结束,接下来这篇博客将会对剩余内容进行分析,如字体等... 二.分析 首先是几个头文件: (一).font.h 结 ...
- 游戏引擎Flax Engine源码分析(十)渲染
2021SC@SDUSC 一.概述 这篇博客我们继续之前的内容,分析2D渲染. 二.分析 接下来的大多数渲染方法,诸如 绘制纹理,绘制Sprite,绘制纹理(使用点采样器),绘制Sprite(使用点采 ...
- 游戏引擎Flax Engine源码分析(三)渲染2
2021SC@SDUSC 一.简述 这篇博客将继续上一篇未完成的内容,也就是分析Render2D的具体内容,包括一些函数的具体实现,一部分结构体等. Render2D.cpp作为2D渲染部分最主要的部 ...
- 游戏引擎Flax Engine源码分析(一)综述
2021SC@SDUSC 一.概述 第一篇综述主要介绍我们分析的项目和一些暂定的分工.这个过程将通过项目网站和项目部署的过程进行. Flax Engine是一款开源的轻量级游戏引擎,跨平台支持(Win ...
- 游戏引擎Flax Engine源码分析(十四)总结
一.简述 这篇文章简单的对整个2D渲染做一个总结,也是对这次项目分析进行一次总结. 二.分析 从项目概述中我们就已经能够看出,Flax Engine作为一个融合Unity3D以及UE4的游戏引擎,其项 ...
- 游戏引擎UnityUnreal对比分析
参考简书链接和百度百科:<ahref='https://www.jianshu.com/p/3868a1896b42'>https://www.jianshu.com/p/3868a189 ...
最新文章
- 深入浅出Javascript闭包
- CNN之性能指标:卷积神经网络中常用的性能指标(IOU/AP/mAP、混淆矩阵)简介、使用方法之详细攻略
- tmux与python虚拟环境问题
- how to find annual report for a stock market company
- python函数参数学习_python学习笔记-11.函数参数和返回值进阶
- saphana服务器硬件评估,华为SAP HANA一体机:你身边的数据计算专家
- 【英语学习】【WOTD】resurrection 释义/词源/示例
- python 表白程序代码_python抖音表白程序源代码
- 怎么样采集声音的波形和频率_示波器采集模式
- IMA-ADPCM 算法
- 如何在群晖系统中安装cpolar(群晖7.X版)
- Java-String类常用方法汇总
- html 实现复制功能
- 【密码学】七、密钥管理
- deepin 20 推荐邮件客户端 Bluemail 邮箱
- Spring Boot普通参数与基本注解
- 家禽也能有身份,XFS在畜牧业落地
- Linux系统部署apk配置nginx
- Visual Studio 2010打开工程提示“未知错误”解决办法
- 【UTAU插件】辅音速度重载
热门文章
- mysql using mrr_Using MRR(Multi-Range Read )
- 帆软亮相数博会:为企业发展提供“导航”
- 在线视频转gif的网站
- 禁忌搜索(Tabu Search(TS))
- 江西师范大学计算机考研经验分享
- MySQL时间查询不走索引,MySQL带时间字段的范围查询不走索引了?
- 给二十而惑的年轻人一些建议
- springboot毕设项目高速公路联网收费系统13z1s(java+VUE+Mybatis+Maven+Mysql)
- Interface Programming: Shareaza wxWindows
- 迈克菲详解FakeInstaller恶意伪装程序