- 博客(47)
- 资源 (6)
- 收藏
- 关注
原创 DirectX11 渲染状态
渲染状态 1. 渲染状态有哪几种? 从本质上讲,Direct3D是一个状态机(state machine)。在我们改变它的状态之前,驻留在状态机内的当前状态是不会改变的。例如,我们在6.1节、6.2节和6.3节中看到,当顶点缓冲和索引缓冲绑定到管线的输入装配阶段时,如果我们不绑定其他缓冲,那么它们就会一直驻留在那里;同样,在没有改变图元拓扑之前,当前的图元拓扑设置会一直有效。另外,Direct3
2015-09-30 09:39:34 2573
原创 DirectX11 像素着色器
像素着色器 5.10.3节说过,由顶点着色器(或几何着色器)输出的顶点属性都已经过了插值处理。这些插值随后会作为像素着色器(pixel shader)的输入数据传入像素着色器。假设这里没有几何着色器,图6.5说明了目前顶点数据的流动过程。D3D11_INPUT_ELEMENT_DESC数组为每个顶点元素指定了一个关联语义,而顶点着色器的每个参数都有一个附加语义。这些语义描述了顶点元素和顶点着色器参
2015-09-30 09:25:05 2312
原创 DirectX11 HLSL常量缓存
常量缓存 在上一节的顶点着色器示例中包含如下代码:cbuffer cbPerObject{ float4x4 gWorldViewProj;};这段代码定义了一个称为cbPerObject的cbuffer对象(constant buffer,常量缓冲)。常量缓冲只是一个用于存储各种变量的数据块,这些变量可以由着色器来访问。在本例中,常量缓冲区只存储了一个称为gWorldViewProj
2015-09-30 09:11:07 2600
原创 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 2444 1
原创 DirectX11 索引缓存
索引缓存1. 索引缓存如何创建?由于索引要由GPU访问,所以它们必须放在一个特定的资源容器中,该容器称为索引缓冲(index buffer)。创建索引缓冲的过程与创建顶点缓冲的过程非常相似,只不过索引缓冲存储的是索引而非顶点。所以,这里不再赘述之前讨论过的内容,我们直接给出一个创建索引缓冲区的示例:UINT indices [24] = { 0, 1, 2, // Triangle
2015-09-30 08:51:56 1783
原创 DirectX11 顶点缓存
为了让GPU访问顶点数组,我们必须把它放置在一个称为缓冲(buffer)的特殊资源容器中,该容器由ID3D11Buffer接口表示。用于存储顶点的缓冲区称为顶点缓冲(vertex buffer)。Direct3D缓冲不仅可以存储数据,而且还说明了如何访问数据以及数据被绑定到图形管线的那个阶段。要创建一个顶点缓冲,我们必须执行以下步骤:1.填写一个D3D11_BUFFER_DESC结构体,描述我们所要
2015-09-29 23:22:08 5583
原创 DirectX11 顶点和顶点布局
顶点和顶点布局 1. 如何描述顶点? 5.5.1节已经讲过,在Direct3D中,顶点由空间位置和各种附加属性组成,Direct3D可以让我们灵活地建立属于我们自己的顶点格式;换句话说,它允许我们定义顶点的分量。要创建一个自定义的顶点格式,我们必须先创建一个包含顶点数据的结构体。例如,下面是两种不同类型的顶点格式;一个由位置和颜色组成,另一个由位置、法线和纹理坐标组成。struct Vertex
2015-09-29 22:57:26 4134 1
原创 DirectX11 几何着色器阶段
几何着色器阶段 1. 几何着色器阶段有什么功能? 几何着色器阶段(geometry shader stage)是可选的,我们在第11章之前不会用到它,所以这里只做一个简短的概述。几何着色器以完整的图元作为输入数据。例如,当我们绘制三角形列表时,输入到几何着色器的数据是构成三角形的三个点。(注意,这三个点是从顶点着色器传递过来的。)几何着色器的主要优势是它可以创建或销毁几何体。例如,输入图元可以被
2015-09-29 21:53:29 1574
原创 DirectX11 曲面细分阶段
曲面细分阶段 计算机不能直接生成曲线,当然更不能直接生成曲面。我们在计算机屏幕上看到的曲线、曲面实际上是由无数个多边形构成的。当然多边形越多,那么曲面就会展现的更为真实。在之前,这项工作都是由CPU完成的,但是CPU是通用处理器,几何运算性能有限,不能无限制的增加多边形数量。这也是我们在一些游戏中看到人的脸“棱角分明”的缘故。 Tessellation技术,便是一种化繁为简的手段,简单的理解,便
2015-09-29 21:48:38 1604
原创 DirectX11 顶点着色器阶段
顶点着色器阶段 1. 顶点着色器阶段完成什么工作? 在完成图元装配后,顶点将被送往顶点着色器(vertex shader)阶段。顶点着色器可以被看成是一个以顶点作为输入输出数据的函数。每个将要绘制的顶点都会通过顶点着色器推送至硬件;实际上,我们可以概念性地认为在硬件上执行了如下代码:for(UINT i = 0; i < numVertices; ++i) outputVertex[i]
2015-09-29 21:28:50 1314
原创 DirectX11 输入装配阶段
输入装配阶段输入装配(Input Assembler,简称IA)阶段从内存读取几何数据(顶点和索引)并将这些数据组合为几何图元(例如,三角形、直线)。(索引将在随后的小节中讲解。简单地说,索引规定了顶点的组织形式,解释了该以何种方式组成图元。)1. 顶点从数学上讲,三角形的顶点位于两条边相交的位置上;而直线的顶点是端点。对于一个单个点来说,点本身就是顶点。下图说明了顶点的几何图形。 (图5.1
2015-09-29 17:21:43 2168 1
原创 DirectX11 基本计算机颜色
基本计算机颜色 1. 128位颜色 通常,在颜色中会包含一个附加的颜色分量,叫做alpha分量。alpha分量用于表示颜色的不透明度,我们会在第9章“混合”中使用alpha分量。(由于我们目前还用不到混合,所以现在暂且将alpha分量设置为1。)包含alpha分量意味着我们要使用4D向量(r,g,b,a)来表示颜色,其中0≤r,g,b,a≤1。要表示一个128位颜色(每个向量分量就是一个32位的
2015-09-29 16:44:04 1258
原创 DirectX11 调试Direct3D应用程序
调试Direct3D应用程序 1. 如何调试Direct3D应用程序? 我们实现了一个宏,用它来检查许多Direct3D函数返回的HRESULT值。这个宏定义在d3dUtil.h文件中:#if defined(DEBUG) | defined(_DEBUG) #ifndef HR #define HR(x)
2015-09-29 13:55:13 2004
原创 DirectX11 演示程序框架
演示程序框架 本书中的演示程序均使用d3dUtil.h、d3dApp.h、d3dApp.cpp文件中的代码,这些文件可以从本书网站下载。由于本书的第Ⅱ部分和第Ⅲ部分的所有演示程序都会用到些常用文件,所以我们把些文件保存在了Common目录下,使些文件被所有的工程共享,避免多次复制文件。d3dUtil.h文件包含了一些有用的工具代码,d3dApp.h和d3dApp.cpp文件包含了Direct3D
2015-09-29 13:43:09 2995
原创 算法导论 KMP字符串匹配
KMP字符串匹配 1. KMP字符串匹配的原理 Knuth-Morris-Pratt算法(简称KMP),是一种非常高效的字符串匹配。设n为文本的长度,m为待查找文本模板的长度,则预处理时间需要O(m),匹配时间需要O(n)。 1.预处理阶段。KMP字符串匹配的原理就是为待查找的字符串模板创建一个前缀函数,该前缀函数得到对于模板每一个子字符串(1~i),若有相同的长度的前缀和相同的长度的后缀的字
2015-09-28 17:14:09 1052
原创 DirectX11 计时和动画
计时和动画 要正确实现动画效果,我们就必须记录时间,尤其是要精确测量动画帧之间的时间间隔。当帧速率高时,帧之间的时间间隔就会很短;所以,我们需要一个高精确度计时器。1. 性能计时器 我们使用性能计时器(或性能计数器)来实现精确的时间测量。为了使用用于查询性能计时器的Win32函数,我们必须在代码中添加包含语句“#include__int64 currTime;QueryPerformanc
2015-09-28 13:21:17 2212
原创 DirectX11 Direct3D初始化
Direct3D初始化 1. Direct3D初始化步骤 下面将讲解如何初始化Direct3D。我们将Direct3D的初始化过程分为如下几个步骤:1.使用D3D11CreateDevice方法创建ID3D11Device和ID3D11DeviceContext。 2.使用ID3D11Device::CheckMultisampleQualityLevels方法检测设备支持的4X多重采样质量等
2015-09-27 22:03:30 4690 2
原创 DirectX11 Direct3D基本概念
Direct3D基本概念 1. Direct3D概述 Direct3D是一种底层绘图API(application programming interface,应用程序接口),它可以让我们可以通过3D硬件加速绘制3D世界。从本质上讲,Direct3D提供的是一组软件接口,我们可以通过这组接口来控制绘图硬件。例如,要命令绘图设备清空渲染目标(例如屏幕),我们可以调用Direct3D的ID3D11D
2015-09-27 19:58:53 9313
原创 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 1549
原创 DirectX11 XNA数学库之向量
XNA数学向量1. XNA数学简介之所以要使用XNA数学库,是因为XNA数学库为我们提供了SIMD指令优化,使得我们的数学计算更加快速。XNA数学库需要包含d3dx10.h头文件,不需要包含动态链接库,因为实现都是在头文件内联的。2. 向量类型如果SSE2(单指令多数据流扩展)是可用的,那么有如下向量定义:typedef __m128 XMVECTOR; __m128 是一个特殊的SIMD类型,有助
2015-09-27 18:48:44 1708
原创 图形学 图形渲染管线
图形渲染管线1. 什么是图形渲染管线?管线的主要功能是生成或渲染二维图像、三维物体、光源、着色方程式、纹理等。渲染管线是实时渲染的底层实现。下图是渲染管线的基本构成,由3个阶段组成:应用程序,几何及光栅。每一个阶段本身都有可能是一条管线,就如图所示的几何阶段;或者一个部分并行的阶段,就如图所示的光珊阶段。在图中,应用程序阶段是单一的过程,但亦有可能是管线化或并行化。 2. 应用程序阶段应用程序
2015-09-27 12:37:06 2893
原创 DirectX11 光照
光照1. 什么是光照? 游戏中的实时光照在着色器中的表现,就是光照方程在顶点着色器中进行逐顶点光照执行,而在像素着色器中表现为逐像素光照。 因为通常像素比顶点多,这些像素彼此之间十分靠近,所以在像素着色器上执行光照方程得到的光照品质会比顶点着色器上获得的更加杰出。 现在有一定数量的算法用于表现光照。通常,计算机图形学中的渲染方程是极其复杂的,数学技巧性很强,并且你还需要做一些研究,如果你开
2015-09-25 18:49:59 1314
原创 DirectX11 多重纹理
多重纹理1. 什么是多重纹理? 多重纹理效果是在一个物体表面显示 2 张纹理图像。 我们可以通过对两者的纹理图像采样,使用 color1×color2 作为最终的像素颜色值。 多重纹理是一个十分有用的技术。有时我们需要表现诸如光照贴图,阴影贴图,细节贴图等,就可以一次使用多张纹理图像来获得最终效果。2. 多重纹理如何实现? 在多重纹理 Demo 中,我们载入两张纹理图像,并且都传递给
2015-09-24 21:30:36 2217 2
原创 DirectX11 Effect特效文件
Effect特效文件1. 什么是Effect特效文件? Direct3D 中,有个 Effect 文件的概念。将所创建的着色器与这些文件捆绑在一起就是所谓的一个效果(特效)。 大多数时候,你只是结合顶点和像素着色器来创建某一行为,这叫做技术(technique)。一种技术定义了一个渲染效果,而 Effect文件就是包含很多渲染技术的文件。 例如: technique11 Colo
2015-09-24 20:57:01 3770 1
原创 DirectX11 高级着色器语言HLSL入门
高级着色器语言HLSL初步学习1. 数据类型简介 与CPU不同,在显卡芯片中,最小的数据吞吐单元是一个由32位浮点数组成的四元组。这一点很有道理不是,想想你在渲染过程中所有涉及到的数据,最复杂的不外乎四维坐标(x,y,z,w)或颜色(r,g,b,a),这样GPU可以一次性处理一个四元组。而整数什么的在显卡中被放到四元组的一个分量里使用,而很多显卡中,整数、布尔值都不被直接支持,而是转为浮点数使用
2015-09-24 18:46:20 13658 1
原创 DirectX11 深度模板视图(depth-stencil)
深度模板视图(depth/stencil)1. 什么是深度测试? 深度测试, 如我们再第二章所主意的那样,用于确保物体表面以正确的顺序来绘制和显示,而不需要进行多边形排序。 例如,如果我们有两个三角形,它们有相同的 X 和 Y 坐标,但是在 Z 轴上相差 100 个单位,那么这两个三角形并没有接触或重复,如果我们先绘制较近的三角形再绘制较远的那个,则较远的那个三角形的颜色数据将会覆盖较近靠近照相
2015-09-24 13:19:44 6356
原创 3D数学 AABB(轴对齐矩形边界框)
3D数学 AABB轴对齐矩形边界框1. 几何图元 直线:由两个向量定义直线的方向 射线:由两个向量定义直线的方向,其中一个向量定义射线的起点 球和圆 矩形边界框(AABB) 2. AABB(轴对齐矩形边界框)C++实现///////////////////////////////////////////////////////
2015-09-22 22:05:56 4057
原创 3D数学 欧拉角编程
欧拉角编程1. 欧拉角转换到矩阵 欧拉角描述了一个旋转序列。分别计算出每个旋转的矩阵再将它们连成一个矩阵,这个矩阵就代表了整个角位移。注意,要区分物体-惯性矩阵还是惯性-物体矩阵,它们互逆(也互为转置矩阵)。void RotationMatrix::setup(const EulerAngles& orientation){ //计算角度的sin和cos值 float sh,
2015-09-22 21:22:36 1583
原创 3D数学 RotationMatrix
1. 如何使用矩阵表示方位 通过列出从一个坐标系到另一个坐标系的转变矩阵来表示两个坐标系之间的关系。 例如:从物体坐标系到惯性坐标系的转变矩阵,也可以通过逆矩阵从惯性坐标系转换回物体坐标系。 示例: 我们会看一下如何用一个矩阵将一个点从一个坐标系转变到另一个坐标系。 下图使用一个矩阵将飞机从物体坐标系转换到惯性坐标系。 我们用粗黑箭头指示矩阵的每一行和物体坐标轴
2015-09-22 19:28:28 1494
原创 3D数学 方向、方位和角位移
方位、方向和角位移1. 方向与方位的区别 一个向量可以指定方向,但是不可以扭转: 扭转一个对象可以改变它的方位: 因此: 指定方向仅仅需要2个数字(例如极坐标系)。 指定方位至少需要3个数字。2. 什么是角位移 角位移不可以用绝对值(absolute terms)来表示。 就像平移一个点,需要一个已知的点(原点)。旋转一个角度,也需要一
2015-09-22 16:28:47 2042
原创 算法导论 XOR双向循环链表——内存高效链表
XOR双向循环链表——内存高效双向链表1. 算法导论原题 10.2-8 ? Explain how to implement doubly linked lists using only one pointer value x.np per item instead of the usual two(next and pre). Assume that all pointer values
2015-09-20 00:42:54 1903 4
转载 XOR Linked List – A Memory Efficient Doubly Linked List
An ordinary Doubly Linked List requires space for two address fields to store the addresses of previous and next nodes. A memory efficient version of Doubly Linked List can be created using only one sp
2015-09-19 11:10:57 831
转载 深入理解按位异或运算符
参与运算的两个值,如果两个相应bit位相同,则结果为0,否则为1。 即: 0^0 = 0, 1^0 = 1, 0^1 = 1, 1^1 = 0 按位异或的3个特点: (1) 0^0=0,0^1=1 0异或任何数=任何数 (2) 1^0=1,1^1=0 1异或任何数-任何数取反 (3) 任何数异或自己=把自己置0 按位异或的几个常
2015-09-19 10:27:48 827
原创 算法导论 O(n)时间内反转单链表
算法导论 O(n)时间内反转单链表1. 算法导论原题 Give a O(n) time nonrecursive procedure that reverses a singly linked list of n elements. The procedure should use no more than constant storage beyond that needed for thel
2015-09-18 16:45:32 1488
原创 算法导论 合并两个链表
合并两个链表1. 算法导论原题 10.2-6 The dynamic-set operation UNION takes two disjoint sets S1 and S2 as input, and it returns a set S = S1 U S2 consisting of all the elements of S1 and S2.The setsS1 andS2 are
2015-09-18 11:33:12 536
原创 算法导论 循环双链表
循环双链表1. 什么是循环双链表? 循环双链表:循环,即是首尾相连的链表。双链表,即是在原来单链表的基础上,使结点不单只能指向下一个结点,也能指向上一个结点。2. 循环双链表的基本操作(伪代码) LIST-SEARCH(L,k) x = L.headwhile x ≠NIL and x.key ≠ kx = x.nextreturn x LIST-INSERT(L
2015-09-18 10:21:26 618
原创 算法导论 循环单链表
循环单向链表1. 循环单向链表如何实现? 循环单向链表只是在单向链表的基础上使尾结点指向头结点。因为每次插入结点,新结点都是指向上一个结点当前的下一个结点。因此在单向链表的基础上,我们使头结点指向自身即可。 因此只需要在以前的博文单链表代码中的构造函数初始化的时候,加上一行代码,便做到了循环: m_pHeadNode->SetNext(m_pHeadNode);2. 实现(C++代
2015-09-18 09:26:15 507
原创 算法导论 使用单链表实现队列
使用单链表实现队列1. 算法导论原题 10.2-3 Implement a queue by a singly linked list L. The operations ENQUEUE and DEQUEUE should still take O(1) time. 译:使用两个队列实现一个队列。入队和出队的时间复杂度都应该是O(1)。2. 使用单链表实现队列 我们假设链表是
2015-09-17 23:35:10 1228
原创 算法导论 使用单链表实现栈
使用单链表实现栈1. 算法导论原题 10.2-2 Implement a stack using a singly linked list L. The operations PUSH and POP should still take O(1) time. 译:使用一个单链表实现一个栈。PUSH和POP操作仍然需要保持O(1)时间复杂度。2. 如何使用单链表实现栈? 栈的主要
2015-09-17 21:52:23 729
原创 算法导论 单链表
单链表1. 单链表是什么? 单链表是一种常见的简单数据结构,链表由很多个结点组成,每个结点有储存数据的数据域和指向下一个结点的地址。因为每个结点都有下一个结点的地址,因此通过当前结点可以找到下一个结点,将各种数据就像链子一样连接起来。相比于数组,链表的优点就是大小可以改变,删除和插入数据也不必作太大的改动,缺点是不可以随机访问(必须通过一个结点访问下一个结点来访问你想访问的结点)。2. 单链表
2015-09-17 20:02:01 635
win7 64位汇编开发环境合集
2015-12-01
DirectX11程序初始化
2015-09-28
泡泡堂 DirectX11 Demo
2015-09-06
C++实现状态驱动智能体设计——消息功能
2015-08-17
有限状态机(FSM)
2015-08-17
C++控制台网络聊天室源代码
2015-04-25
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人