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

news/2024/11/29 3:51:57/

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渲染的源代码进行一个大体的分析。

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


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

相关文章

Unreal Engine虚幻引擎 5

ref:http://next.poppur.com/Stylish/10596.html https://www.unrealengine.com/en-US/blog/a-first-look-at-unreal-engine-5 Author:Alex 发表时间2020-05-14 12:09:33 2012 年&#xff0c;Epic Games 首度展示了游戏引擎 Unreal Engine 4 的实机视频&#xff0c;该引擎强…

Rendering Engine 主流的浏览器内核(排版引擎、渲染引擎、解释引擎)有哪几种,分别的特点...

一、A web browser engine A rendering engine is software that draws text and images on the screen. The engine draws structured text from a document (often HTML), and formats it properly based on the given style declarations (often given in CSS). Examples of…

高层游戏引擎——基于OGRE所实现的高层游戏引擎框架

这是意念自己的毕业论文&#xff0c;在一个具体的实践之中&#xff0c;意念主要负责的是物件和GUI之外的其他游戏系统。意念才学疏陋&#xff0c;望众位前辈不吝赐教。由于代码质量不高、环境很难于配置、资源包过大等问题&#xff0c;意念暂先不提供代码和程序&#xff0c;未来…

著名游戏引擎及其开发游戏

著名游戏引擎及其开发游戏 Unreal 虚幻引擎&#xff08;Unreal Engine&#xff09;是一款由Epic Games开发的游戏引擎&#xff0c;多用于开发第一人称射击游戏&#xff0c;最新版本为虚幻引擎3。虚幻3引擎&#xff08;Unreal Engine 3&#xff09;又称虚幻引擎3&#xff0c;是…

虚幻引擎(1)-角色跳跃

文章目录 前言其他介绍下一篇笔记动态预览图蓝图预览 一、创建操作映射(绑定跳跃按键)[1]. 打开操作映射界面[2]. 添加操作映射 二、蓝图节点介绍[1]. 触发事件[2]. 跳跃[3]. 停止跳跃 三 、角色蓝图[1]. 创建角色蓝图类[2]. 角色蓝图类的编辑[3]. 添加组件[4]. 调整相机视角[5…

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

2021SCSDUSC 一、简述 我们继续之前的博客分析2D渲染服务后续的内容。边学习边分析渲染流程。 二、分析 接下来一些服务主要提供对于变换矩阵、颜色等熟悉的操作&#xff0c;诸如入栈、弹出等&#xff0c;这里不再赘述。 我们先看一下在之前分析的结束渲染时进行的批处理元素的…

@Valid接口参数校验怎么做,详细教程

接口参数校验教程 一、在字段上可以使用这个注解来设置校验 Null&#xff1a;被注释的元素必须为null NotNull&#xff1a;被注释的元素不能为null AssertTrue&#xff1a;该字段只能为true AssertFalse&#xff1a;该字段的值只能为false Min("value","messa…

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

2021SCSDUSC 一、简述 这篇博客继续上一篇未分析完的部分继续分析&#xff0c;分析2D渲染服务。 二、分析 我们先看一下我们曾在Render2D.h这个头文件中介绍过的开始渲染函数&#xff0c;其有多个重载&#xff1a; API_FUNCTION() static void Begin(GPUContext* context, GP…