自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(37)
  • 收藏
  • 关注

原创 新博客地址

新的博客地址是https://zealie.me/,这个博客以后应该不会更新了,有兴趣的话可以关注我的新博客。目前新博客还没什么功能,后续有时间的话会逐步添加评论之类的功能 :)...

2019-10-02 19:21:49 194

原创 基于物理的大气渲染-单次散射的暴力求解

这篇文章是基于知乎上的一篇笔记基于物理的大气渲染。因为目前正在学习渲染有关的知识,正好看到了就实现出来。首先声明这篇文章的重点在于加深对大气渲染方程的理解,而不是要提出一种渲染大气的好方法,代码中使用的暴力算法也是不建议用于生产环境的。渲染方程概述详细的渲染方程的推导请看[知乎]基于物理的大气渲染,包括其中提到的参考资料。本文主要实现地面上看天空时,所看到的的大气散射状况,所以...

2019-07-13 16:48:21 1220

原创 简单的Coroutines实现[1]

关于具体的实现原理请看上篇简单的Coroutines实现[0]。这篇主要介绍如何记录并打印协程的调用堆栈。问题在实际使用中,我发现一个问题,就是当协程内部调用的函数发生错误时,输出的错误信息阅读起来十分吃力。还是看上一篇的例子,假设在SubFunction1中发生了错误抛出异常,打印出来的错误信息中只有SubFunction1的信息,而不会包含调用它的SubFunction0和Ru...

2019-05-01 00:07:26 183

翻译 [GDC2019][01]-Working with deterministic simulation in 'For Honor'

前言 GDC2019前段时间已经落幕。接下来的一段时间我会把看过的视频的简要内容记录下来,方便日后的查阅。 由于个人的能力有限,无法太详细记述亦可能会有所错误,建议简要阅读然后再去看原视频。视频地址我也会一同贴在帖子中。概述 第一篇介绍的是《Back to the Future! Working with Deterministic Simulation in '...

2019-04-24 22:51:45 390

原创 简单的Coroutines实现[0]

目录协程类自定义的IEnumerator拓展-StClusterThread如果你不了解迭代器与yield return的相关知识,可以先从之前的一篇文章《从迭代器到Unity的Coroutines》看起。实际上Unity提供的协程足够的好用,通常来说我们没必要去重复写一个自己的协程。但是通常问题都有但是,Unity并没有提供接口对单独某个协程进行操作,我们无法从外部挂起一...

2019-02-17 15:42:14 279

原创 DirectX 11 学习笔记-Part2-5【Cubemap/贴图置换/阴影/屏幕空间环境光遮蔽】【代码篇】

代码已上传至GitHub,这部分对应的项目为NormalDisplacementSsao。运行项目时可以使用数字键1-3切换渲染的shader,另外按下z键可以看到SSAO生成的遮罩贴图。这篇文章主要结合代码介绍渲染的流程(对应代码中的NDSsaoApp::DrawScene)。Shadow Map首先我们要渲染阴影深度图,看ShadowMap的定义class ShadowMap...

2019-01-27 23:35:40 892

原创 DirectX 11 学习笔记-Part2-4【Cubemap/贴图置换/阴影/屏幕空间环境光遮蔽】【原理篇】

代码已上传至GitHub,这部分对应的项目为NormalDisplacementSsao。运行项目时可以使用数字键1-3切换渲染的shader,另外按下z键可以看到SSAO生成的遮罩贴图。这部分内容较多,所以以介绍原理为主。另外在阅读源码时,为了剔除枝干让整体的代码更加一目了然,我用了模板和SFINAE(主要在SceneObject.h),如果看不懂的话也没有关系,不重要,关键是了解这些技术的...

2019-01-27 00:03:44 1176

原创 DirectX 11 学习笔记-Part2-3【地形/粒子】

相关代码已上传至Github,具体来说,这部分的对应的Project是TerrainParticleCube。项目运行的效果图如下,主要包括两部分内容,地形生成和简单的粒子效果。地形Terrain生成地形需要两个纹理来构建地图信息,其一是高度图,它用于存储地形的高度信息,根据高度信息我们可以构建出地形网格;其二是BlendTexture,它用于存储地图各个位置的纹理信息,将Blen...

2019-01-26 18:15:18 633

原创 DirectX 11 学习笔记-Part2-2【曲面细分】

【鸽了这么久终于下定决心把剩下的写完,给自己鼓掌。】概述之前的章节中我们跳过了曲面细分的部分,因为单独的曲面细分作用并不是非常大,往往需要结合其他技术来达到我们需要的效果。接下来的文章我们会使用到曲面细分,所以先对它做一个介绍。简单说,曲面细分就是将几何图元分成小的三角形,然后按照一定的规则对它们进行偏移,从而生成新的顶点。引入曲面细分的目的是为了提升模型细节。比起直接使用更高精...

2019-01-26 02:23:59 512

原创 DirectX 11 学习笔记-Part2-1【Instancing】

Instancing实例化(Instancing)的意思是指,在场景中多次绘制同一个物体,但是可以有不同的位置,方向,缩放,材质和贴图等。我们在绘制相同几何体时,通常不会直接使用每个几何体的世界坐标顶点和索引来绘制,而是使用同一份顶点和索引数据,然后根据不同物体的不同世界坐标,将本地坐标变换成世界坐标再进行绘制。这种做法虽然减少了重复的存储,但每次绘制时依然需要为每个物体设置一个不同的世界...

2019-01-25 22:10:43 1290 1

原创 DirectX 11 学习笔记-Part2-0

第二部分对应书本的Part 3。这部分起主要是DirectX的几种常见的应用场景。因此实际上理论知识的部分将减少,更多关注算法和实现的部分。因此笔记将结合实际的Demo代码来完成。接下来的几篇文章中,每篇文章都将围绕一个或多个topic,根据书本和提供源码实习一个Demo,结合代码和书本来讲解相关的知识。代码的地址依然是https://github.com/ZealotAlie/D...

2018-09-15 13:19:31 224

原创 DirectX 11 学习笔记-Demo-04

高斯模糊与Compute Shader模糊是游戏中常见的一种效果。模糊算法的一般做法是,对某一点的像素,将它与它周围的m*n个像素按照一定的权值累加起来,作为该点的新的像素值。 高斯模糊是指权值根据高斯方程来确定的模糊算法。假设我们选择做一个1*5的高斯模糊计算,定义0为目标像素,则共有-2,-1,0,1,2五个像素点,它们的系数G(x)可以由以下的方程确定 Demo中实现...

2018-09-15 12:28:41 257

原创 DirectX 11 学习笔记-Demo-03

TreeObject 主要包括了三个方面的内容,几何着色器,纹理数组和clip。 绘制树木的顶点只包含树木的位置和尺寸信息,我们需要将这部分信息传送到几何着色器中并转化为我们需要的屏幕坐标系顶点信息。 几何着色器中主要是通过视线的方向确定树的right方向,因为这里的树是一个类似billboard的纹理贴图,所以只需要用 float3 right = cross(up, look...

2018-09-08 15:35:13 242

原创 DirectX 11 学习笔记-Demo-02

Basic.fx 基本的Effect文件,包括一个顶点着色器,一个像素着色器和若干Cbuffer。Cbuffer按照更新频率分组有助于提高效率。这里有两组Cbuffer,第一组主要是环境相关参数,一般而言每帧只更新一次。 第二组是和具体绘制对象有关系的参数,包括世界坐标下的对象的矩阵信息,纹理变换矩阵和光照材质等。 cbuffer cbPerFrame {  Direc...

2018-09-08 15:14:39 219

原创 DirectX 11 学习笔记-Demo-01

前言 这个Demo包含了《Introduction to 3D Game Programming with Directx 11》前12章的内容,我将它们都整合到同一个Demo中。学习的过程中还是建议循序渐进,按照书本的介绍进行练习。 另外,我不会详细介绍代码的每一部分,所以如果希望学习相关内容,可以结合书本阅读源码。 Demo源码可以在GitHub上获取 https://github...

2018-09-08 15:05:37 595

原创 DirectX 11 学习笔记-07【Computer Shader】

Computer Shader 使用GPU进行非图形应用被称为general purpose GPU (GPGPU) programming。并非所有的算法都适用于GPU计算,由于GPU的高并行构架,我们需要大量的数据元素使用相似操作并能对它们进行并行操作,向对像素片段着色器所做的那样。粒子系统也可以作为GPU计算的粒子,当粒子之间可以独立计算时,使用GPU进行并行计算。 对GPGPU编程...

2018-09-01 19:08:38 952

原创 DirectX 11 学习笔记-06【几何着色器】

几何着色器 几何着色器以完整的图元作为输入数据。例如绘制三角形列表时,几何着色器处理的是列表中的每个三角形。顶点着色器无法创建或销毁顶点,而几何着色器可以创建销毁几何体。在离开几何着色器之前,顶点坐标必须变换到齐次裁剪空间。 几何着色器编程与顶点/像素着色器相似,一般格式如下 [maxvertexcount(N)] void ShaderName ( PrimitiveTyp...

2018-09-01 19:04:28 323

原创 DirectX 11 学习笔记-05【深度模板】

深度缓冲区 深度缓冲区(depth buffer)是一个不包含图像数据的纹理对象。常见的深度值范围在0.0 到1.0 之间,0.0表示离观察者最近的物体,1.0表示离观察者最远的物体。深度缓冲区中每个元素都与后台缓冲区中的每个元素一一对应。深度缓冲区主要用于判断物体的哪些像素位于其他物体之前,从而不用关心绘制物体的先后顺序。 渲染时,当发现某个像素具有更小的深度值时,就更新该像素以及它在深...

2018-09-01 19:02:49 481

原创 DirectX 11 学习笔记-04【纹理】

纹理 纹理数据通常是存储在磁盘上的图像文件,我们需要将它读取出来,并载入到一个资源对象中。为纹理创建一个着色器资源视图可以将视图绑定到管线上,但需要注意设置BindFlags以指定需要绑定的管线阶段。 纹理坐标 过滤器 纹理中的元素是连续图像的一系列离散采样,纹理坐标(u,v)不能总是和纹理元素点一一对应,所以对纹理进行采样时,需要使用filter来读取一个或多个纹理元素并将它...

2018-09-01 19:01:09 348

原创 DirectX 11 学习笔记-03【管线概述】

渲染管线概述 之前已经讲了输入装配阶段(IA),暂时不考虑曲面细分(Tessellator Stage)和几何着色器,则可以简化为 IA->VS->RS->PS->OM 顶点着色器 着色器由HLSL写成。 顶点着色器的主要工作是坐标变换。 一般空间坐标的变换顺序为Local->World->View->Projection,当没有几...

2018-09-01 17:41:59 583

原创 DirectX 11 学习笔记-02【输入装配/图元拓扑/缓冲区与资源】

目录 输入装配阶段 图元拓扑创建缓冲区资源间的拷贝与性能问题注参考输入装配阶段 程序生成的场景数据,本质上是一系列的几何图元。我们需要以一定的方式将这些图元绑定到图形管线中,并经过一系列的阶段,最终显示在屏幕内。渲染管线的第一阶段是输入装配阶段,这一阶段从内存中读取几何数据并将这些数据组合为几何图元。 顶点作为一个基本的图元,三个顶点可以组成一个三角形,两个...

2018-09-01 17:19:49 953

原创 ScriptableObject

什么是ScriptableObject简单说,ScriptableObject是Unity用来存储数据的容器。通过它我们可以创建并存储自己的数据资源,而不需要依托于Prefab/GameObject。除了用于存放基本数据结构之外,还可以通过Serializable来自定义可序列化的类型。关于序列化的知识可以看这里。使用ScriptableObject的优点1.灵活的数据结构...

2018-08-28 23:42:06 782

原创 DirectX 11 学习笔记-01【Device/Device Context/Resource/ResourceView/Swap Chain/Viewport】

目录Device和Device Context Resource和ResourceView Swap Chain和Viewport 参考资料计算机绘图本质上绘制的是一张2D的平面图像。DirectX作为底层绘图API,提供了一组软件接口,我们可以通过这组接口来控制绘图硬件。而一个DirectX程序完成的工作,就是把一系列的信息转换为一张2D平面图形,并让它显示在屏幕上。 D...

2018-08-14 23:15:39 567

原创 GOF设计模式

为什么学习设计模式刚工作的时候其实阅读过一遍这本书,但是当时并没有太多感悟。最近重读时才发现,学习设计模式其实是很有必要的。不管是有意还是无意识中,日常工作中的很多代码实际上就是某一种设计模式,学习设计模式一方面有助于规范代码,另一方面也有助于理解他们的代码。在代码中,规范是很重要的一个环节,尽量使用较为通用和为人所知的方法来解决问题实际上也是规范的一环。...

2018-07-05 08:50:43 1586

翻译 Unity游戏中GC的优化

主要内容翻译自这篇文章,另外会加入自己的说明和理解。介绍当我们的游戏运行时,使用内存来存储数据。当数据不再使用,我们需要将内存释放以便能够重新被使用。那些存在于内存中却不再被使用的数据被称为垃圾(garbage),垃圾回收(garbage collection)就是让内存空间能够重新被使用的过程。GC是Unity内存管理的一个部分。垃圾回收过于频繁或者负担过重会让影响游戏的运行,垃圾回收也是造成性...

2018-05-31 23:31:50 844

翻译 C中的内存布局

原文典型的c程序内存由以下几个部分构成:1. 代码段(Text segment )2. 数据段(Initialized data segment)3. BSS段(Uninitialized data segment)4. 栈(stack)5. 堆(heap)1.代码段通常被用来存储程序的可执行代码,这部分区域大小在程序运行前就已经确定。操作系统在装载一个程序时,代码段通常位于最底部即最低地址的部分...

2018-05-30 23:20:45 822

原创 C#中的值类型与引用类型

C#包含三种类型 Value types 值类型 Reference types 引用类型 Pointer types 指针类型值类型直接保存数据,引用类型保存的是对实际数据的引用,引用类型也被称为是object。指针类型只能在unsafe模式下使用,这里不做讨论。值类型值类型包括两个主要的类别: 1. Structs结构体 2. Enume...

2018-05-28 23:51:18 455

原创 从迭代器到Unity的Coroutines

Iterator迭代器和foreach循环Iterator迭代器是设计模式中较为常见的一种,它的意图是提供一种方法顺序访问一个聚合对象中的各个元素而不暴露对象的内部表示。一般而言,Current Item返回当前正在访问的元素,从First开始,通过Next操作逐步执行到最后一个元素从而对容器完成一次访问。在C#中提供的foreach就是通过迭代器访问容器内元素的一种操作。要使用foreach,容...

2018-05-27 11:45:55 449

原创 C/C++中简单数据结构的对齐

这里只讨论简单的数据结构,从MSDN上的例子开始:struct x_ { char a; // 1 byte int b; // 4 bytes short c; // 2 bytes char d; // 1 byte };      在没有对齐的情况下,x_中的所有数据总计是1+4+2+1=8字节,但在...

2018-04-19 21:50:51 422

原创 简单状态机BitFSM

最近需要写一个简单状态机用作动画的状态机所以写了这样的一个东西。 由于动画状态机一般用简单的true或者false来作为transition,所以我决定使用一个整数来描述所有的条件变化情况,整数的每一个位代表一个条件,从而来描述当前的状态。基本思路是使用一个数据结构(Desc)来描述状态机的逻辑,状态机中所有的状态节点和条件值都有一个索引。 每个状态机都对应一个Desc,同时状态机中保存当前状态

2017-06-11 23:12:36 594

原创 CRC32

原理不多做介绍。参考了几个网上的实现,由于时间久远已经记不得具体是参考哪里了所以出处也就不贴了,见谅。主要使用查表的方式来生成CRC,这部分定义了一个CRC表。namespace CrcDetail { static constexpr unsigned int crcTab32[256] = { 0x00000000, 0x77073096, 0xEE0E612C, 0

2017-06-10 18:51:24 555

原创 [RealSense]5-毫无意义的后记

当然这样就结束了。因为摄像头是从学校借的所以我现在也没有摄像头,因此关于SDK的问题我现在也不能解答太多。然后毕竟已经过去了近一年,很多细节我都不太记得了。然后写博客很麻烦。然后代码在这里 链接:https://pan.baidu.com/s/1boJlTt9 密码:6q3p,虽然前面已经有链接了,还是再放一个吧。感觉是不是放在第一篇比较容易看得到。然后然后然后,这东西

2017-02-25 18:32:02 382

原创 [RealSense]4适用于Cocos2dx引擎的监听系统

如果对Cocos2dx引擎没有兴趣的话完全可以跳过这部分。不过这也是文章的最后一个部分了。Cocos2dx的事件监听就不介绍了。事件系统在很多地方都有涉及,为了更方便的把SDK用在游戏之中,我又专门封装了一层。事件监听器EventListenerCamEventListenerCam是事件监听的基本单元,它有三个基本属性:布尔值m_bisEnable,这个监听器是否生效

2017-02-25 18:15:33 440

原创 [RealSense]3-ReaSense SDK的接入与封装

为了方便在Cocos2dx中使用,我封装了RealSense SDK的手部追踪的部分。源码可以在这里下载  (密码:6q3p)。最初之所以用Cocos2dx是因为当时在GitHub上已经有人封装了RealSense SDK到引擎中。但是后来测试发现并不能用。所以为了偷懒就直接自己简单封装了一个。SDK的开发环境配置实感摄像头需要在Win8.1及以上系统上使用,使用前需要安装

2017-02-25 12:52:41 904 4

原创 [RealSense]2-实感摄像头与SDK

本次项目中使用的是F200摄像头,属于较早的摄像头。虽然摄像头的型号可能有所不同,但支持的基本功能都是具备的。具体支持的功能可以查询英特尔官网,不再累述。在众多性能指标中我认为需要我们注意的是摄像头的识别范围,因为它直接影响到了使用的场合。例如F200是摄像头的使用距离是20-60cm,意味着只有坐在电脑前的时候才能很好的发挥效果,而且它的识别范围并不太大,这些都是在设计游戏时应当考虑的。

2017-02-25 11:26:25 2667

原创 [RealSense]1-概述

RealSense 是英特尔的一款摄像头,可以用于识别手势脸部表情距离测算等。RealSense 为开发者提供了完善的SDK,使用起来还是比较方便的,但是由于文档都是英文的而国内资料几乎为0,所以对有些同学来说还是比较难以上手。在接下来的文章中将介绍我去年用RealSense作为输入设备完成的一款游戏《水晶洞穴》(随便取的。)。游戏使用了Cocos2d-x引擎开发,所以使用了SDK

2017-02-25 11:18:09 1363 2

原创 [RealSense]0-写在前面

[RealSense]0-写在前面打算这两开始整理去年毕设所做的关于Realsense的项目。之所以现在才开始整理纯粹是因为这两天有同学问到了这个项目的细节。然后大概搜索了一下目前关于Realsense的资料还是很少,所以拿出来分享希望能够对同学们有所帮助。说实话我本身不太看好把Realsense用在游戏中。因为实际上操控效果很差,就我个人的感受而言。由于各方面的限制,能够使用的场合也十分的有限,所

2017-02-25 00:06:11 405

空空如也

空空如也

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

TA关注的人

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