一个2D纹理,就是一组数据的矩阵。一个典型的2D纹理就是一张2D图片。在2D图片中,每一个元素保存着像素的颜色。1D 纹理可以认为是1为数组, 3D纹理可以认为是3维数组。
一个纹理,它是不能存储任何格式的数据的,它只能存储一个类型的格式的数据。这些类型在DXGI_FORMAT中列出来。 如:
DXGI_FORMAT_R32G32B32_FLOAT:每一个元素有3个32位的浮点型点。
DXGI_FORMAT_R16G16B16A16_UNORM:: 每一个元素有4个16位的数组成, 这些数在[0, 1] 范围内浮动。
Depth buffer 包含的是一个像素距离“物体”Z 轴(2维的Z轴, 就是向里向外)的距离, 这个距离的范围是[0.0~1.0], 0.0 表示距离物体最近。如果一个buffer他有1280×1024个像素, 那depth buffer的大小也为[1280* 1024.
Depth buffer 也是一种 纹理, 所以它就必须按一定的格式排列数据。这些格式可以为:
DXGI_FORMAT_D32_FLOAT_S8X24_UINT: 32 为浮点型depth buffer,其中8位用于stencil buffer。
DXGI_FORMAT_D32_FLOAT: 32 为的浮点型depth buffer
DXGI_FORMAT_D24_UNORM_S8_UINT: 24 位的depth buffer[0.1], 8位stencil buffer[0, 255].
渐隐技术就是将一副图像逐渐用另一副图像替换。当执行渐隐操作时,要渲染不同的图像。这是使用模板缓冲来控制将那幅图像的像素绘制到渲染表面。
Texture coordinates 就是把一张纹理图片按哪种位置映射给点。
在图形处理器中,为每一个顶点运行一次。
顶点着色是一个图形处理器(显卡)的功能, 目的是为了给D3物体证件特殊的效果。其根本目的是为一个顶点从3D坐标转换到2D坐标系(显卡, 屏幕)。顶点着色可以操纵 vertex的位置,颜色,纹理坐标。
可以给网格增加或者减少点.为几何体采集几何程序或者增加细节。这些事情对于CPU来说是太昂贵了,所以用GPU来处理,在进行几何着色之后, 被着色的物体会立即传到光栅处理器中。
也叫片段着色, 用来处理单个像素上的颜色。这个阶段的输入是光栅处理器提供的(在放到图形流水线之前)。像素着色通常用于照明, 场景中的凹凸贴图,颜色色调等相关内容。
为了防止闪烁,引入了双缓冲的概念。所谓双缓冲就是用一个buffer显示当前帧的画面(front buffer),用另一个buffer显示下一帧的画面(back buffer), 然后当要显示一下帧的时候, 切换buffer的状态, back buffer变为front buffer, font buffer 变为back buffer, 依次继续。
这个 back buffer 变为front buffer的切换过程就叫presenting, 如present(0), 就是把第一个back buffer变为front buffer。
在Direct3D 10中,用IDXGISwapChain接口来存储 front and back buffer的纹理, 这个接口也提供了操作缓冲的其他方法:ResizeBuffers(),Present().
渲染管线或者叫渲染流水线。在某种程度上可以把渲染管线比喻为工厂里面常见的各种生产流水线。渲染管线的数量一般是以 像素渲染流水线的数量×每管线的纹理单元数量 来表示。例如,GeForce 6800Ultra的渲染管线是16×1,就表示其具有16条像素渲染流水线,每管线具有1个纹理单元。
Direct3D 10.0 渲染管道的阶段:
(1) . 输入装配器阶段(IA)
为管线提供数据(三角面,线或点)
(2) . 顶点着色器阶段(VS)
输入一个顶点,执行坐标变换、蒙皮(Skinning)和光照计算,输出一个顶点。
(3). 几何着色器阶段(GS)
处理整个图元(对于三角形是三个顶点,对于线是两个顶点,对于点是一个顶点),还包括相邻图元的顶点数据(对于三角形有三个相邻三角形,即额外的三个顶点,对于线则有额外两个顶点)。支持有限的几何放大和缩小。输入一个图元,GS可能丢弃该图元或输出一个至多个图元。
(4). 流输出阶段(SO)
在图元数据传输到光栅器的过程中,将图元数据从管线中输出至内存。可以将图元数据同时输出至光栅器和内存,或者只输出到内存。输出到内存的数据可以作为输入返回到管线,也可以被CPU访问。
(5). 光栅器阶段(RS)
光栅器执行裁剪,为PS准备数据,并决定如何调用PS。
(6). 象素着色器阶段(PS)
接收经RS插值过的数据,计算逐顶点的数据
(7). 输出合并阶段(OM)
将输出数据(PS输出值,深度及模板数据)与渲染目标和深度模板缓存中的数据进行合并来生成最终的管线结果。
一个纹理可以绑定不同阶段的渲染管道。如:绑定到render target 中(在屏幕中显示), 绑定到 shader resource中(作为着色器的样本)。为了使这两种能进行,我们在创建texture resource的时候可以增加如下标志位:D3D10_BIND_RENDER_TARGET | D3D10_BIND_SHADER_RESOURCE;。
实际上, 纹理不是直接绑定在渲染管道上而是用resource view 代替绑定到渲染管道上。每当我们要用一个texture 的时候,必须为为这个texture创建resource view。这样做的原因是为了使纹理的验证和映射在运行时候,而纹理的驱动在视图创建时候就已经完成,这样就可以减少绑定的纹理的时间“This allows validation and mapping in the runtime and driver to occur at view creation, minimizing type checking at bind time.”
所以在把一个纹理当一个render target 或shader resource 使用的时候,我们必须创建render target view(ID3D10RenderTargetView) 或 shader resource view(ID3D10ShaderResourceView)。
Resource Views 主要干了两件事情: 一: 创建的这些Resource view 会被怎样地使用。二: 标志resource 的格式。
因为屏幕上的像素点不是无限小的,所以有时候采样的点连接起来后会有失真的现象。所以就有了Multisampling技术的引入。Multisampling就是计算两个相邻点的颜色来计算这个像素的最后颜色。为什么叫“multisampling”, 因为它用了multiple pixel samples来计算最后的颜色。
我们可以用如下结构体来描述multisampling
typedef struct DXGI_SAMPLE_DESC {
UINT Count; //指定每一个像素的颜色从几个像素中采样。
UINT Quality; //采样的质量。
} DXGI_SAMPLE_DESC, *LPDXGI_SAMPLE_DESC;