DirectX12学习笔记
文章平均质量分 92
膜力鸭苏蛙可
这个作者很懒,什么都没留下…
展开
-
[DirectX12学习笔记] 序言
初始化DirectX原创 2018-11-12 19:16:18 · 894 阅读 · 0 评论 -
[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 · 861 阅读 · 0 评论 -
[DirectX12学习笔记] 鼠标点选
实现鼠标点选功能检测方法有的时候,我们要检测鼠标在屏幕上选中了哪个三维物体,很多3d建模软件之类的软件里面有这种功能,一般做法是用一条射线找出相交的最近的物体。首先我们需要得到直线的方程式,假如我们知道屏幕上鼠标选中的像素点的位置sx和sy,这是两个整数坐标,然后知道视锥的宽高比r和fov角度alpha,宽和高w和h,那么投影空间里的直线方程如下然后我们知道投影矩阵的P00和P11...原创 2018-12-21 19:56:51 · 567 阅读 · 0 评论 -
[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 · 1717 阅读 · 0 评论 -
[DirectX12学习笔记] 几何着色器
用几何着色器实现Billboard几何着色器简介几何着色器的一般形式如下[maxvertexcount(N)]void ShaderName (PrimitiveType InputVertexType InputName [NumElements],inout StreamOutputObject<OutputVertexType> OutputName){// G...原创 2018-12-11 17:39:28 · 1218 阅读 · 0 评论 -
[DirectX12学习笔记] 法线贴图
法线贴图法线贴图简介法线贴图我们都很熟悉了,法线一般是存在切线空间里的,一般来说大多数位置的法线方向都是和面方向偏差不大,所以法线贴图总是蓝蓝的,也就是对应rgb(0,0.5,0)。法线的三个维度的取值范围一般都是[-1,1],而贴图采样出来的范围都是[0,1],所以我们要处理一下,把采样结果乘2减1。下面简述一下我们要怎么使用法线贴图,首先我们要知道每个顶点的切线方向(u的偏导方向),...原创 2018-12-22 20:05:32 · 1351 阅读 · 0 评论 -
[DirectX12学习笔记] 阴影
阴影贴图阴影贴图简介要渲染场景的阴影,我们可以在渲染场景之前,先从每个光源出发渲染一遍深度缓冲,记录下被光照射的深度,再正常渲染,渲染的时候计算到光源的深度,深度大于记录下来的深度的话,就说明没有被照到,就是在阴影范围内。下面介绍基础知识,首先是正射投影。正射投影的视锥是一个长方体,所以不会有透视效果,投影矩阵如下在c++里可以这样获取正射投影矩阵 // Ortho frust...原创 2018-12-23 21:27:51 · 2766 阅读 · 1 评论 -
[DirectX12学习笔记] 环境光遮蔽
环境光遮蔽之前我们算环境光的时候都是考虑所有地方收到的环境光强度相等,直接用漫反射系数乘以环境光强度。我们取一个骷髅头模型,单独渲染环境光,不计算任何其他光照,结果如下图。这个结果显然是不对的,场景中有的地方被掩蔽的程度更大,反射光线会更难到达,而有的地方被掩蔽的程度更小,反射光线更容易到达,所以不同地方的环境光强度应该是不同的。那么我们要怎么来计算场景中的点被遮蔽的程度呢?接下来讲...原创 2018-12-24 15:41:08 · 2271 阅读 · 0 评论 -
[DirectX12学习笔记] 四元组
四元组这篇文章内容将比较偏数学,为方便快速复习,这里只列出关键的结论。四元组简介四元组类似于一个复数,有实部和虚部,只不过四元组的虚部是个矢量,因此总共有四维,一般来说我们把矢量放在前面,也就是说存在XMFLOAT4里面的时候,前三维是虚部,最后一维是实部。运算的定义乘法可以写成矩阵形式注意因为涉及叉乘,左手系和右手系里的四元组不一样。乘法和矩阵乘法一样,有结合律没有交换律。...原创 2018-12-25 11:50:47 · 1779 阅读 · 0 评论 -
[DirectX12学习笔记] 骨骼动画
骨骼动画这篇文章对应的是龙书的最后一章,里面用到的模型和动画文件格式都不是fbx,所以具体怎么读取我们不用去关心,知道怎么用就行了,格式变一下原理还是一样的。动画原理简介首先骨骼是个树状的存储结构...原创 2018-12-25 19:04:08 · 1624 阅读 · 1 评论 -
[DirectX12学习笔记] Instancing/视锥裁剪
这篇文章讲的也是两部分内容,一部分是讲如何将一个对一个在场景中重复出现很多次的物体做优化,我们希望尽可能合并一些重复运行的代码,然后第二部分讲的是视锥裁剪,也就是在cpu上做一下检测,将不在视锥内的物体舍弃,不提交给gpu。因为提交给gpu之后gpu还是要运行顶点着色器、几何着色器等,直到裁剪阶段才会将其舍弃掉,这部分的代码就白运行了,不如一开始就不提交给gpu。Instancing为什么...原创 2018-12-21 01:26:24 · 1489 阅读 · 0 评论 -
[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 · 798 阅读 · 0 评论 -
[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 · 1581 阅读 · 0 评论 -
[DirectX12学习笔记] 渲染管线
渲染管线因为很多英文强行翻译过来有点怪怪的(比如Normalized Device Coordinates翻译成归一化的设备坐标)或者翻译过来可能会有点不规范,所以以后有些部分直接英文写了。渲染管线的示意图如下Input Assembler Stage顶点存在绑定到渲染管线的vertex buffer里,顶点的拓扑关系有很多种,最常用的是D3D_PRIMITIVE_TOPOLOGY...原创 2018-11-14 23:02:37 · 1371 阅读 · 0 评论 -
[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 · 1655 阅读 · 1 评论 -
[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 · 1238 阅读 · 0 评论 -
[DirectX12学习笔记] 纹理采样
将漫反射贴图应用到场景里纹理DX12里纹理的格式有以下这些纹理一般用DDS格式,如果不是DDS可以用微软的texconv工具转换成dds,dds支持mipmap等所以适合在游戏里用,载入dds贴图用DirectX::CreateDDSTextureFromFile12接口,示例代码如下struct Texture{ // Unique material name for looku...原创 2018-12-08 16:10:21 · 2128 阅读 · 0 评论 -
[DirectX12学习笔记] 计算着色器
用计算着色器实现高斯模糊计算着色器简介计算着色器在渲染管线中的位置可以这么理解GPU的并行执行能力非常强,非常适合安排多线程任务,英伟达的硬件现在是一个warp包含32个线程,ATI的则是一个wavefront包含64个线程,所以为了均匀分配任务,我们写程序的时候开的线程数最好是32和64的倍数,也就是64的倍数。在compute shader里线程会分成很多个组,每个thread g...原创 2018-12-13 00:20:30 · 1601 阅读 · 0 评论 -
[DirectX12学习笔记] 光照
最基础的几种光照原理及实现法线变换由于要实现光照了,法线也要变换到世界坐标里来做运算,但是法线是不能直接乘一个world矩阵来变换的,因为如果这个world矩阵包含了各向不统一的缩放,法线就不会再垂直于表面了。如图,我们要的是c而不是b,如果要变换后依然垂直,应该不是直接乘世界矩阵,而是乘世界矩阵的逆转置。而且有一点要注意的是,逆转置矩阵不能随便乘其他矩阵,除非把矩阵里的translat...原创 2018-12-06 20:06:33 · 696 阅读 · 0 评论 -
[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 · 1765 阅读 · 0 评论