自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

膜力鸭苏蛙可的博客

知乎专栏https://zhuanlan.zhihu.com/c_1099268510815010816

  • 博客(27)
  • 资源 (1)
  • 收藏
  • 关注

原创 [引擎搭建记录] 遮罩加速的软光栅遮挡剔除

本文知乎地址:https://zhuanlan.zhihu.com/p/69287128下项目地址:https://github.com/MrySwk/GravityEngine本萌新最近学习了一波关于剔除的算法,决定亲自动手写一遍,关于剔除,可以参看洛城大佬最近写的这篇文章https://zhuanlan.zhihu.com/p/66407205第一次学习的时候,我自然想的就是挑个最现代...

2019-06-15 23:46:08 1582

原创 [引擎搭建记录] 分块/分簇延迟渲染

本文知乎地址:https://zhuanlan.zhihu.com/p/66884611项目地址:https://link.zhihu.com/?target=https%3A//github.com/MrySwk/GravityEngine分块、分簇(tiled/clustered)渲染是上个世代提出来的渲染技术,已经有些年头了,其目的是在计算光照前对光照进行裁剪,以提升场景中光源较多时的性...

2019-05-24 23:25:25 1129

原创 [图形学] ReverseZ的正确姿势

今天写程序的时候发现z的浮点误差非常的大,如图正常情况下该图的输出应该是全黑,但是可以看到,在离得远的地方,出现了白色的花斑,而且离得越远越严重,场景深度大概1000左右的样子,视锥远平面是10000,误差大概是零点几,已经到了肉眼可见的程度,深度的误差会造成场景的世界坐标还原不准确,进而导致着色的不准确,尤其是对于temporal这类对位置高度敏感的算法而言,位置的准确度非常重要,1000大小...

2019-05-20 00:47:15 2117

原创 [DirectX12] 实现一个性能分析小工具

最近看帧率的时候发现在场景里某些情况下竟然会掉帧,而我的场景里总共就几个球,觉得很奇怪,于是我用RenderDoc抓帧看了一下,4K分辨率下环境光pass竟然高达12ms,于是我打算找下原因,然而每次改一点点然后用抓帧工具切来切去实在是太伤了,而且抓一次要存2G的文件,为了更好地定位问题,有必要做一个简单的gpu profiler来方便自己查看性能。这就要用到dx12的gpu query了,官方...

2019-05-13 18:56:03 1122

原创 [引擎搭建记录] 时间性抗锯齿(TAA)

我的知乎专栏:https://zhuanlan.zhihu.com/c_1099268510815010816最近我做好了简单的场景编辑和序列化,打算回来继续折腾渲染部分了,首先想要实现的就是TAA(temporal anti-aliasing),为什么阴影和AO之类的啥都没有却要先写TAA呢,因为TAA对整个管线的结构影响非常大,而且后面会有许多地方用得着temporal的方法来增加采样率,比...

2019-05-08 16:47:34 11233

原创 [引擎搭建记录] 延迟渲染管线与PBR(下)

这篇文章接着上篇讲述PBR相关的理论github地址: https://github.com/MrySwk/GravityEngine (目前渲染部分代码乱七八糟,之后要重构一次)图形库用的是DirectX,目前引擎已经完成了基本的界面浏览功能、延迟管线、模型加载以及PBR,效果图如下基于物理的渲染PBR这个东西,真说要讲可能也轮不到我这个萌新来讲,因此这篇文章只是我个人对PBR的一些...

2019-04-09 15:07:14 1140

原创 [引擎搭建记录] 延迟渲染管线与PBR(上)

最近我开始从头搭建游戏引擎了,打算是学习虚幻以及unity引擎的一些特性,造一个很小的轮子,不求功能完善,但求了解一下粗略的架构,以及尽可能熟悉其中一小部分系统。图形库用的是DirectX,目前引擎已经完成了基本的界面浏览功能、延迟管线、模型加载以及PBR,效果图如下框架选择界面造这么一个轮子的目的是造一个playground,以后学习什么算法的时候可以直接在这个环境下面试验,不用每...

2019-04-08 22:01:42 2050

原创 [DirectX12学习笔记] 骨骼动画

骨骼动画这篇文章对应的是龙书的最后一章,里面用到的模型和动画文件格式都不是fbx,所以具体怎么读取我们不用去关心,知道怎么用就行了,格式变一下原理还是一样的。动画原理简介首先骨骼是个树状的存储结构...

2018-12-25 19:04:08 1563 1

原创 [DirectX12学习笔记] 四元组

四元组这篇文章内容将比较偏数学,为方便快速复习,这里只列出关键的结论。四元组简介四元组类似于一个复数,有实部和虚部,只不过四元组的虚部是个矢量,因此总共有四维,一般来说我们把矢量放在前面,也就是说存在XMFLOAT4里面的时候,前三维是虚部,最后一维是实部。运算的定义乘法可以写成矩阵形式注意因为涉及叉乘,左手系和右手系里的四元组不一样。乘法和矩阵乘法一样,有结合律没有交换律。...

2018-12-25 11:50:47 1655

原创 [DirectX12学习笔记] 环境光遮蔽

环境光遮蔽之前我们算环境光的时候都是考虑所有地方收到的环境光强度相等,直接用漫反射系数乘以环境光强度。我们取一个骷髅头模型,单独渲染环境光,不计算任何其他光照,结果如下图。这个结果显然是不对的,场景中有的地方被掩蔽的程度更大,反射光线会更难到达,而有的地方被掩蔽的程度更小,反射光线更容易到达,所以不同地方的环境光强度应该是不同的。那么我们要怎么来计算场景中的点被遮蔽的程度呢?接下来讲...

2018-12-24 15:41:08 2196

原创 [DirectX12学习笔记] 阴影

阴影贴图阴影贴图简介要渲染场景的阴影,我们可以在渲染场景之前,先从每个光源出发渲染一遍深度缓冲,记录下被光照射的深度,再正常渲染,渲染的时候计算到光源的深度,深度大于记录下来的深度的话,就说明没有被照到,就是在阴影范围内。下面介绍基础知识,首先是正射投影。正射投影的视锥是一个长方体,所以不会有透视效果,投影矩阵如下在c++里可以这样获取正射投影矩阵 // Ortho frust...

2018-12-23 21:27:51 2616 1

原创 [DirectX12学习笔记] 法线贴图

法线贴图法线贴图简介法线贴图我们都很熟悉了,法线一般是存在切线空间里的,一般来说大多数位置的法线方向都是和面方向偏差不大,所以法线贴图总是蓝蓝的,也就是对应rgb(0,0.5,0)。法线的三个维度的取值范围一般都是[-1,1],而贴图采样出来的范围都是[0,1],所以我们要处理一下,把采样结果乘2减1。下面简述一下我们要怎么使用法线贴图,首先我们要知道每个顶点的切线方向(u的偏导方向),...

2018-12-22 20:05:32 1293

原创 [DirectX12学习笔记] Cube Mapping

Cube MappingCube Mapping简介Cube Map是用6张贴图存一个正方体上的贴图,存的时候是跟坐标轴对其的,index的0~5分别对应+X,-X,+Y,-Y,+Z,-Z,然后采样不再用uv,而使用一个三维矢量v,v的长度无所谓,v无限延长的射线与正方体的交点就是采样位置,注意v如果要采样的话需要变换到和cube map同一个空间里来,因为cube map是和坐标轴对齐的,...

2018-12-22 15:07:51 1667

原创 [DirectX12学习笔记] 鼠标点选

实现鼠标点选功能检测方法有的时候,我们要检测鼠标在屏幕上选中了哪个三维物体,很多3d建模软件之类的软件里面有这种功能,一般做法是用一条射线找出相交的最近的物体。首先我们需要得到直线的方程式,假如我们知道屏幕上鼠标选中的像素点的位置sx和sy,这是两个整数坐标,然后知道视锥的宽高比r和fov角度alpha,宽和高w和h,那么投影空间里的直线方程如下然后我们知道投影矩阵的P00和P11...

2018-12-21 19:56:51 529

原创 [DirectX12学习笔记] Instancing/视锥裁剪

这篇文章讲的也是两部分内容,一部分是讲如何将一个对一个在场景中重复出现很多次的物体做优化,我们希望尽可能合并一些重复运行的代码,然后第二部分讲的是视锥裁剪,也就是在cpu上做一下检测,将不在视锥内的物体舍弃,不提交给gpu。因为提交给gpu之后gpu还是要运行顶点着色器、几何着色器等,直到裁剪阶段才会将其舍弃掉,这部分的代码就白运行了,不如一开始就不提交给gpu。Instancing为什么...

2018-12-21 01:26:24 1434

原创 [DirectX12学习笔记] 曲面细分

硬件曲面细分曲面细分阶段曲面细分包含三个阶段,夹在VS和GS之间,如图如果要用硬件曲面细分,那么顶点着色器输出就不再是顶点,而是control point的patch,一个patch包含多个control point,VS输出patch给HS用,这就要一种新的拓扑类型,如下D3D_PRIMITIVE_TOPOLOGY_1_CONTROL_POINT_PATCHLIST = 33,D3...

2018-12-14 15:58:43 1708

原创 [DirectX12学习笔记] 计算着色器

用计算着色器实现高斯模糊计算着色器简介计算着色器在渲染管线中的位置可以这么理解GPU的并行执行能力非常强,非常适合安排多线程任务,英伟达的硬件现在是一个warp包含32个线程,ATI的则是一个wavefront包含64个线程,所以为了均匀分配任务,我们写程序的时候开的线程数最好是32和64的倍数,也就是64的倍数。在compute shader里线程会分成很多个组,每个thread g...

2018-12-13 00:20:30 1528

原创 [DirectX12学习笔记] 几何着色器

用几何着色器实现Billboard几何着色器简介几何着色器的一般形式如下[maxvertexcount(N)]void ShaderName (PrimitiveType InputVertexType InputName [NumElements],inout StreamOutputObject<OutputVertexType> OutputName){// G...

2018-12-11 17:39:28 1158

原创 [DirectX12学习笔记] 模板缓冲

实现镜子与平面阴影Depth/Stencil State每帧渲染开始前我们都应该清除depth和stencil buffer到我们指定的值,例如mCommandList->ClearDepthStencilView(DepthStencilView(), D3D12_CLEAR_FLAG_DEPTH | D3D12_CLEAR_FLAG_STENCIL, 1.0f, 0, 0, nu...

2018-12-10 17:12:42 820

原创 [DirectX12学习笔记] 混合

在场景里加入透明效果和雾效混合状态混合遵循以下等式其中CCC是最终得到的颜色,CsrcC_{src}Csrc​是新来到的fragment的颜色,CdstC_{dst}Cdst​是back buffer里已有的像素的颜色,FdstF_{dst}Fdst​和FsrcF_{src}Fsrc​是两个系数,两个乘是component wise的乘法,中间的运算符号可以由我们规定。Alpha通道也...

2018-12-09 16:21:52 756

原创 [DirectX12学习笔记] 纹理采样

将漫反射贴图应用到场景里纹理DX12里纹理的格式有以下这些纹理一般用DDS格式,如果不是DDS可以用微软的texconv工具转换成dds,dds支持mipmap等所以适合在游戏里用,载入dds贴图用DirectX::CreateDDSTextureFromFile12接口,示例代码如下struct Texture{ // Unique material name for looku...

2018-12-08 16:10:21 2075

原创 [DirectX12学习笔记] 光照

最基础的几种光照原理及实现法线变换由于要实现光照了,法线也要变换到世界坐标里来做运算,但是法线是不能直接乘一个world矩阵来变换的,因为如果这个world矩阵包含了各向不统一的缩放,法线就不会再垂直于表面了。如图,我们要的是c而不是b,如果要变换后依然垂直,应该不是直接乘世界矩阵,而是乘世界矩阵的逆转置。而且有一点要注意的是,逆转置矩阵不能随便乘其他矩阵,除非把矩阵里的translat...

2018-12-06 20:06:33 676

原创 [DirectX12学习笔记] 用Direct3D绘图 Part.2

用DX12画一些基础形状Frame Resource之前做的都是每一帧都flush掉command list,但是这样的话效率很低,我们希望在gpu工作的时候cpu能够接着发下一帧的命令,但是由于command allocator如果被reset掉的话gpu就找不到当前帧需要的资源了,所以每一帧要有自己的command list allocator、自己的constant buffer和一个...

2018-12-04 17:26:34 1212

原创 [DirectX12学习笔记] 用Direct3D绘图 Part.1

用DX12画一个BOX顶点与输入可以这样定义顶点struct Vertex{ XMFLOAT3 Pos; XMFLOAT4 Color;};需要定义D3D12_INPUT_LAYOUT_DESC来把D3D12_INPUT_ELEMENT_DESC绑定到PSO。typedef struct D3D12_INPUT_LAYOUT_DESC { _Fie...

2018-11-18 16:52:02 1582 1

原创 [DirectX12学习笔记] 渲染管线

渲染管线因为很多英文强行翻译过来有点怪怪的(比如Normalized Device Coordinates翻译成归一化的设备坐标)或者翻译过来可能会有点不规范,所以以后有些部分直接英文写了。渲染管线的示意图如下Input Assembler Stage顶点存在绑定到渲染管线的vertex buffer里,顶点的拓扑关系有很多种,最常用的是D3D_PRIMITIVE_TOPOLOGY...

2018-11-14 23:02:37 1346

原创 [DirectX12学习笔记] 初始化

初始化过程初始化DirectX 3D的过程可以分为9步。1.创建ID3D12Device2.创建ID3D12Fence并查找descriptor的大小3.查询4X MSAA支持的的quality level4.创建一个command queue、command list allocator和主要的command list5.创建swap chain6.创建描述符堆7.指定back...

2018-11-12 19:16:42 1527

原创 [DirectX12学习笔记] 序言

初始化DirectX

2018-11-12 19:16:18 870

3ds max动画师工具

3ds max的一个动画插件,可以用来k布料、飘带效果,直接拖进max即可使用。

2019-01-25

空空如也

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

TA关注的人

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