`
473687880
  • 浏览: 535634 次
文章分类
社区版块
存档分类
最新评论

DirectX的Vertex Buffer顶点缓冲的理解和应用 Shader必知必会

 
阅读更多

故名思义Vertex Buffer就是存放顶点的缓冲。相当于一个内存区,指明了这些几何图形的顶点的位置。

一般简单的几何图形,如正方形,手动地可以定义这些顶点,定义好顶点之后,就需要如下这样来设置好,才能开始画图,而这正是DirectX里面最难理解的问题之一,和OpenGL也一样,同样需要这样设置的,OpenGL SuperBibl 第五版中居然把这个问题放到了差不多最后一个章节去介绍,可想而知,这个理解起来是有难度的。当然作者这样安排的合理性是有人怀疑的。

  1. gd3dDevice->SetVertexDeclaration(Decl);
  2. gd3dDevice->SetStreamSource(0,mGridVB,0,sizeof(VertexPNT));
  3. 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;
  1. 如下定义了一个数组,包括了顶点位置,单位向量和纹理坐标。然后顶一个了一个IDirect3DVertexDeclaration9接口Decl
  1. D3DVERTEXELEMENT9VertexPNTElements[]=
  2. {
  3. {0,0,D3DDECLTYPE_FLOAT3,D3DDECLMETHOD_DEFAULT,D3DDECLUSAGE_POSITION,0},
  4. {0,12,D3DDECLTYPE_FLOAT3,D3DDECLMETHOD_DEFAULT,D3DDECLUSAGE_NORMAL,0},
  5. {0,24,D3DDECLTYPE_FLOAT2,D3DDECLMETHOD_DEFAULT,D3DDECLUSAGE_TEXCOORD,0},
  6. D3DDECL_END()
  7. };
  8. HR(gd3dDevice->CreateVertexDeclaration(VertexPNTElements,&Decl));


总的来说,这个是非常难理解的概念,但是要用shader的话,又是必须要过的第一关。这也是shader入门难的缘故之一吧。

分享到:
评论

相关推荐

    XNA:管理Shader

    本章将带领读者逐步构建一个简单的Shader,用于实现每像素镜面反射光的3D模型渲染,这涉及到顶点缓冲(Vertex Buffer)、顶点着色器(Vertex Shader)的处理,以及像素着色器(Pixel Shader)如何在屏幕上生成像素。...

    dx9顶点数据

    接下来,要将这些顶点数据传送给显卡进行处理,我们需要创建一个顶点缓冲区(Vertex Buffer)。顶点缓冲区是一种GPU可以直接访问的内存区域,用于存储大量的顶点数据。创建和填充顶点缓冲区的步骤包括: 1. 定义...

    directX8 sdk

    此外,Direct3D 8还引入了硬件顶点缓冲区(Hardware Vertex Buffer),通过将顶点数据存储在显存中,减少了CPU与GPU之间的数据传输,提高了渲染效率。 DirectInput是DirectX的一部分,它允许开发者直接控制用户的...

    directx11的官方C++例程

    2. **资源管理(Resources)**:DirectX支持各种类型的资源,如纹理(Texture)、常量缓冲区(Constant Buffer)、顶点缓冲区(Vertex Buffer)、索引缓冲区(Index Buffer)等。开发者需要理解如何创建、更新和绑定...

    深入Managed DirectX9

    1. **基础概念**:理解DirectX9的基本架构,包括设备(Device)、交换链(Swap Chain)、顶点缓冲(Vertex Buffer)、索引缓冲(Index Buffer)、纹理(Texture)和像素着色器(Pixel Shader)等核心概念。...

    Unity Shader 入门书籍高清完整版PDF

    书中的内容可能包括UV坐标的概念,以及如何在Shader中读取和应用纹理。此外,还可能讨论颜色空间、alpha测试和混合模式等与纹理相关的主题。 Unity的Surface Shader是为简化Shader编写而设计的高级接口。它允许...

    Introduction to 3D Game Programming with DirectX 11第6章的Hills程序代码

    接着,程序会使用Direct3D的顶点缓冲区(Vertex Buffer)和索引缓冲区(Index Buffer)来存储和渲染这些3D网格。顶点缓冲区包含了地形顶点的位置、法线和纹理坐标等信息,而索引缓冲区则指示了顶点如何连接形成...

    三角形 directx 有注释 c++

    6. **顶点缓冲区(Vertex Buffer)**:存储构成几何形状(如三角形)的顶点数据,包括位置、颜色等信息。在这个例子中,三角形的三个顶点会被定义并存储在这里。 7. **状态对象(State Objects)**:如混合状态、...

    DirectX3D游戏编程入门详解

    DirectX 11支持顶点着色器(Vertex Shader)、像素着色器(Pixel Shader)、几何着色器(Geometry Shader)和计算着色器(Compute Shader)等。 6. **状态对象(State Objects)**:包括深度测试、混合模式、裁剪...

    rc2.rar_space

    1. **VertexBuffer**: 在计算机图形学中,顶点缓冲区(VertexBuffer)是GPU内存中存储三维模型顶点数据的区域。顶点缓冲区的优化对于提高渲染性能至关重要,因为它们减少了CPU到GPU的数据传输次数。在“VertexBuffer...

    DirectX3DHLSL高级实例精讲06-10章源码

    这一章可能涉及到了几种不同的缓冲区类型,如顶点缓冲区(Vertex Buffer)、索引缓冲区(Index Buffer)和常量缓冲区(Constant Buffer),以及如何创建、更新和绑定它们。同时,可能会讲解如何使用缓冲区提高渲染...

    DirectX 9.0 3D 游戏开发编程基础源码 完整

    2. **顶点着色器(Vertex Shader)** 和 **像素着色器(Pixel Shader)**: 这两者是Direct3D中实现复杂图形效果的重要工具。顶点着色器处理顶点数据,如位置、颜色、法线等,而像素着色器则在像素级别上计算颜色,实现...

    ShaderModel50andComputeShader

    ### Shader Model 5.0 和 Compute Shader 在 DirectX 下的应用与技术要点 #### Shader Model 5.0 概述 Shader Model 5.0 (SM5.0) 是 DirectX 11 引入的一个重要更新,它扩展了原有的着色器模型功能,并引入了许多...

    DirectX 与 VB.NET程序开发

    3. 顶点和索引:Direct3D中的几何形状由顶点表示,可以使用`VertexBuffer`和`IndexBuffer`对象存储顶点数据。VB.NET中可通过数组创建和管理这些缓冲区。 4. 渲染管线:理解Direct3D的渲染管线是至关重要的,包括...

    C# DirectX3D Demo

    在C#中使用DirectX3D,首先需要理解Direct3D的核心概念,包括设备(Device)、交换链(SwapChain)、渲染目标(Render Target)和深度缓冲(DepthStencil Buffer)。设备是Direct3D的主要工作接口,用于配置硬件加速...

    DX10实例代码

    2. **Direct3D 10基础知识**:熟悉Direct3D 10的核心概念,如设备(Device)、交换链(Swap Chain)、顶点缓冲(Vertex Buffer)、索引缓冲(Index Buffer)、状态对象(State Object)等。 3. **着色器模型**:...

    3D场景中加载地形 高度图 directx

    在3D场景中加载地形是游戏开发和可视化应用中的常见任务。DirectX作为一个强大的图形库,为开发者提供了创建复杂3D环境的工具。本篇将深入探讨如何利用DirectX加载地形高度图,以及相关的C++编程技巧。 首先,我们...

    Introduction to 3D Game Programming with DirectX 11 源码-下

    3. **顶点着色器(Vertex Shader)**:在渲染管线的早期阶段,顶点着色器负责转换模型空间中的顶点坐标,进行投影和视口变换,以及执行其他顶点级别的计算,如光照和动画。 4. **几何着色器(Geometry Shader)**:...

    directx 3d入门

    1. **Direct3D基础知识**:首先,你需要了解Direct3D的基本架构,包括设备(Device)、交换链(Swap Chain)、顶点缓冲(Vertex Buffer)、索引缓冲(Index Buffer)等基本概念。这些是构建3D场景的基础。 2. **...

    Unity 顶点转换与效果

    另外,Unity的图形API,如OpenGL和DirectX,也可以直接操作顶点缓冲区(Vertex Buffer)来实现高度定制的渲染技术。 总结起来,Unity的顶点转换与效果是其强大渲染能力的基础,通过理解并操控这一过程,开发者可以...

Global site tag (gtag.js) - Google Analytics