游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3576|回复: 5

关于D3DVERTEXELEMENT9中的offset

[复制链接]

23

主题

53

帖子

53

积分

注册会员

Rank: 2

积分
53
发表于 2004-3-22 21:21:00 | 显示全部楼层 |阅读模式
在sdk doc里面关于Stream的说明(Programmable Stream Model )有这样一段:
///////////////////////////////////////////////////////////////////////////////////////
// 各个流的顶点格式
// multistream vertex
// stream 0, pos, diffuse, specular
struct POSCOLORVERTEX
{
    FLOAT x, y, z;
    DWORD diffColor, specColor;
};
#define D3DFVF_POSCOLORVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE|D3DFVF_SPECULAR)


// stream 1, tex coord 0
struct TEXC0VERTEX
{
    FLOAT tu1, tv1;
};
#define D3DFVF_TEXC0VERTEX (D3DFVF_TEX1)

// stream 2, tex coord 1
struct TEXC1VERTEX
{
    FLOAT tu2, tv2;
};
#define D3DFVF_TEXC1VERTEX (D3DFVF_TEX0)

// *** 以下是用于CreateVertexDeclation的D3DVERTEXELEMENT9 ***

// multitexture - multistream
D3DVERTEXELEMENT9 dwDecl3[] =
{
                { 0, 0,  D3DDECLTYPE_FLOAT3,   D3DDECLMETHOD_DEFAULT,                                           D3DDECLUSAGE_POSITION, 0 },
                { 0, 12, D3DDECLTYPE_D3DCOLOR, 3DDECLMETHOD_DEFAULT,
                                          D3DDECLUSAGE_COLOR,  0 },
                { 0, 28, D3DDECLTYPE_D3DCOLOR, 3DDECLMETHOD_DEFAULT,
                /** ~~diffColor offset=28 *****/

                                          D3DDECLUSAGE_COLOR,  1 },
                { 1, 36, D3DDECLTYPE_FLOAT2,   D3DDECLMETHOD_DEFAULT,
                /** ~~ specColor offset=36 *****/

                                          D3DDECLUSAGE_TEXCOORD, 0 },
                { 2, 44, D3DDECLTYPE_FLOAT2,   D3DDECLMETHOD_DEFAULT,
                                          D3DDECLUSAGE_TEXCOORD, 0 },
                D3DDECL_END()
};
///////////////////////////////////////////////////////////////////////////////////////////

   不明白的是关于diffColor, specColor在D3DVERTEXELEMENT9中offset的确定。他们都是DWORD类型的,但是在D3DVERTEXELEMENT9中的offset却不一样。因为offset是从开头累计的,这样算来,diffColor占用了28-12=16byte的空间,而specColor则占用了36-28=8byte的空间,但是他们都是DWORD啊,应该各都用4byte才对啊。我说的对么?是sdk的文档错了么?搞不明白。

1

主题

11

帖子

13

积分

新手上路

Rank: 1

积分
13
发表于 2004-3-23 08:45:00 | 显示全部楼层

Re:关于D3DVERTEXELEMENT9中的offset

按我理解:
diffColor是四个float型的数组成,specColor由两个float型组成,这通过看D3DDECLTYPE_D3DCOLOR,D3DDECLTYPE_FLOAT2两个标识可以看出来,颜色一般是由四个float组成,specColor可能不是标准的颜色格式,是自定义的,所以只有两个float型,这样它们所占用的空间就是16与8了

20

主题

473

帖子

502

积分

高级会员

Rank: 4

积分
502
发表于 2004-3-23 09:44:00 | 显示全部楼层

Re:关于D3DVERTEXELEMENT9中的offset

D3DDECLTYPE_FLOAT2

看这个,这个很明显的表示了此ELEMENT的SIZE

23

主题

53

帖子

53

积分

注册会员

Rank: 2

积分
53
 楼主| 发表于 2004-3-23 10:14:00 | 显示全部楼层

Re: 关于D3DVERTEXELEMENT9中的offset

to secondage:
    两个color的type都是 D3DDECLTYPE_D3DCOLOR啊。而且在struct里面的定义也是定义为DWORD类型的。

to daxiazh:
    按我理解,在struct里面,颜色的定义是定义为DWORD类型的啊。传送给渲染管线的应该是struct里的数据吧,那offset应该按结构里的大小定吧。

  可能是我的标注误导大家了,不好意思。               
{ 1, 36, D3DDECLTYPE_FLOAT2,   D3DDECLMETHOD_DEFAULT,
                /** ~~ specColor offset=36 *****/
这个offset应该是紧接着specColor后面的纹理数据流。据我理解,他的offset应该是28+sizeof(specColor )计算出来的。但如果specColor是DWORD的话,应该等于28+4=32才对。究竟offset怎样算,真是搞不懂呢。打算做做试验。

5

主题

255

帖子

255

积分

中级会员

Rank: 3Rank: 3

积分
255
发表于 2004-3-23 13:30:00 | 显示全部楼层

Re:关于D3DVERTEXELEMENT9中的offset

23

主题

53

帖子

53

积分

注册会员

Rank: 2

积分
53
 楼主| 发表于 2004-3-23 22:05:00 | 显示全部楼层

Re: 关于D3DVERTEXELEMENT9中的offset

做了一个试验:
//Define a custom vertex for our cubiods
struct CUBIOD_CUSTOMVERTEX
{
  FLOAT x, y, z;                //Position of vertex in 3D space
  DWORD colour;                //Colour of vertex
  FLOAT tu, tv;                //Texture coordinates
};

当D3DVERTEXELEMENT9如下时程序正常运行:
D3DVERTEXELEMENT9 dwDecl3[] =
{
    { 0, 0,  D3DDECLTYPE_FLOAT3,   D3DDECLMETHOD_DEFAULT,
                        D3DDECLUSAGE_POSITION, 0 },
    { 0, 12, D3DDECLTYPE_D3DCOLOR, D3DDECLMETHOD_DEFAULT,
                D3DDECLUSAGE_COLOR,  0 },
    { 0, 16, D3DDECLTYPE_FLOAT2,   D3DDECLMETHOD_DEFAULT,
                D3DDECLUSAGE_TEXCOORD, 0 },
    D3DDECL_END()
};

      当将TEXCOORD的offset改为28,也就是争论中的那个古怪的值,程序失败。
证明了只要按struct里面的偏移计算就可以了。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-5-16 10:34

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表