2.2顶点声明
该小节对顶点声明的描述绝大多数都取自翁云兵的《着色器和效果》,该文对顶点声明的描述是我所见到最详尽最透彻的,这里向作者表示敬意:)
到现在为止,我们已经使用自由顶点格式(flexible vertex format,FVF)来描述顶点结构中的各分量。但是,在可编程管线中,我们的顶点数据可以包含比用FVF所能表达的多的多的数据。因此,我们通常使用更具表达性的并且更强有力的顶点声明(vertex declaration)。
注意:我们仍然可以在可编程管线中使用FVF——如果我们的顶点格式可以这样描述。不管怎样,这只是为了方便,因为FVF会在内部被转换为一个顶点声明。
2.2.1 描述顶点声明
我们将一个顶点声明描述为一个D3DVERTEXELEMENT9结构的数组。D3DVERTEXELEMENT9数组中的每个元素描述了一个顶点的分量。所以,如果你的顶点结构有三个分量(例如:位置、法线、颜色),那么其相应的顶点声明将会被一个含3个元素的D3DVERTEXELEMENT9结构数组描述。
D3DVERTEXELEMENT9结构定义如下:
typedef struct _D3DVERTEXELEMENT9 {
BYTE Stream;
BYTE Offset;
BYTE Type;
BYTE Method;
BYTE Usage;
BYTE UsageIndex;
} D3DVERTEXELEMENT9;
² Stream——指定关联到顶点分量的流;
² Offset——偏移,按字节,相对于顶点结构成员的顶点分量的开始。例如,如果顶点结构是:
struct Vertex
{
D3DXVECTOR3 pos;
D3DXVECTOR3 normal;
};
……pos分量的偏移是0,因为它是第一个分量;normal分量的偏移是12,因为sizeof(pos) == 12。换句话说,normal分量以Vertex的第12个字节为开始。
² Type——指定数据类型。它可以是D3DDECLTYPE枚举类型的任意成员;完整列表请参见文档。常用类型如下:
D3DDECLTYPE_FLOAT1——浮点数值
D3DDECLTYPE_FLOAT2——2D浮点向量
D3DDECLTYPE_FLOAT3——3D浮点向量
D3DDECLTYPE_FLOAT4——4D浮点向量
D3DDECLTYPE_D3DCOLOR—D3DCOLOR类型,它扩展为RGBA浮点颜色向量(r, g, b, a),其每一分量都是归一化到区间[0, 1]了的。
² Method——指定网格化方法。我们认为这个参数是高级的,因此我们使用默认值,标识为D3DDECLMETHOD_DEFAULT。
² Usage——指定已计划的对顶点分量的使用。例如,它是否准备用于一个位置向量、法线向量、纹理坐标等,有效的用途标识符(usage identifier)是D3DDECLUSAGE枚举类型的:
typedef enum _D3DDECLUSAGE {
D3DDECLUSAGE_POSITION = 0, // Position.
D3DDECLUSAGE_BLENDWEIGHTS = 1, // Blending weights.
D3DDECLUSAGE_BLENDINDICES = 2, // Blending indices.
D3DDECLUSAGE_NORMAL = 3, // Normal vector.
D3DDECLUSAGE_PSIZE = 4, // Vertex point size.
D3DDECLUSAGE_TEXCOORD = 5, // Texture coordinates.
D3DDECLUSAGE_TANGENT = 6, // Tangent vector.
D3DDECLUSAGE_BINORMAL = 7, // Binormal vector.
D3DDECLUSAGE_TESSFACTOR = 8, // Tessellation factor.
D3DDECLUSAGE_POSITIONT = 9, // Transformed position.
D3DDECLUSAGE_COLOR = 10, // Color.
D3DDECLUSAGE_FOG = 11, // Fog blend value.
D3DDECLUSAGE_DEPTH = 12, // Depth value.
D3DDECLUSAGE_SAMPLE = 13 // Sampler data.
} D3DDECLUSAGE;
其中,D3DDECLUSAGE_PSIZE类型用于指定一个顶点的点的大小。它用于点精灵,因此我们可以基于每个顶点控制其大小。一个D3DDECLUSAGE_POSITION成员的顶点声明意味着这个顶点已经被变换,它通知图形卡不要把这个顶点送到顶点处理阶段(变形和光照)。
² UsageIndex——用于标识多个相同用途的顶点分量。这个用途索引是位于区间[0, 15]间的一个整数。例如,假设我们有三个用途为D3DDECLUSAGE_NORMAL的顶点分量。我们可以为第一个指定用途索引为0,为第二个指定用途索引为1,并且为第三个指定用途索引为2。按这种方式,我们可以通过其用途索引标识每个特定的法线。
例:假设我们想要描述的顶点格式由两个数据流组成,第一个数据流包含位置、法线、纹理坐标3个分量,第二个数据流包含位置和纹理坐标2个分量,顶点声明可以指定如下:
D3DVERTEXELEMENT9 decl[] =
{
//第一个数据流,包含分量位置、法线、纹理坐标
{ 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 },
//第一个数据流,包含分量位置、纹理坐标
{ 1, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_
POSITION, 1 },
{ 1, 12, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_
NORMAL, 1 },
D3DDECL_END()
};
D3DDECL_END宏用于初始化D3DVERTEXELEMENT9数组的最后一个顶点元素。
2.2.2创建顶点声明
CreateVertexDeclaration函数用于创建顶点声明,decl为指向上一小节定义的D3DVERTEXELEMENT9数组的指针,函数返回IDirect3DVertexDeclaration9指针g_Decl;
IDirect3DVertexDeclaration9 *g_Decl = NULL;
g_pd3dDevice->CreateVertexDeclaration(decl ,&g_Decl);
2.2.3设置顶点声明
g_pd3dDevice->SetVertexDeclaration(g_Decl);
至此,可编程数据流模型、顶点声明介绍完毕,在下面的例子中读者将会有更连贯的理解。
分享到:
相关推荐
##### 2.2 顶点声明 - **2.2.1 描述顶点声明**:定义了顶点的属性和布局,例如位置、法线、纹理坐标等。 - **2.2.2 创建顶点声明**:在DirectX应用程序中创建顶点声明对象。 - **2.2.3 设置顶点声明**:通过调用...
**2.2 顶点声明** 在DirectX中,顶点着色器的输入通常通过顶点声明来指定。顶点声明定义了每个顶点的数据结构,包括顶点的位置、法线、纹理坐标等信息。通过这种方式,顶点着色器可以获取必要的顶点属性来进行计算...
##### 2.2 顶点声明 顶点声明是DirectX中定义顶点布局的一种方式,它指定了每个顶点的数据结构,包括顶点的位置、法线、纹理坐标等信息。正确的顶点声明对于着色器正确地获取顶点数据至关重要。 ##### 2.3 用顶点...
##### 2.2 顶点声明 在DirectX中,顶点声明描述了顶点缓冲区中顶点数据的布局,包括顶点的属性(如位置、法线、纹理坐标等)及其数据类型。顶点声明是顶点着色器与顶点缓冲区之间的桥梁,确保着色器正确读取顶点数据...
##### 2.2 顶点声明 为了有效地处理顶点数据,需要先定义顶点的数据结构。在HLSL中,通常通过定义`struct`来描述顶点的数据布局。例如,上述示例中的`VS_INPUT`就是一种顶点结构体,包含了顶点的位置信息。 ##### ...
17.1.3 顶点声明的启用 291 17.2 顶点数据的使用 291 17.3 使用顶点着色器的步骤 293 17.3.1 顶点着色器的编写与编译 294 17.3.2 顶点着色器的创建 294 17.3.3 顶点着色器的设置 294 17.3.4 顶点着色器的销毁...
##### 2.2 算法流程 拓扑排序的核心思想在于重复选择当前图中入度为0的顶点,将其加入到结果序列中,并更新剩余顶点的入度,直至所有顶点都被处理。具体步骤如下: 1. 初始化所有顶点的入度。 2. 从入度为0的顶点...
首先,C++代码通常包含头文件、变量定义、函数声明和实现、类定义等元素。在"main.cpp"这个文件中,我们可能看到程序的入口点,即`main()`函数,这是所有C++程序执行的起点。在这个文件中,开发者可能会实现一些数据...
OpenGL的使用通常需要引入特定的头文件,比如`GL/gl.h`等,这些文件包含了OpenGL的所有函数声明。 **2.2 GLUT (OpenGL Utility Toolkit)** GLUT是一个开源的工具包,用于简化OpenGL程序的编写。它提供了一系列辅助...
#### 一、文档概览与重要声明 本指南针对 NVIDIA GeForce 8 和 9 系列显卡提供了详细的编程指导,适用于希望深入了解显卡编程的开发者。文档发布日期为 2008 年 12 月 19 日,并在开头部分明确指出所有 NVIDIA 设计...
`:声明使用标准命名空间,简化代码编写。 #### 2.2 主函数 ```cpp int main(){ in(); go(); out(); return 0; } ``` - `main()`:程序入口。 - `in()`:读取输入数据。 - `go()`:核心算法逻辑。 - `out()`:...
- **顶点声明**:定义了顶点数据的格式。 - **顶点缓存绑定**:将缓存与渲染管道关联起来。 - **更新顶点缓存**:提供了更新缓存中顶点数据的方法。 - **5.7 硬件索引缓存** - **IndexData类**:描述了索引缓存...
这部分通过一个简单的顶点程序示例来介绍Cg语言的基本语法结构,包括变量声明、函数定义等内容。读者将学习如何编写一个基本的顶点着色器,实现对几何顶点的简单变换。 ##### 2.2 编译示例程序 在此节中,作者将...
- **入门知识**:讲解编程基础,包括数据类型(如整型、浮点型、字符型等)、变量和常量的声明与使用,以及命名空间的作用。 - **操作符与表达式**:涵盖算术、比较、逻辑、赋值等操作符,以及如何构建复杂的表达式...
- 接口定义了对象之间的协议,它包含方法声明但没有方法实现。 - Java中使用关键字`interface`定义接口,类通过`implements`关键字实现接口。 **1.3 异常** - Java中的异常处理机制包括`try`、`catch`、`finally`...
- 2.2 GL状态(GLState),可能讨论了OpenGL中的状态机和状态管理。 - 2.3 GL命令语法(GLCommandSyntax),可能介绍了OpenGL命令的语法结构和使用方式。 - 2.4 基本OpenGL操作(BasicGLOperation),可能涵盖了...