故名思义Vertex Buffer就是存放顶点的缓冲。相当于一个内存区,指明了这些几何图形的顶点的位置。
一般简单的几何图形,如正方形,手动地可以定义这些顶点,定义好顶点之后,就需要如下这样来设置好,才能开始画图,而这正是DirectX里面最难理解的问题之一,和OpenGL也一样,同样需要这样设置的,OpenGL SuperBibl 第五版中居然把这个问题放到了差不多最后一个章节去介绍,可想而知,这个理解起来是有难度的。当然作者这样安排的合理性是有人怀疑的。
gd3dDevice->SetVertexDeclaration(Decl);
gd3dDevice->SetStreamSource(0, mGridVB, 0, sizeof(VertexPNT));
gd3dDevice->SetIndices(mGridIB));
为什么要如上这样设置DirectX的数据呢?
第一句:是告诉DirectX设备我们将要使用的顶点所包含的属性,什么是顶点的属性呢?顶点位置,顶点的单位向量,顶点的颜色,纹理坐标等都是气属性。
这里的Decl就是IDirect3DVertexDeclaration9 接口,用微软的话对这个接口的解析就是:
Applications use the methods of the IDirect3DVertexDeclaration9 interface to encapsulate the vertex shader declaration.
那么什么是the vertex shader declaration呢?
A vertex shader declaration is made up of an array of vertex elements.
然后又什么是vertex elements呢?
它的数据结构是:D3DVERTEXELEMENT9
Defines the vertex data layout. Each vertex can contain one or more data types, and each data type is described by a vertex element.
每个vertex element描述了vertex的其中一个属性,这些属性就是组成了所谓的the vertex data layout(顶点数据层)。
通过这样,DirectX就知道了如何去描绘这些几何图形了。
归纳:
A vertex is composed of n streams. (一般是用一个流,但是一些高级的应用就需要用到多个流。)
A stream is composed of m elements.
An element is [position, color, normal, texture coordinate].
第二句:IDirect3DDevice9::SetStreamSource绑定了顶点缓冲和设备的数据流,构造顶点数据和其中一个数据流接口的联系,顶点数据将通过数据流传入几何函数进行处理。画图函数是IDirect3DDevice9::DrawPrimitive,引用改数据流然后进行画图。
输入的顶点元素(the input vertex elements)映射到寄存器是由可编程shader声明的。由shader指令进行解析。顶点shader函数是由一个数组指令定义,应用到每一个顶点,然后写出到顶点输出寄存器。
使用流的一个主要好处就是可以DIY顶点数据,只带需要的数据就可以了,不用处理多余的数据,像以前不用流的多层渲染那样。节省了数据流量带宽,就加快了渲染速度。
第三句:就是设置其索引缓冲。
语法:
typedef struct D3DVERTEXELEMENT9 {
WORD Stream;
WORD Offset;
BYTE Type;
BYTE Method;
BYTE Usage;
BYTE UsageIndex;
} D3DVERTEXELEMENT9, *LPD3DVERTEXELEMENT9;
如下定义了一个数组,包括了顶点位置,单位向量和纹理坐标。然后顶一个了一个IDirect3DVertexDeclaration9接口Decl
D3DVERTEXELEMENT9 VertexPNTElements[] =
{
{0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0},
{0, 12, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL, 0},
{0, 24, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0},
D3DDECL_END()
};
HR(gd3dDevice->CreateVertexDeclaration(VertexPNTElements, &Decl));
总的来说,这个是非常难理解的概念,但是要用shader的话,又是必须要过的第一关。这也是shader入门难的缘故之一吧。
分享到:
相关推荐
顶点缓存数组(Vertex Buffer Object)的示例程序 VBO允许把顶点数据存储在GPU缓存中,并且只传输一次,前提是有足够的内存资源可以保存这些顶点数据。
个人博客中讲OpenGLES入门课程的第10章,关于drawElements和vertex buffer以及index buffer的代码
Vertex buffer 在ogre中的应用
添加shaders:顶点着色器和片段着色器 编译 Vertex shader 和 Fragment shader
Vertex Shader Instructions 顶点着色器指令集
DirectX 3D HLSL高级实例精讲_VertexShader深入探讨
Directx9渲染器编程书
With the advent of Microsoft® DirectX® version 8.0, the revolution of programmable graphics had arrived. With vertex shaders for the programmable geometry pipeline and pixel shaders for the ...
Vertex And Pixel Shader Programming With Directx 9.
learn vertex and pixel shader programming with directX9
Unity Shader - Vertex and fragment shader examples 顶点和片段着色器的例子-附件资源
计算机图形学 着色器 顶点着色器 像素着色器 DirectX 3D
DirectX 11 Low Poly Shader creates flat shaded/low poly effect. Just apply shader to any mesh and it will be rendered in most demanded and artistic - low poly style. DirectX 11 Low Poly Shader is ...
用顶点纹理来使图形偏移,主要是测试顶点纹理,为什么片元程序会影响顶点程序,求助!
本书是为数不多的讲解有关渲染从原理到实战的一本书,既重视理论上的讲解,又有大量的示例,通过对本书的深入学习,及时Shader不会写的小白也能写出画面酷炫的Shader代码出来,并且能深入理解各种酷炫技术的底层原理...
【插件简介】 ... ================== 使用顶点绘制颜色作为分组和组织的形式 在材质和/或几何体节点中使用顶点绘制 ...Vertex paint is faster than shader mode and exports in obj without materials
DirectX 11 Low Poly Shader creates flat shaded/low poly effect. Just apply shader to any mesh and it will be rendered in most demanded and artistic - low poly style. DirectX 11 Low Poly Shader is ...
vertex-theme, 顶点是 GTK 3 GTK 2.Gnome shell 和肉桂的主题 顶点主题顶点是 GTK 3 。GTK 2.gnome外壳和肉桂的主题。 它支持基于 GTK 3和 GTK 2的桌面环境,包括 Gnome 。肉桂。Mate 。Budgie 。等等 。主题,包括...