自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(95)
  • 资源 (1)
  • 收藏
  • 关注

原创 Unlua源码二:UE的委托是如何转发到Lua的

上一篇文章说到可以给C++类绑定一个对应的Lua脚本,这个Lua脚本对应的table也可以像C++类一样拿到对应的委托来绑定,拿UI蓝图对应的脚本举个例子,假如要绑定Onclicked事件到对应的Lua函数,这个过程是怎么生效的呢?我们可以在LuaLib_MulticastDelegate.cpp中发现一些端倪这里完成了把Lua中委托的函数接管的过程,比如说Add,现在会指向TMulticastDelegateLib<FMulticastScriptDelegate>::Add。

2022-05-24 22:50:18 724

原创 Unlua源码一:C++怎么通过getmodulename绑定lua脚本

最近换了工作,有更多的时间可以扩充自己的知识库,不过我发现,看了很多代码和分析还是记不住,很多东西只是大概知道,一定要带着问题去看代码,才能真正有所收获~这次我们就先来看下unlua中最基本的绑定脚本问题,...

2022-05-22 23:28:10 639

原创 【图形学】光照模型-从最简单开始到BRDF实现

不积跬步无以至千里,想要了解复杂的光照模型,就要从最简单的入手,看看他们是如何一步步“进化”成完善的样子。每天300字,看看能否在一个月能完结这个主题吧~ 首先从基本光照模型开始:1.Lambert模型(漫反射) Lambert= kd * Ia (环境光)其中Ia表示环境光强度,kd表示反射系数,两者成绩就是环境光和材质交互反射后得到的光强度。 LambertMinor = kd *Im * Cos(θ)其中kd 和 Im...

2021-10-27 00:34:51 5785 3

原创 UE4反射机制的通俗理解【类型系统注册】

在上文中,我们讲解了CoreUObject模块的加载用UClassRegisterAllCompiledInClasses来生成各编译进来的类的UClass*对象,这些UClass*对象的数据还只是比较简单的版本,只调用过构造函数、设定了SuperStruct和ClassWithin。在这一步之后呢,我们继续按照流程,介绍跟UObject注册相关的FEngineLoop::AppInit程序的Init里做的事情比较简单,关键是最后一步用一个多播委托通知了程序初始化事件,让别的代码有机会继续进行一些初始化

2021-08-25 23:37:58 679

原创 UE4反射机制的通俗理解【CoreObject加载】

先大概看一下当运行项目时候的整个引擎启动流程。其中绿色的部分表示有涉及CoreUObject模块。GuardedMain是真正的实现程序循环的地方。其中Engine开头的函数内部其实只是简单的转调一个全局的GEngineLoop的内部函数。FEngineLoop GEngineLoop;int32 GuardedMain( const TCHAR* CmdLine, HINSTANCE hInInstance, HINSTANCE hPrevInstance, int32 nCmdShow

2021-08-24 23:39:15 560

原创 UE4反射机制的通俗理解【生成第一个UClass】

上一篇我们讲到了利用static变量把构造函数指针以及生成的类信息都收集到了全局静态数组中。这一篇就要讲讲,收集好了之后,我们是怎么利用这些收集的信息来生成我们的UClass的。上一篇最后说到了,IMPLEMENT_VM_FUNCTION(EX_CallMath, execCallMathFunction)会触发UObject::StaticClass()的调用,这里会生成第一个UClass*。那么UObject的IMPLEMENT_CLASS是在哪里定义的呢?就在NoexportTypes.h文件

2021-08-22 13:08:49 1663

原创 UE4反射机制的通俗理解【信息收集】

上一篇文章讲了代码上添加宏之后,会展开成各种变量定义和函数定义。其中最主要的就是两个static变量,static变量会在Main函数执行前自动初始化,我们可以在他的构造函数中写上我们想要执行的代码逻辑,这样就可以在程序启动时自动执行。上篇中写到的生成了那么多的类的信息,分散在各个类的.h 和 .cpp文件中,那么怎么把这些信息统一的记录下来呢,就依赖于static变量的信息收集。我们一个一个看,先是class~static TClassCompiledInDefer<UMyClass&gt

2021-08-21 11:38:13 406

原创 UE4编辑器开发-独立窗口映射面板

在UE4中写一个独立的窗口,并且在面板上映射自己的变量以及类成员。首先是写一个控件类继承SCompoundWidget其中SLATE_BEGIN_ARGS 宏之间可以申明绑定各种变量和事件,这里不赘述,可以看其他文章。其中Construct就是主要构建我们的面板内容首先设置细节面板查看的对象是我们自己的CustomizeObject面板布局就是先创建一个VerticalBox,然后在Box里创建一个Sborder,里面才是我们的细节面板。要把这个控件绑定到独立窗口上,我.

2021-05-17 20:23:33 1364

原创 UE4编辑器开发-映射Detail

通常我们在对象的Detail面板里看到的变量属性都是在对应的C++中先声明变量,然后加一个UProperty在变量前面,UE就会反射到蓝图面板上。但是还有一种方法,是通过面板映射的方式,在Detail面板上映射自己想要的变量和控件。这样做有几个好处可以自定义变量的标签,样式 可以不像定义变量一样,更好地支持面板的扩展。具体怎么加呢首先创建一个空的插件,在插件中我们定义这样一个函数,用来给对象注册自定义布局然后我们创建我们要添加的布局类这个类需要继承自IDetailCu

2021-05-14 21:26:41 996

原创 UE4编辑器开发-菜单扩展

菜单扩展主要分为几个步骤创建新插件(编辑器工具栏 在插件模块的StartModule里添加菜单拓展 通过Extender类添加对应的扩展代理下面来一步一步讲解步骤1.略过2.代码如下共有三种类型的Extender,分别对应菜单栏的不同位置,Add****Extension第一个参数是对应新的扩展在哪个菜单项附近,第二个参数是插入位置,第三个参数是插件命令,填写本插件的命令即可,第四个参数是代理这三个代理是说会调用我们的插件去添加新的菜单项。3.我们添加菜单项的逻辑就

2021-04-09 11:09:06 1578

原创 2020-11-27

Lua面向对象的几种实现方式和技巧1.实现类继承 思想是通过元表来实现类的函数,对象继承。比较简单,下面简单地实现一个继承类A的类Blocal A = { a = 0}A.__index = function(t,k) if A.k then return A[k] end log("find nothing")endfunction CreateClassFromA() local temp = {} setmet..

2020-11-27 19:01:16 139 1

原创 【Programming in Lua】协同程序

看了好几次协同程序都始终没能搞懂其中resume是如何与yield进行数据交流的,今天终于看懂了,让我们从头说起基本语法coroutine.create( )创建coroutine,返回coroutine, 参数是一个函数,当和resume配合使用的时候就唤醒函数调用coroutine.resume( )重启coroutine,和create配合使用coroutine.yield()挂起coroutine,将coroutine设置为挂起状态,这个和resume配合使用能有很多有用

2020-10-18 14:35:03 140

原创 【Programming in Lua1-7章】读书笔记

很多细节的小点为了防止自己遗忘,也方便以后查询,顺带回顾一下,分tips记录在这里。较为常识的Lua语法在这里就不在赘述了。Lua返回值可以是多个,但是在一些特定情况下只有一个。如用小括号强制返回一个,函数返回值在赋值语句中不是最后一个: x,y = foo2(), 20 -- x='a', y=20 foo2返回两个值,但是此时只能返回一个 Lua 中类似 return g(...)这种格式的调用是尾调用。但是 g 和 ...

2020-10-10 23:48:52 714

原创 UE4反射机制的通俗理解【代码生成】

UE4反射机制主要分为以下几个阶段生成阶段:借助UHT生成对应包含了反射声明的反射代码 收集阶段:借助static自动注册方式,在模块加载的时候,把UCLASS注册,放在array中管理 注册阶段:在模块初始化的时候,将Array中的所有UClass相关的Function和Property注册; 链接阶段:就是反射功能。第一阶段 在介绍第一阶段前,先介绍两个工具,ubt和uht。UBT是UE4自带的C++工具,用来处理文件依赖,包含。(待理解)UHT则是UE4自带的C++解...

2020-09-19 21:28:13 2818 1

转载 【C++】利用宏实现C++反射

反射机制:程序能够控制和调整自己的行为。对于我们最常见的反射机制就是通过输入获取对应的实例。举个例子我们有两个类:clas A:public Base {public:A(){};};class B:public Base {public:B(){};};我们输入 A 的时候要能够得到一个A的实例。办法有很多在此例子中你甚至可以用switch case来实现。但是我们最长见的手段就是用一个map进行类实例的存储:std::map<std::stri.

2020-09-19 20:41:37 743

原创 【UE4引擎架构梳理】【挖坑】

这段时间在看UE的关卡切换的内容,发现要补的内容有很多,比如UE的整体结构。本文主要参考了大钊的InsideUE4,记录一下自己的理解和想法。本文从上往下梳理UE的结构。先放一张结构图。Engine首先是引擎级别,UE编辑器本身也是一个引擎。所以分为两个部分,这里我们主要研究UGameEngine在Engine基类里保存会保存多个WorldContext。一般来说,UE只能同时存在一个World,但是可以相互切换。UGameInstanceUGameInst...

2020-09-16 20:09:57 4045

原创 【UE4的资源加载与释放】

说起资源加载,首先要说的是UE对资源的引用。FSoftObjectPath&FsoftClassPathUE游戏运行时通常需要加载内存浏览器的资源,FSoftObjectPath&FsoftClassPath代表对应资源的路径FSoftObjectPath 其中FSoftObjectPath可以指所有资源的路径,包括蓝图资源或者非蓝图资源。在C++中声明变量时,可使用Uproperty对资源类型进行限制,比如添加对应的meta方法。UPROPERTY(EditAn..

2020-09-10 20:38:43 5129

原创 MVVM框架总结

Lua类Lua中的类写法:比如LuaClass添加元表方法__index,先从本原表中找,找不到就去本类的Super(其实就是基类)中去索引,找不到再去Super的原表中去寻找,依次循环,直到没有基类为止。 添加索引索引赋值方法newindex:和索引方法类似。 添加New方法,创建一个空表,设置它的元表,返回这个空表这样就实现了C++中的类继承关系Lua中的深拷贝对表中的每个表数据和方法数据进行拷贝,同时对表数据的表数据和方法再执行拷贝。(这里可能听起来有点绕),递归调用,对表数据不

2020-08-29 16:25:55 745

原创 UnLua使用指引【第二篇】UE静态导出与UE调用lua

上一篇讲的lua调用UE主要都是通过UE的反射系统来进行调用,UnLua还提供了一些简单的方法导出没有反射的类和函数,及成员。开头提出一个问题(为什么UnLua已经可以直接通过反射系统调用C++,还需要类导出呢)目录静态导出类导出成员变量导出成员函数导出全局函数引擎调用Lua蓝图函数重载UE输入重载(包括动作和轴输入)C++中调用Lua函数总结静态导出类Non-reflected classesBEGIN_EXPORT_CLASS(Class.

2020-08-24 20:12:45 3034

原创 UnLua使用指引【第一篇】Unlua绑定UE 以及Lua调用

OverViewUnLua是针对UE4的功能丰富且经过高度优化的脚本解决方案。 开发人员可以使用Lua来开发游戏逻辑,并且可以使用Lua的热加载功能更快地迭代游戏逻辑。 本文档将介绍UnLua的主要功能和基本编程模式。Lua&UE 绑定Unlua提供了两种绑定方式,静态绑定和自定义绑定。静态绑定如果是C++里,类里面需要实现Unlua接口,写一个函数GetModuleName_Implementation,函数返回返回一个Lua文件路径蓝图里就直接在类设置里添加Unlua接口

2020-08-24 19:02:03 9895

原创 【图形学】体素全局光照GI

前段时间出了虚幻引擎5,介绍说是可以实现实时光线追踪,感觉不可思议,后来看文章发现大部分的光线追踪都是基于体素的光线追踪(消耗比较小),一小部分的光线追踪是基于屏幕的射线。于是找了文章开始了解体素光线追踪。这个技术是英伟达提出来的,不算真正意义上的光线追踪,有点近似的感觉,但是效果也很逼真,下面介绍一下:本文算法总共有四个阶段,分别为体素化、直接光照、各向异性过滤、间接光照,算法的各个阶段如图1所示。第一阶段是体素化阶段,将图元为三角形的场景转换为体素场景,计算单个体素的基础属性并存储。第二阶段是直

2020-05-22 22:30:48 2115

原创 延迟渲染的核心思路

之前渲染,对于每一个light都要调用一次triangle draw call,每一次drawcall都要走一遍顶点到像素着色器流程,灯光和片元之间是乘法关系,而延迟渲染就是把light循环放到了像素着色器之后,每个像素做一次光照迭代,可见像素就是屏幕分辨率,最多迭代次数也就是1024 * 768 *lightnum这里要对屏幕像素进行光照,需要用到像素的法线信息,颜色信息等。这些信息被保存在Gbuffer里。再多说一点是:当用非延迟渲染的时候,因为除了平行光,绝大部分光,例如点光源,聚光灯,...

2020-05-21 11:47:40 184

原创 【Q&A】渲染流程中的疑问

Q1:背面剔除是发生在光栅化阶段的,光栅化阶段之前还有顶点着色器,几何着色器等阶段,这些阶段是不是就被无用执行了?能不能把背面剔除放到顶点着色器里?

2020-05-21 11:18:35 120

转载 【Leetcode Summary】旋转图像

You are given annxn2D matrix representing an image.Rotate the image by 90 degrees (clockwise).Note:You have to rotate the imagein-place, which means you have to modify the input 2D matrix d...

2019-07-23 22:33:35 163

原创 【Leetcode Summary】全排列12总结

给出数组,要求,这个数组的全排列全排列1: 数组中没有重复的数字。solution:这种问题直接用DFS求出数组排列的每种情况即可。用DFS可以用几种方法,一种是普通迭代法,用一个数组存储当前还没放进去的数字,然后去迭代,注意:这个数组只能按值传递。比较容易理解,代码如下class Solution {public: vector<vector<int>&...

2019-07-23 15:11:14 119

转载 【Leetcode Summary】combination Sum

描述:给出一组数字,大于零且不重复。求这组数字中求和为target的数字集合,集合中的数字可以重复出现Example 1:Input: candidates = [2,3,6,7], target = 7,A solution set is:[ [7], [2,2,3]]本解法思路来源于:http://www.cnblogs.com/grandyang/p/441925...

2019-05-10 13:45:22 113

原创 【Leetcode Summary】Sudoku Solver数独

问题描述:每行每列 每一个小方块的数字都必须是1-9 不能重复没填上的数字开始用“.”表示solution:这是一个回溯问题。对九宫格上的每个位置进行循环。测试当前位置上空缺时,填上1-9数字是否能够成功,如果成功,那么递归调用下一个位置。如果不成功,返回上一步,并把当前位置重新设置为“。”代码实现:class Solution {public: void solve...

2019-05-09 14:02:22 99

原创 【实时碰撞检测算法Summary】k-DOP碰撞检测

K-DOP名词解释平行平面包围体,不过平行平面是轴对齐的。利用一个法线和两个浮点数值来确定平行平面的位置。而这个法线分量一般限制在(+-1,+-1,+-1)中。k越多,包围盒的拟合效果就越好,而且由于物体之间的法线可以共享(都是限制的),所以存储空间也会减小,k-DOP只需要存储每个轴的最大最小值就可以了。如DOP8存储如下6-DOP一般称作多面体,如果各个面都与坐标轴平行,那...

2019-05-02 14:30:12 3850

原创 腾讯游戏客户端开发&网易互娱暑期实习面经

腾讯提前批(二面挂)在打算笔试的下午,收到了一面电话通知,周一去腾讯上海大厦现场面试,于是提前批的笔试就没有参加(这可能有点影响)腾讯一面和面试官约了时间,结果到了腾讯大厦楼下没法进去,所以只能等面试官下来接人。。 和我一起的还有一个小伙伴,不知道他结果怎么样。。面试官很年轻,人也很好,思路很清晰。主要问题是关于C++和计算机图形学的(这个可能和个人项目有关)面试问题:1....

2019-04-26 09:24:39 6305

原创 【RayTracing】BDRFs

我们平时说的光强,其实是电磁场中的辐射。辐射的相关概念辐射能Q是电磁波能量的基本单位。辐射通量是辐射能每秒通过物体表面的数量。对Q增加了时间限制辐射通量密度定义为单位表面积内的辐射通量。对Q在时间和空间上添加了约束入射辐射度E是指到达物体表面的通量密度。出射辐射度M是指离开物体表面的通量密度。辐射强度I定义为每单位立体角的通量密度。对Q在时间和方向添加了约束辐射度L...

2019-03-30 22:04:25 231

原创 【RayTracing】景深

光线追踪形成景深的原理其实就是:利用薄凸透镜,将场景中的物体投影到视平面上,当物体的深度不在焦平面上时,就会形成一个弥散圆(也就是一点呗模糊成一个圆)如下图:上图的q就处于一种失焦的状态。光线追踪形成景深的步骤:针对每个像素内的采样点,由视点和采样点形成一个中心光线(中心光线只用于确定焦平面位置,不影响像素颜色)如下图,先投射4条中心射线针对每条中心射线,从视点所在...

2019-03-30 18:01:05 417

原创 【RayTracing】圆采样映射和投影视图

圆采样映射就是把在单位正方形内的采样点映射到圆内。同心映射映射公式如下所示:拓展的还有半球体映射,比较复杂,这里不再叙述投影视图e为视点,d为视点到投影面的距离。窗口尺寸不变,当d增加时,类似于在相机上使用长焦镜头,并对当前场景实施放大操作。透视偏差当x不同,球体到视平面等距。球体越远离zw轴,投影将变得细长e为视点位置,d为视点到视平面位置。球体...

2019-03-30 17:47:08 583

翻译 【RayTracing】采样技术

简单来说:光线追踪就是从视点和像素两点成一条射线,投射光线到场景中,返回光线碰撞到的物体的颜色。但是,对每个像素只投射一条光线,会造成锯齿现象。下面介绍几种在像素格内的采样技术,从而投射多条射线进行颜色中和,从而形成抗锯齿的效果。随机采样在2D像素格内,随机选取n个采样点。这些采样点在1D投影上的分布状态并不好,随机采样的效果还是略差。如下图所示:抖动采样对像素格进行了...

2019-03-30 17:18:15 1302 1

原创 【实时碰撞检测算法Summary】凸包检测和AABB解释

凸包可视为碰撞集合体的早小包围体。这里介绍两种算法1.Andrew算法对于一个点集,首先选择点集中最靠左的两个点,产生当前凸包的第一条边。然后开始向右扩展,(分上下两条路向右扩展,这里先只介绍上半部分)如果考察的下一个顶点位于边集当前边的右侧,则该点暂定为凸包上的顶点,并加入到边集中,如果下一个点位于当前边的左侧,则该店位于凸包的外部,并处于错误状态,此时剔除边集中的最后一个顶点,并开...

2019-03-26 22:45:23 1674

转载 【Leetcode Summary】31-35题总结

31.Next PermutationImplementnext permutation, which rearranges numbers into the lexicographically next greater permutation of numbers.If such arrangement is not possible, it must rearrange it as...

2019-02-28 19:38:30 149

原创 【Leetcode Summary】26-30题总结

26.Remove Duplicates from Sorted ArrayGiven a sorted arraynums, remove the duplicatesin-placesuch that each element appear onlyonceand return the new length.Do not allocate extra space for an...

2019-02-26 20:35:36 166

原创 【Leetcode Summary】21-25题总结

21. Merge Two Sorted Lists把两个有序链表合并。 solution:整体思想比较容易,让两个指针分别对应两个链表的开头,如果第一个指针对应的值比较小,那么头指针res的next则为第一个指针,将第一个指针向后移动。依次类推,直到其中一个链表结束。如果另一个链表还没有循环结束,那么把这个链表链在尾部。注意:corner case 可能一个链表为空的情况。22....

2019-02-25 18:35:37 164

原创 【Leetcode Summary】16-20题总结

16. 3Sum ClosestMedium Given an array nums of n integers and an integer target, find three integers in nums such that the sum is closest to target. Return the sum of the three integers. You may ...

2019-02-24 19:57:33 141

原创 【Leetcode Summary】11-15题总结

11. Container With Most WaterGiven n non-negative integers a1, a2, ..., an , where each represents a point at coordinate (i, ai). n vertical lines are drawn such that the two endpoints of line iis a...

2019-02-23 18:09:39 152

原创 【Leetcode Summary】6-10题总结

6.ZigZag ConversionThe string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like this: (you may want to display this pattern in a fixed font for better legibility)P ...

2019-02-21 23:20:56 226

DOS版2048游戏

本人写的C++2048源码加注释,用的DOS做界面所以界面可能就没法看了....游戏还是基本没问题,调试了很久,用Vector做了棋盘,事实证明容器确实不适合做数组的工作,调试的时候经常out of range 如果有人发现BUG了可以回复我,我会再做修改的

2018-01-24

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除