自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(25)
  • 问答 (1)
  • 收藏
  • 关注

原创 Vulkan学习:立方体贴图与天空盒

立方体贴图是一种特殊的贴图,它可以用来实现天空盒技术。天空盒可以看作一个很大的立方体,相机被包裹在这个立方体之内,只会渲染立方体内部的表面。由于天空盒很大,所以无论相机在哪个位置观察,都会感觉天空盒和自己的距离一直保持不变。场景中的物体还可以向天空盒发起采样,然后把采样到的颜色显示在自己的表面,就可以形成像上图一样的反射效果。本篇将分析SaschaWillems的texturecubemap案例的代码实现思路,然后在自己的小引擎上也尝试复现。

2023-10-24 20:38:55 515

原创 【游戏引擎开发日志4】ShadowMap生成阴影

首先,来看一下实现效果:ShadowMap是一种游戏常用的阴影技术,效果好,且实现起来比较简单,具有较好的性能。它的思路如下:首先,把灯光当成摄像机,渲染一张灯光视角下物体的深度图,然后在摄像机渲染的阶段对这张深度图进行采样,比较当前片元和深度图里存储的对应位置片元的深度差异,如果前者深度更小,就说明它的位置没有阴影遮蔽。那么,对于一个多光源的场景来说,选择哪一盏灯光进行阴影生成呢?我个人认为应该对于每一盏灯都设置一个是否生成阴影的属性,所有需要生成阴影的灯光都独立地生成深度图。

2023-09-27 15:41:12 269

原创 【游戏引擎开发日志2】Vulkan整合Imgui

本文的内容是介绍Vulkan整合Imgui的方法。Imgui官方给出了一个整合vulkan的案例,用户可以直接使用该后端进行渲染,也可以自己写vulkan后端进行渲染。本文采取了自己写vulkan后端的方式。若想采用imgui官方的后端,可以把imgui_impl_vulkan.h/cpp文件包含到自己的工程中使用。

2023-08-29 22:14:03 1712

原创 【游戏引擎开发日志1】VertexBuffer和IndexBuffer模块化

我注意到,在该demo中,创建Buffer操作需要依靠LveDevice来实现,而LveDevice在本项目中只创建了一次,但需要被频繁在各个模块使用。因此,我把LveDevice改成了单例模式,可以通过LveDevice::Get()来得到对象。我百思不得其解,经历了一段时间调试之后,发现这是因为我忘记设置hasIndexBuffer为true了,该值为false的时候默认没有IndexBuffer直接渲染。前一段时间,我把vulkan的demo成功放到了游戏引擎里,运行了起来。

2023-08-06 15:50:18 200

原创 油管Vulkan教程学习总结

这段时间我学习了Brendan Galea的油管热门Vulkan入门视频,感觉收获很多。虽然目前还有很多没有完全理解的地方,但我对Vulkan已经有了一个初步的认知。接下来我打算把Vulkan迁移到个人正在编写的游戏引擎上替代OpenGL,因此我制作了一个关于本教程源码的流程图,作为属于自己的一个学习总结。

2023-08-03 15:49:15 177

原创 PAT(甲级)2019秋 Forever【最大公约数】

“Forever number” is a positive integer AAA with KKK digits, satisfying the following constrains:the sum of all the digits of AAA is mmm;the sum of all the digits of A+1A+1A+1 is nnn; andthe greatest common divisor of mmm and nnn is a prime number which

2020-08-30 16:24:52 308 1

原创 PAT A1119 Pre- and Post-order Traversals【先序遍历、后序遍历求中序遍历】

这道题给出前序遍历、后序遍历,要求你求出中序遍历。我的思路是:根据前序遍历和后序遍历建树,然后中序遍历,求出答案。那么如何建树呢?从左到右遍历前序遍历数组中的全部节点,对于当前节点,检查它和上一个节点之间的关系。关系可以分为两大类:如果当前节点的后序遍历下标在上一个节点的左边,那么当前节点是上一个节点的子节点。那么,是左儿子还是右儿子呢?如果在后序遍历序列中,当前节点的下标等于上一个节点的下标减一,那么不确定是左儿子还是右儿子,树不唯一,在我的算法中,统一都设为左儿子,这对后续计算有帮助。如

2020-08-18 20:46:45 159

原创 PAT A1117 Eddington Number

这题的题意太难看懂了orz这题要寻找一个数字E,表示骑行了E天,且这E天每一天骑行的长度都大于E这个数字,求所有满足该条件的E中最大的那个数字。我思考了很久,加了好多条件才求出来,我看别人的代码又短,思路又清晰,唉以下是思路:首先,所有的数字从小到大排序,且求出minn[i],表示第一个大于a[i]的数的下标。如果没有这样的数字存在,就设置为n+1。接着,从前往后遍历每一天,假设每一天的公里数都是待选的E,看看这些E是否满足条件。判断它们是否满足条件的方法就是,看大于它们的天数是否等于它们本身。

2020-08-18 16:49:29 116

原创 PAT A1108 Finding Average【状态机】

这道题的大意是让你求平均数,然而,输入中会包括一些不合法的数,这些数不能参与平均数的计算。这些不合法的数包括根本不是实数的字符串,以及虽然是实数,但是大小不在[-1000,1000]之内的数和小数位数超过2的数。我这道题很快就做出来了,为什么要写一篇日记记录一下,是因为我在做这道题的时候应用了编译原理课上状态机处理常数的思想,利用状态机先判断当前的字符串是否是实数,如果是,再判断大小。这并不是什么算法知识,但是我个人感觉这种思想以后还会用到,因此记录一下。除此之外,c++还有一个新特性被我应用了,那就是

2020-08-15 21:43:24 114

原创 PAT A1104 Sum of Number Segments【思维+踩坑】

这道题是一道简单的思维题,把情况都列出来,就可以轻松地找到其中的规律。但是我提交了之后,一直WA一个点,百思不得其解,后来听别人说,开到long double就可以了。我还是第一次听说long double,顺便记录一下long double如何用scanf输入:scanf("%Lf",&ans);下面是本题的AC代码:#include <iostream>#include<vector>#include<cstdio>#include<algori

2020-08-15 21:22:12 164

原创 PAT A1150 Travelling Salesman Problem【模拟】

这道题虽然是以TSP问题作为背景,但是不需要任何TSP算法的知识,只要按照题目模拟即可。在做题的时候,最重要的就是要细心,这道题情况有很多种,要把所有的情况都依次划分出来。我一开始WA了一个点,检查之后,发现是当我判断是否所有的点均被访问的时候,并没有判断1到n的所有点,而是判断了存储路径数组里的点是否被访问过,这样一来,就根本不会有没有访问过的点了。修复了这个问题之后,终于AC了,开心!代码最下方的注释里面写了那个检查出我的错误的数据。#include <iostream>#inclu

2020-08-14 11:43:49 169 1

原创 PAT A1151 LCA in a Binary Tree【树的遍历】

这道题虽然是让我们求最近公共祖先,但是并不需要用什么倍增之类的复杂算法解决,而是采用递归遍历的方式即可。解决这道题之前,我也没什么思路,先看了看柳神的博客,一下子恍然大悟,这道题其实并不难。这道题的思路是,根据先序遍历和中序遍历给出的数组,递归建树,在建树的过程中,如果两个点一个点位于当前树根的左边,另一个位于右边,则当前树根就是要求的LCA。注意,这里的“左边”“右边”指的是在中序遍历序列中的左右,因为中序遍历是以左子树-根-右子树的方式遍历的。如果两个点均位于左边,那么LCA肯定在当前根节点的左子树,

2020-08-13 13:03:36 164

原创 PAT A1153 Decode Registration Card of PAT【排序】

这道题要非常细心才行,主要就是给定一些学生的数据,按照给定的指令输出想要的信息,但是这道题我卡了半天才过,具体发生了以下错误:由于c++中的string我非常习惯,而c语言中的char我非常讨厌,这道题我都是把char数组转换为string进行计算处理的。然而,在某个测试点超时了。这是因为我只注意了输入用scanf,没注意输出也要变为printf。我使用了strncpy函数进行字符串拷贝,然而我使用了该函数后,出现了拷贝过来的字符串长度比我想要的更长的现象,后来查询资料,发现这个函数是不会在末尾添加’

2020-08-12 18:22:03 215

原创 PAT A1154 Vertex Coloring【图论】

这道题没什么难度,首先要注意把所有的颜色放入set中,方便统计颜色的个数;我第一次尝试使用了unordered_set,听说这个比set更快。然后遍历所有的边,如果这条边连接的两个点颜色相同,则输出No,如果不存在这种情况,则输出颜色的个数。这道题我写完代码之后,没有立刻全对,提交了两次都是全错。这里记录一下犯的错误:面对二重循环,千万不要外围和内围都用相同的变量由于本题是多组数据输入,一定要注意在每一轮开始的时候进行初始化,不要忘记了初始化的过程#include <iostream&gt

2020-08-12 16:22:40 117

原创 PAT A1020 Tree Traversals【dfs+bfs+树的遍历】

这道题是后序遍历转中序遍历,再输出为层次遍历的题,后序遍历转中序遍历参考了算法笔记的做法,要注意的是,在dfs的过程中,cnt的值是可以改变的,所以要提前记录下来;以及,这道题虽然样例里所有的点都在1到n的范围内,但是实际上,并没有说明这一点,所以要记录下来每一个点的数字。#include <iostream>#include<vector>#include<cstdio>#include<algorithm>#include<cmath&gt

2020-08-09 10:46:24 108

原创 PAT A1004 Counting Leaves【dfs+树的遍历】

水题,用邻接表存储树的结构,dfs遍历即可。难点是题干中生词较多,需要花一点时间理解。#include <iostream>#include<vector>#include<cstdio>#include<algorithm>#include<cmath>#include<map>#include<cstdlib>#include<queue>#include<cstring>#i

2020-08-09 10:11:18 153

原创 PAT A1119 Group Photo 【链表处理+排序】

这题一开始我蒙了,还以为对于身高相同的元素,要把姓名从左到右从小到大排序,其实并不需要,只要把姓名和身高一起排序就行了。这道题由于对于每一个小组的内部成员,身高都是先处理为降序再进行重新排列的,而后排的同学都比前排的高,所以可以直接对所有的人先进行一次身高升序排序(同时名字降序排序),然后从后往前处理数据,对于每一组,选择这一组元素下标最大的那个元素,因为一开始是身高升序,名字降序,因此下标最大的那个元素一定是身高最高且名字最小的同学,把这位同学送入链表。接下来倒序遍历该小组所有成员,一左一右依次送入链

2020-08-09 09:47:27 174

原创 PAT A1087 All Roads Lead to Rome【spfa+dfs+字符串hash】

这道题其实就是一道最短路水题,spfa+dfs+hash,但是写代码和调试花的时间都有点长,记录一下细节,警告自己下次要更加耐心。这道题的地区名字都是字符串,所以可以用map存储字符串和int的对应关系。由于本题既需要通过string寻找int,也需要通过int寻找string,因此我建立了两个map来进行这一操作。当dfs的时候,我找到路径后直接返回了,但是忘记了把最后一个元素清除,因此一开始一直得出错误的结论。一开始我在spfa里进行判断快乐值和最短路径,在dfs里判断平均快乐值,后来改为了在d

2020-08-08 13:39:30 245

原创 PAT A1030 Travel Plan【SPFA+输出路径】

本题是一道最短路径水题,和普通最短路径不一样的是,本题不仅要考虑路径长度,还要考虑路径上的花费。除此之外,还要输出路径。考虑路径上的花费比较简单,直接在SPFA的时候添加判断即可,输出路径则在存边的时候开两个数组,一个专门存前驱,一个专门存后继。在最后,倒序遍历,就可以找到唯一的一条最短路径。#include <iostream>#include<vector>#include<cstdio>#include<algorithm>#include&l

2020-08-08 12:23:50 162

原创 PATA1018 Public Bike Management【spfa+dfs】

本题是一道spfa+dfs题,难点在于不能在spfa的过程中计算答案,而要计算完所有最短路径之后再进行计算。我做完这道题之后,一直卡在25分,百思不得其解,后来发现居然是题意又理解错了。以后面对英文题目要加倍细心。这道题是我做的第二道spfa模版题,下一道题我决定采用dijskra,两种方法轮流练习熟练。#include <iostream>#include<vector>#include<cstdio>#include<algorithm>#i

2020-08-06 16:47:18 193

原创 PAT A1003 Emergency(SPFA+DFS)

这道题我采用了spfa+dfs的思路。最近在备考PAT,打算把这道题当作模版题之一,以后随时拿来复习。这道题注意的要点如下:这道题中不仅要输出救生队最大数目,还要输出最短路径数目,其中救生队最大数目可以直接在spfa中得到,最短路径数目则不可以,因为有可能重复统计,所以需要在dfs中得到。dfs需要从后往前遍历,因此需要记录每个点的前驱。如果采用vector数组实现图的存储,要注意记录前驱和记录后继要采用两个数组a和b,不可以用记录后继的数组遍历前驱。#include <iostrea

2020-08-06 15:46:17 214

原创 PAT A1010 Radix(二分法)

这道题真是刷PAT遇到的最毒瘤的题,通过率也只有0.11,大大挫败了我刷题的自信心。。。。。。这道题的思路不是很复杂,是对进制进行二分查找,最后确定符合条件的那个进制数。坑点:本题表面上迷惑了我,让我以为最高就是36进制,事实上并不是这样,假设N1的十进制表示为100,那么N2完全可以是1进制数,一共100位,这样N1也可以等于N2。因此,上界是N1的十进制表示。如果N1和N2看起来就像等,那直接输出radix就行,没必要算下界是N2的最大数位+1,比如,N2=ffffff,那么下界就

2020-08-01 12:06:39 211

原创 patA1085 完美数列

这道题一看就知道,是采用二分查找的思路完成。观察题目,可以确定,我们要求的答案(最大整数个数)可以作为二分查找的对象,因为它的值满足:如果当前的答案满足条件,那么最优的答案一定大于或等于当前答案;若不满足条件,那么最优的答案一定小于当前答案。首先对全部数据进行排序,然后初始化l=1,r=n,进行二分求解。判断mid是否满足条件采用O(n)直接遍历,假设每一个数字均是最小值,确定对应的最大值(假设最小值下标为i,最大值下标一定为i+mid-1),并且判断二者是否满足M<=m*p这个条件,如果满足,直接

2020-08-01 09:51:46 150

原创 吴恩达机器学习编程作业python版:第一次作业

我正在努力用python实现吴恩达的机器学习编程作业。由于时间关系,我大概会只实现最重要的部分,不会实现全部内容。如果有错误,希望可以及时纠正我,谢谢大家。第一次作业:单变量线性回归首先,导入要用到的库:numpy,matplotlib。import numpy as npimport matplotlib.pyplot as plt接下来,导入作业里的数据文件:ex1data1.tx...

2020-04-04 21:20:11 612

原创 您必须添加对程序集'netstandard,Version = 2.0.0.0的引用

您必须添加对程序集’netstandard,Version = 2.0.0.0的引用今天,我在部署photonserver服务端的时候,在启动我自己的application的时候,发现我的应用刚启动就停止了。查看日志,发现错误信息是一段乱码和英语的结合,经过百度搜索,发现大意是这样的:您必须添加对程序集'netstandard,Version = 2.0.0.0,Culture = neutra...

2020-02-03 20:40:21 13132 2

空空如也

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

TA关注的人

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