2021SC@SDUSC


一、概述

这篇博客继续分析2D渲染的后续内容。

二、分析

函数DrawBezier()绘制贝塞尔曲线。参数:p1起点、p2第一个控制点、p3第二个控制点、终点、color线条颜色、thickness线条粗细。

static void DrawBezier(const Vector2& p1, const Vector2& p2, const Vector2& p3, const Vector2& p4, const Color& color, float thickness = 1.0f);

以下内容转载自:链接:https://www.jianshu.com/p/4966455cfcaa

贝赛尔曲线是应用于二维图形应用程序的数学曲线。贝兹曲线由线段与节点组成,节点是可拖动的支点,线段像可伸缩的皮筋。它通过控制曲线上的四个点(起始点、终止点以及两个相互分离的中间点)来创造、编辑图形。其中起重要作用的是位于曲线中央的控制线。这条线是虚拟的,中间与贝塞尔曲线交叉,两端是控制端点。移动两端的端点时贝塞尔曲线改变曲线的曲率(弯曲的程度);移动中间点(也就是移动虚拟的控制线)时,贝塞尔曲线在起始点和终止点锁定的情况下做均匀移动。

下面是Flax Engine绘制贝赛尔曲线的方法:

  • 查找要使用的段数。
  • 绘制分段曲线。
void Render2D::DrawBezier(const Vector2& p1, const Vector2& p2, const Vector2& p3, const Vector2& p4, const Color& color, float thickness)
{RENDER2D_CHECK_RENDERING_STATE;const Vector2 d1 = p2 - p1;const Vector2 d2 = p3 - p2;const Vector2 d3 = p4 - p3;const float len = d1.Length() + d2.Length() + d3.Length();const int32 segmentCount = Math::Clamp(Math::CeilToInt(len * 0.05f), 1, 100);const float segmentCountInv = 1.0f / segmentCount;Vector2 p;AnimationUtils::Bezier(p1, p2, p3, p4, 0, p);Lines2.Clear();Lines2.Add(p);for (int32 i = 1; i <= segmentCount; i++){const float t = i * segmentCountInv;AnimationUtils::Bezier(p1, p2, p3, p4, t, p);Lines2.Add(p);}DrawLines(Lines2.Get(), Lines2.Count(), color, color, thickness);
}

2D渲染服务剩余的一些函数如下:

static void DrawMaterial(MaterialBase* material, const Rectangle& rect, const Color& color);
static void DrawBlur(const Rectangle& rect, float blurStrength);
static void DrawTexturedTriangles(GPUTexture* t, const Span<Vector2>& vertices, const Span<Vector2>& uvs);
static void DrawTexturedTriangles(GPUTexture* t, const Span<Vector2>& vertices, const Span<Vector2>& uvs, const Color& color);
static void DrawTexturedTriangles(GPUTexture* t, const Span<Vector2>& vertices, const Span<Vector2>& uvs, const Span<Color>& colors);
static void FillTriangles(const Span<Vector2>& vertices, const Span<Color>& colors, bool useAlpha);
static void FillTriangle(const Vector2& p0, const Vector2& p1, const Vector2& p2, const Color& color);
};

这里我们只介绍函数的具体作用以及参数的含义,而具体的实现则通过其中一到两个举例。(1) DrawMaterial绘制 GUI 材质。

  • "material"要渲染的材料。 必须是 GUI 材质类型。
  • "rect"要绘制的目标矩形。
  • "color"要使用的颜色。

(2)DrawBlur 绘制背景模糊。

  • "rect"要绘制的目标矩形(模糊其背景)
  • "blurStrength"模糊强度定义了背景的模糊程度。 较大的数字会增加模糊,从而导致 GPU 上的运行时成本更高。

(3)DrawTexturedTriangles绘制顶点数组。

  • "t"纹理。
  • "vertices"顶点数组。
  • "uvs"uvs 数组。(Span<>任意内存连续区域的通用表示。)
  • colors"颜色数组
  • "useAlpha"如果真正的 alpha 混合将被启用。

(4)FillTriangle填充三角形区域。

  • 参数分别是第一二三个顶点以及颜色

以DrawMaterial为例:

void Render2D::DrawMaterial(MaterialBase* material, const Rectangle& rect, const Color& color)
{RENDER2D_CHECK_RENDERING_STATE;if (material == nullptr || !material->IsReady() || !material->IsGUI())return;Render2DDrawCall& drawCall = DrawCalls.AddOne();drawCall.Type = DrawCallType::Material;drawCall.StartIB = IBIndex;drawCall.CountIB = 6;drawCall.AsMaterial.Mat = material;WriteRect(rect, color);
}

仍然是在进行一些参数有效性判断后对2D绘图调用进行设置,然后再使用之前我们分析过的诸如WriteRect(),WriteTri()等方法进行具体计算。

再比如FillTriangles()方法:

void Render2D::FillTriangles(const Span<Vector2>& vertices, const Span<Color>& colors, bool useAlpha)
{CHECK(vertices.Length() == colors.Length());RENDER2D_CHECK_RENDERING_STATE;Render2DDrawCall& drawCall = DrawCalls.AddOne();drawCall.Type = useAlpha ? DrawCallType::FillRect : DrawCallType::FillRectNoAlpha;drawCall.StartIB = IBIndex;drawCall.CountIB = vertices.Length();for (int32 i = 0; i < vertices.Length(); i += 3)WriteTri(vertices[i], vertices[i + 1], vertices[i + 2], colors[i], colors[i + 1], colors[i + 2]);
}

三、总结

到这里,有关Render2D.h和Render2D.cpp大部分内容都已经分析完毕,可以看到在这个部分基本完成了2D渲染的大部分操作,关于2D渲染的其他部分,还有字体以及Sprite图集等,之后的博客会针对这些部分再做分析。

由于游戏引擎太过庞大,Flax Engine更像Unity和UE4(虚幻)的结合,所以其源码量也是较大,有关3D渲染的部分可能在这次分析中不再涉及,但是在分析完2D渲染的剩余内容后可能对3D渲染的源代码进行一个大体的分析。

好了这次分析就到这里,感谢。

游戏引擎Flax Engine源码分析(十一)渲染相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

  7. <2021SC@SDUSC>【Overload游戏引擎】OvUI源码模块分析(二)——ImGui

    <2021SC@SDUSC>[Overload游戏引擎]OvUI源码模块分析(二) 前言 案例分析 程序框架 1.基本案例 2.实现定制绑定/定制引擎 渲染函数 总结 前言 本篇我们来分析 ...

  8. <2021SC@SDUSC>【Overload游戏引擎】OvUI源码模块分析(五)——Plugins

    <2021SC@SDUSC>[Overload游戏引擎]OvUI源码模块分析(五)--Plugins 前言 DataDispatcher DDSource DDTarget IPlugin ...

  9. <2021SC@SDUSC>【Overload游戏引擎】OvCore源码模块分析(六)——SceneSystem

    <2021SC@SDUSC>[Overload游戏引擎]OvCore源码模块分析(六)--SceneSystem 前言 SceneSystem Scene SceneManager 总结 ...

最新文章

  1. 收件箱的邮箱发件人可以批量导出吗_企业邮箱常用技巧,高效处理邮件
  2. POSIX消息队列信号通知
  3. ToolPart的简单开发
  4. python3连接mysql数据库_python3.4连接mysql数据库
  5. 算法练习day12——190331(并查集)
  6. JUnit:使用Java 8和Lambda表达式测试异常
  7. Linux 高可用(HA)集群之keepalived
  8. php删除数组中的空元素_PHP | 从数组中删除所有出现的元素
  9. 开发指南专题十:JEECG微云快速开发平台--表单校验组件ValidForm
  10. 【ABAP系列】SAP ABAP 宏的简单使用
  11. Linux查看Chrome的版本号
  12. 汇编篇 :关于地址总线与数据总线的换算
  13. 学习经历与求职经历分享
  14. 外地新能源汽车迁入北京需要哪些条件?
  15. android监听软键盘弹出弹回事件
  16. jsencrypt加密,并解决Message too long for RSA
  17. 微信视频号100w播放收入1000+的变现方式
  18. 星级评分原理 N次重写的分析
  19. python利器app可以运行python嘛_python利器app_python利器安卓版v3.0
  20. HTML和CSS实现京东首页(附GitHub地址)

热门文章

  1. 正方体、正四面体振型动画
  2. 【MATLAB】MATLAB 仿真模拟调制系统 — FM 系统
  3. 时间序列分析之ADF检验——Java实现
  4. 加油打劲,走出舒适区!
  5. 视频教程-机器学习之聚类、主成分分析理论与代码实践-机器学习
  6. ATC DP Q - Flowers
  7. Linux: Wsl ubuntu下安装OhMyZsh
  8. Ensemble learning 集成学习(一)
  9. 树莓派--7寸触摸显示屏问题处理
  10. 哪些食物慢性胃炎患者更适合多吃?