2. DirectX11龙书 学习笔记
文章平均质量分 70
梦幻DUO
游戏开发爱好者
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
DirectX11 Tessellation曲面细分实现动态增加模型细节
DirectX11新增了一个非常吸引人的新技术,就是曲面细分。曲面细分技术可以通过产生新的顶点模拟出更平滑的曲面。下图是《古墓丽影9中》没有开启曲面的效果,可以看到人物模型轮廓比较僵硬,这是因为原模型的三角形面数较低造成的: 开启了曲面细分后,看到人物模型轮廓已经相当平滑了,使得游戏画面更加真实: 那为什么不直接在原模型中增加模型面数呢? 原因有如下三点:动态LOD(levels of de原创 2017-08-14 15:40:45 · 6260 阅读 · 2 评论 -
DirectX11 地形水波纹理示例Demo
地形纹理演示程序1. 地形纹理Demo介绍在本例中,我们要为地形和水体添加纹理。首先,我们要在地形上平铺一幅草地纹理。 由于地形网格很大,如果我们直接拉伸纹理,那么每个三角形只能得到很少的几个纹理元素。换句话说,这里无法为表面提供足够高的纹理分辨率;我们会受到倍增问题的影响。所以,我们要在地面网格上平铺草地纹理,进而获得较高的分辨率。其次,我们要通过一个时间函数对水体纹理进行平移,使水体显得更真实一原创 2015-10-04 00:05:28 · 2090 阅读 · 0 评论 -
DirectX11 聚光灯
聚光灯1. 什么是聚光灯?在现实生活中,最常见的聚光灯是手电筒。本质上,聚光灯由一个位置Q、一个方向向量d和一个圆锥体光照区域来描述(参见下图)。 (聚光灯由一个位置Q、一个方向向量d和一个半角角度为ϕmax的圆锥体照区域来描述。)当实现一个聚光灯时,我们开始所做的事情与点光相同。光照向量可以由以下公式描述: 其中,P是接收照的点的位置,Q是聚光灯的位置。从图中可以看到,当且仅当, −L与d之原创 2015-10-03 09:47:37 · 1488 阅读 · 0 评论 -
DirectX11 平行光
平行光1. 什么是平行光?平行光(或方向光)用于模拟距离很远的光源,它产生的入射光是相互平行的(下图)。 平行光由一个描述线传播方向的向量来表示。因为它产生的线是平行的,所以所有光线都使用相同的方向向量。光照向量与平行光的传播方向相反。在现实生活中,最常见的平行光源是太阳(参见下图)。 2. 平行光的光照方程表示用于平行光的光照方程就是之前介绍过的三种光线组成的简单相加:原创 2015-10-03 09:15:45 · 1041 阅读 · 0 评论 -
DirectX11 指定材质
指定材质1. 如何指定材质的值?表面上的材质有可能会发生变化;也就是说,表面上不同的点可能会有不同的材质值。例如,一个轿车模型的车身、窗户、灯和轮胎反射和吸收光线的能力是不一样的,所以轿车表面的材质值也应该不一样。 (将轿车网格分为5个材质属性组)要模拟材质值的不同,一种方法是在顶点级别上定义材质值。这些材质值会在三角形表面进行线性插值,使三角形网格的每个表面点都拥有材质值。但是,从第6章中的原创 2015-10-03 09:09:56 · 1281 阅读 · 0 评论 -
DirectX11 Direct3D初始化
Direct3D初始化 1. Direct3D初始化步骤 下面将讲解如何初始化Direct3D。我们将Direct3D的初始化过程分为如下几个步骤:1.使用D3D11CreateDevice方法创建ID3D11Device和ID3D11DeviceContext。 2.使用ID3D11Device::CheckMultisampleQualityLevels方法检测设备支持的4X多重采样质量等原创 2015-09-27 22:03:30 · 4969 阅读 · 2 评论 -
DirectX11 Direct3D基本概念
Direct3D基本概念 1. Direct3D概述 Direct3D是一种底层绘图API(application programming interface,应用程序接口),它可以让我们可以通过3D硬件加速绘制3D世界。从本质上讲,Direct3D提供的是一组软件接口,我们可以通过这组接口来控制绘图硬件。例如,要命令绘图设备清空渲染目标(例如屏幕),我们可以调用Direct3D的ID3D11D原创 2015-09-27 19:58:53 · 10046 阅读 · 0 评论 -
DirectX11 HLSL常量缓存
常量缓存 在上一节的顶点着色器示例中包含如下代码:cbuffer cbPerObject{ float4x4 gWorldViewProj;};这段代码定义了一个称为cbPerObject的cbuffer对象(constant buffer,常量缓冲)。常量缓冲只是一个用于存储各种变量的数据块,这些变量可以由着色器来访问。在本例中,常量缓冲区只存储了一个称为gWorldViewProj原创 2015-09-30 09:11:07 · 2759 阅读 · 0 评论 -
DirectX11 输入装配阶段
输入装配阶段输入装配(Input Assembler,简称IA)阶段从内存读取几何数据(顶点和索引)并将这些数据组合为几何图元(例如,三角形、直线)。(索引将在随后的小节中讲解。简单地说,索引规定了顶点的组织形式,解释了该以何种方式组成图元。)1. 顶点从数学上讲,三角形的顶点位于两条边相交的位置上;而直线的顶点是端点。对于一个单个点来说,点本身就是顶点。下图说明了顶点的几何图形。 (图5.1原创 2015-09-29 17:21:43 · 2299 阅读 · 1 评论 -
DirectX11 模板
模板1. 什么是模板?前面的博文已经介绍过深度的概念,所以这里只解释模板的概念。模板缓冲区(stencil buffer)是一种用来实现特殊效果的离屏(off-screen)缓冲区。模板缓冲的大小与后台缓冲及深度缓冲的大小相同,也就是说,模板缓冲的第ij个像素对应于后台缓冲和深度缓冲第ij个像素。我们在4.1.5节的“注意”中提到,当指定一个模板缓冲时,它总是与深度缓冲共享相同的内存空间。尤如名字所原创 2015-10-04 12:14:40 · 1481 阅读 · 1 评论 -
DirectX11 Alpha通道
Alpha通道1. 漫反射贴图控制Alpha通道在RGB混合中,源alpha分量可以用来控制透明度。混合方程中的源颜色来自于像素着色器。我们会在最后一章中看到,我们将漫反射材质的alpha值作为像素着色器的alpha输出。也就是说,漫反射贴图的alpha通道可以用来控制透明度。float4 PS(VertexOUT pin) : SV_Target{ … // 从漫反射材质和纹理中原创 2015-10-04 11:15:38 · 1683 阅读 · 0 评论 -
DirectX11 板条箱示例Demo
板条箱Demo1. 指定贴图坐标GeometryGenerator::CreateBox产生箱子的贴图坐标,使得整个贴图图像都映射到箱子的每一面。为了简便起见,我们只显示前面、后面和顶面。注意这里我们省略了顶点结构的法线和切线向量的坐标。void GeometryGe ne rator::Cre ateBox(float width, float height, float depth, Mesh原创 2015-10-03 22:45:22 · 2145 阅读 · 0 评论 -
DirectX11 纹理采样
纹理采样1. HLSL纹理采样表示我们知道,Texture2D对象用于在effect文件中表示纹理。不过,还有一种与纹理相关的SamplerState(采样器)对象。它用于描述如何使用过滤器访问纹理资源。下面是它的一些例子:// 在倍增、缩减、多级渐进纹理上使用线性过滤。SamplerState mySampler0{ Filter = MIN_MAG_MIP_LINEAR;};//原创 2015-10-03 20:42:51 · 2559 阅读 · 0 评论 -
DirectX11 纹理坐标
纹理坐标1. 纹理坐标是什么?Direct3D的纹理坐标系由表示图像水平方向的u轴和表示图像垂直方向的v轴组成。坐标(u,v)指定了纹理上的一个元素,我们将该元素称为纹理元素(texel,译者注:texel是texture element的缩写),其中0≤u,v≤1。注意,v轴的正方向是“垂直向下”的(参见图8.2)。另外,将规范化坐标区间设为[0,1],是因为这样可以使 Direct3D拥有一个独原创 2015-10-03 18:59:00 · 3334 阅读 · 0 评论 -
DirectX11 HLSL打包(packing)格式和“pad”变量的必要性
“pad”变量的必要性和打包(packing)格式1. C++复制缓存定义了HLSL结构体后,我们就可以像以下代码一样初始化常量缓冲:cbuffer cbPerFrame{ DirectionalLight gDirLight; PointLight gPointLight; SpotLight gSpotLight; float3 gEyePosW;};在应用程原创 2015-10-03 11:42:23 · 1607 阅读 · 0 评论 -
DirectX11 镜面光
镜面光 1. 什么是镜面光? 考虑下图所示的光滑表面。当灯照射在这样一个表面上时,光线会在一个由反射系数描述的圆锥体区域内形成锐利的反射;我们将这种反射称为镜面高光反射(specular reflection,或直译为镜面反射)。与漫反射不同,高光可能不会传入眼睛,因为它只在一个特定的方向上反射;高光的计算过程与观察点的位置相关。也就是说,当场景中的观察点位置发生变化时,我们看到的高光强度也会跟原创 2015-10-03 08:46:16 · 1317 阅读 · 0 评论 -
DirectX11 创建混合状态
创建混合状态1. 如何在DirectX11中创建混合状态?我们已经讨论了混合运算符和混合系数,但是还没有说该如何在Direct3D中使用些值。这些混合参数要通过ID3D11BlendState接口来控制。 我们可以通过填充一个D3D11_BLEND_DESC结构体并调用ID3D11Device::CreateBlendState方法来创建该接口:HRESULT ID3D11Device::Crea原创 2015-10-04 10:15:55 · 2454 阅读 · 0 评论 -
DirectX11 深度/模板状态
深度/模板状态1. 深度/模板描述当创建ID3D11DepthStencilState接口时,第一步是要填充一个D3D11_DEPTH_STENCIL_DESC实例:typedef struct D3D11_DEPTH_STENCIL_DESC{ BOOL DepthEnable;//默认True // 默认:D3D11_DEPTH_WRITE_MASK_ALL D3D11_D原创 2015-10-04 12:47:39 · 3186 阅读 · 0 评论 -
DirectX11 使用计算着色器实现高斯模糊
高斯模糊,是一种使画面产生朦胧感的技术。在游戏中也可以可以经常看见使用高斯模糊的技术:(《赛达尔传说:荒野之息》中对游戏背景使用高斯模糊,就将我们的主角们与背景分离出来,形成了前景、背景两个层面)这节我们就来学习下如何使用DirectX11的计算着色器来实现高斯模糊。一、计算着色器(Compute Shader)如下图所示,计算着色器不属于渲染管线的一部分,但是计算着色器可以读写渲染管线。计算着色器原创 2017-08-13 22:43:34 · 3508 阅读 · 0 评论 -
DirectX11 使用Cube Mapping 立方体环境贴图实现天空、物体反射效果
这一章中,我们将学习使用立方体环境贴图(Cube Mapping)实现天空环境、模型反射效果。在《赛达尔传说:荒野之息》中,明朗或阴暗的天空都可以通过Cube Mapping来实现: (图为《赛达尔传说:荒野之息》游戏截图)一、使用Cube Map实现天空效果立方体环境贴图是一个数组纹理,用于模拟全包围的环境,类似带有6个面的正方体,因而称为 Cube Map。实际上打开dds文件后,只是一组原创 2017-08-20 18:29:06 · 7164 阅读 · 1 评论 -
DirectX11 使用几何着色器实现公告板效果
之前说过,可编程的着色器阶段有三个,依次是顶点着色器、几何着色器、像素着色器。之前说的都是顶点着色器和像素着色器,今天第一次详细介绍几何着色器,几何着色器是一个可选的阶段。一、使用几何着色器的好处 不像顶点着色器那样,输入一个顶点必须输出一个顶点。在几何着色器中,最大的好处是,你可以创建或销毁顶点,实现一些有趣的效果。例如在本例中,输入公告板的中心顶点,可以扩展出四个边框角顶点(两个三角形)。注意原创 2017-08-12 18:03:15 · 2105 阅读 · 0 评论 -
DirectX11 使用Instancing技术提高重复模型的绘制效率
在游戏场景中,经常需要我们绘制大量相同的模型,比如英雄联盟中,战场上的小兵可以达到非常多的数量。(图为英雄联盟游戏截图)如果我们用以前的方法绘制,一个模型draw call一次,那么就会造成巨大的性能损耗。因为每次数据从内存传入显存都需要不少时间;而且每次draw call需要CPU和GPU进行周期同步,会导致CPU或GPU在等待;每次传入顶点数据后,都需要走一遍渲染管线,上下文也要进行切换等等。如原创 2017-08-17 11:37:57 · 4480 阅读 · 0 评论 -
学习、解决问题的奇招——看Demo
这两天遇到一个问题:使用中文输入法的时候DirectX程序总是很卡,然后自己谷歌也找不到简洁快速的方法(谷歌上说是自绘输入法),自己调试也只是找到输入法敲拼音的时候输入法渲染居然会跟DirectX程序渲染挂钩。折腾了一天多都百思不得其解。。。 还好想到了找下其它的DirectX Demo来看,在它们的程序里面竟然输入法很流畅!这是为啥呢?然后根据之前的调试和谷歌的知识,稍加思考,我马上看到了Dem原创 2017-02-19 17:29:52 · 1055 阅读 · 0 评论 -
DirectX11 平面镜像的实现
平面镜像的实现在自然界中有许多物体的表面都非常光滑,可以像镜子一样反射周围的物体。本节介绍了如何在3D应用程序中模拟镜像效果。为简单起见,我们降低了任务难度,只在平面上实现镜像效果。例如,一辆光滑的汽车可以反射周围的物体;但是,车身是一个平滑曲面,而非平面。我们不选择这样的物体。我们将在光滑的大理石地板或挂在墙上的镜子中渲染物体的映像——换句话说,我们只实现平面上的镜像效果。要在程序中实现镜像效果,原创 2015-10-04 19:58:31 · 3522 阅读 · 2 评论 -
DirectX11 混合例子
混合例子1. 屏蔽颜色写入假设我们希望原始目标像素保持不变,即不被任何其他数值覆盖,也不与当前的光栅化源像素进行混合。当我们希望屏蔽后台缓冲区、只向深度/模板缓冲区写入数据时,该算法非常有用。要实现这一算法,可将源像素混合系数设为D3D11_BLEND_ZERO,目标混合系数设为D3D11_BLEND_ONE,混合运算符设为D3D11_BLEND_OP_ADD。使用一方案,混合方程可简化为:还有一种原创 2015-10-04 11:03:33 · 1527 阅读 · 0 评论 -
DirectX11 把纹理作为材质
把纹理作为材质1. 将纹理整合到我们的材质/光照系统?要将纹理整合到我们的材质/光照系统中,通常可以将环境光和漫反射光项调制到纹理颜色上,但不需要包括高光项(这常常被称为“后期添加调制,modulate with late add”)。// Modulate with late add.litColor = texColor*(ambient + diffuse) + spec;上述操作给每个像素原创 2015-10-03 20:51:35 · 1322 阅读 · 0 评论 -
DirectX11 过滤器
DirectX11 过滤器1. 倍增(magnification)现象纹理贴图元素应该被视为在一个连续图像上的离散颜色采样;不应该被视为矩形区域。那么问题是:当我们指定的纹理坐标(u,v)与任何一个纹理元素点都不对应时会产生什么结果?这一问题会发生在如下情景中:当观察点离场景中的一面墙很近时,墙会被放大,以至于会盖住整个屏幕。如果显示器的分辨率为1024×1024,墙体纹理的分辨率为256×256,原创 2015-10-03 20:27:51 · 1202 阅读 · 0 评论 -
DirectX11 像素着色器
像素着色器 5.10.3节说过,由顶点着色器(或几何着色器)输出的顶点属性都已经过了插值处理。这些插值随后会作为像素着色器(pixel shader)的输入数据传入像素着色器。假设这里没有几何着色器,图6.5说明了目前顶点数据的流动过程。D3D11_INPUT_ELEMENT_DESC数组为每个顶点元素指定了一个关联语义,而顶点着色器的每个参数都有一个附加语义。这些语义描述了顶点元素和顶点着色器参原创 2015-09-30 09:25:05 · 2478 阅读 · 0 评论 -
DirectX11 寻址模式
寻址模式1. 寻址模式是什么?有哪几种?纹理必须与常量插值或线性插值一起使用以形成一个向量值函数T(u,v) = (r,g,b,a)。也就是,当给定一个纹理坐标(u,v)∈[0,1]2时,纹理函数T返回颜色(r,g,b,a)。Direct3D允许我们以4种不同的方式扩展该函数的值域(称为寻址模式):重复(wrap)、边框颜色(border color)、截取(clamp)和镜像(mirror)。2.原创 2015-10-03 23:12:07 · 1644 阅读 · 0 评论 -
DirectX11 创建和启用纹理
创建和启用纹理1. 创建纹理步骤纹理数据通常是存储在磁盘上的图像文件。我们需要将它读取出来,并载入到一个ID3D11Texture2D对象中(参见D3DX11CreateTextureFromFile)。不过,纹理资源是不能被直接绑定到渲染管线上的;我们需要为纹理创建一个着色器资源视图(ID3D11ShaderResourceView),然后将视图绑定到管线上。这个过程可分为两步:1.调用D3DX1原创 2015-10-03 19:36:09 · 7750 阅读 · 0 评论 -
DirectX11 点光
点光1. 什么是点光?在现实生活中,最常见的点光源是灯泡;它可以向各个方向发射光线(参见下图)。对于任意一点P,都有一条从点光位置Q射向点P的线。通常,光照向量与点光的传播方向相反;也就是,该方向从点P指向点光源Q。本质上,点光和平行光之间的唯一区别是光照向量的计算方式——点光会随着点的位置而变化,而平行光会保持为一个常量。 (点光向各个方向发射光线;对于任意一点P,都有一条从点光源Q射向点P的线原创 2015-10-03 09:29:07 · 974 阅读 · 0 评论 -
DirectX11 XNA数学库之矩阵
XNA数学库之矩阵 1. XNA数学库之矩阵介绍 跟XNA向量一样为了使用SSE2优化指令,XNA矩阵XMMATRIX的实现使用了四个向量。2. 矩阵类型 XMMATRIX的定义如下://Matrix type: Sixteen 32 bit floating point components aligned on a // 16 byte boundary and map原创 2015-09-27 19:06:06 · 1651 阅读 · 0 评论 -
DirectX11 三种光照组成对比
三种光照模型对比1. 光源分类:在我们的模型中,光源可以发射3种不同类型的线:1.环境光(ambient light):模拟间接光照。2.漫反射光(diffuse light):模拟对粗糙表面的直接照。3.高光(specular light):模拟对光滑表面的直接光照。2. 材质分类:同样,物体表面有以下材质属性与其对应:1.环境材质:平面反射和吸收的环境光的总量。2.漫反射材质:平面反射和吸收的漫原创 2015-10-03 08:56:09 · 1351 阅读 · 0 评论 -
DirectX11 兰伯特余弦定理(Lambert)
兰伯特余弦定理(Lambert) 1. 关于光照强烈度的思考 垂直照向平面的线比从侧面照向平面的线更加强烈(见下图)。 假设有一块很小的区域dA。当法线向量n与光照向量L平行时,区域dA受到的光线照射最多。随着n和L之间的夹角θ逐渐增大,区域dA受到的光线照射量会越来越少 (因为很多光线都无法照射到dA表面上了)。2. 推导兰伯特(Lambert)余弦定理 们可以从这个概念中推导出一个函原创 2015-10-02 23:03:06 · 6134 阅读 · 0 评论 -
DirectX11 顶点着色器阶段
顶点着色器阶段 1. 顶点着色器阶段完成什么工作? 在完成图元装配后,顶点将被送往顶点着色器(vertex shader)阶段。顶点着色器可以被看成是一个以顶点作为输入输出数据的函数。每个将要绘制的顶点都会通过顶点着色器推送至硬件;实际上,我们可以概念性地认为在硬件上执行了如下代码:for(UINT i = 0; i < numVertices; ++i) outputVertex[i]原创 2015-09-29 21:28:50 · 1429 阅读 · 0 评论 -
DirectX11 几何着色器阶段
几何着色器阶段 1. 几何着色器阶段有什么功能? 几何着色器阶段(geometry shader stage)是可选的,我们在第11章之前不会用到它,所以这里只做一个简短的概述。几何着色器以完整的图元作为输入数据。例如,当我们绘制三角形列表时,输入到几何着色器的数据是构成三角形的三个点。(注意,这三个点是从顶点着色器传递过来的。)几何着色器的主要优势是它可以创建或销毁几何体。例如,输入图元可以被原创 2015-09-29 21:53:29 · 1680 阅读 · 0 评论 -
DirectX11 顶点和顶点布局
顶点和顶点布局 1. 如何描述顶点? 5.5.1节已经讲过,在Direct3D中,顶点由空间位置和各种附加属性组成,Direct3D可以让我们灵活地建立属于我们自己的顶点格式;换句话说,它允许我们定义顶点的分量。要创建一个自定义的顶点格式,我们必须先创建一个包含顶点数据的结构体。例如,下面是两种不同类型的顶点格式;一个由位置和颜色组成,另一个由位置、法线和纹理坐标组成。struct Vertex原创 2015-09-29 22:57:26 · 4414 阅读 · 1 评论 -
DirectX11 顶点着色器示例
顶点着色器示例 下面是一个顶点着色器的示例,它的代码非常简单:cbuffer cbPerObject{ float4x4 gWVP;};void VS(float3 iPosL : POSITION, float4 iColor : COLOR, out float4 oPosH : SV_POSITION, out float4 oColor : COLOR)原创 2015-09-30 09:03:52 · 2569 阅读 · 1 评论 -
DirectX11 索引缓存
索引缓存1. 索引缓存如何创建?由于索引要由GPU访问,所以它们必须放在一个特定的资源容器中,该容器称为索引缓冲(index buffer)。创建索引缓冲的过程与创建顶点缓冲的过程非常相似,只不过索引缓冲存储的是索引而非顶点。所以,这里不再赘述之前讨论过的内容,我们直接给出一个创建索引缓冲区的示例:UINT indices [24] = { 0, 1, 2, // Triangle原创 2015-09-30 08:51:56 · 1879 阅读 · 0 评论 -
DirectX11 Effects
Effects 1. 什么是Effects? effect框架是一组用于管理着色器程序和渲染状态的工具代码。例如,你可能会使用不同的effect绘制水、云、金属物体和动画角色。每个effect至少要由一个顶点着色器、一个像素着色器和渲染状态组成。在Direct3D 11中,effects框架已从D3DX库中移除,你必须包含一个单独的头文件(d3dx11Effect.h),链接一个单独的库文件(D原创 2015-10-01 18:22:32 · 2540 阅读 · 0 评论
分享