hlsl 着色器语言的 顶点格式声明。。。 菜鸟级别。。的。。疑惑重重啊。。

wing_0706 2011-01-01 12:26:59
顶点声明描述为一个D3DVERTEXELEMENT9结构的数组:

typedef struct _D3DVERTEXELEMENT9 {
BYTE Stream;
//这个第一个变量作用很不理解啊。。 什么时候要两种以上数据流啊。。 两种数据流之间又怎么区分啊。。
BYTE Offset;
BYTE Type;
BYTE Method;
BYTE Usage;
BYTE UsageIndex;
} D3DVERTEXELEMENT9;

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()
};
1.D3DDECL_END宏用于初始化D3DVERTEXELEMENT9数组的最后一个顶点元素?
这个为什么要初始化最后一个元素啊??元素指的是哪个啊?
2.Offset——偏移,按字节来。
D3DVERTEXELEMENT9这个结构体里 不是只有6个都是1个字节吗?
为什么下面的第2个参数Offset都是 12递增的啊?
3.上面的两个数据流是怎么区分开来的?什么时候要用两个数据流?
本人菜鸟,勿怪啊。。
谢谢各位,祝大家新年愉快~
...全文
99 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
liuliu20036 2011-01-20
  • 打赏
  • 举报
回复
牛人真多,学习了!
wing_0706 2011-01-02
  • 打赏
  • 举报
回复
万分感谢!
wing_0706 2011-01-01
  • 打赏
  • 举报
回复
呵呵。。csdn编辑帖子功能比较完善了。。
wing_0706 2011-01-01
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 gameatp 的回复:]
3.区分数据流就是第一个参数,前三个第一个数值都是0,后两个为1,所以是两个不同数据流,用多流的好处我觉得就是把数据分开来免得混淆,一般引擎都会使用多流,每个流创建一个大的定点缓冲区,然后供给每次渲染使用下次渲染开始有置回去,你找个开源的看看就知道了
[/Quote]
我知道第一个参数是 区分数据流的。。上面 0 和 1就表示不同的了。。但是 这0和1给谁了来辨别啊。。还是不太清楚。。不过很感谢啊!!
但是在代码中是 如何利用 第一个参数的啊?
wing_0706 2011-01-01
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 gameatp 的回复:]
2.Offset的意思你理解错了
{ 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 },
上面三个是同一数据流,要晓得每一个数据的开始地址就得相对首地址加一个偏移,比如第二个 { 0, 12, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL, 0 },相对第一个偏移了12个字节,因为第一个是个D3DDECLTYPE_FLOAT3类型的数据,3*4 = 12。同理下面第三个为3*4 + 3*4 = 24。
[/Quote]
这样啊。。那要我换一下 位置就应该要变化了啊?

{ 0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 },
{ 0, 12, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD,0 },
{ 0, 20, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL, 0 },


后面两个换了一下 这样对吗?
gameatp 2011-01-01
  • 打赏
  • 举报
回复
1.#define D3DDECL_END {0xFF,0,D3DDECLTYPE_UNUSED, 0,0,0}
这个是固定的,再最后加一个表示结尾就可以了
2.Offset的意思你理解错了
{ 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 },
上面三个是同一数据流,要晓得每一个数据的开始地址就得相对首地址加一个偏移,比如第二个 { 0, 12, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL, 0 },相对第一个偏移了12个字节,因为第一个是个D3DDECLTYPE_FLOAT3类型的数据,3*4 = 12。同理下面第三个为3*4 + 3*4 = 24。
3.区分数据流就是第一个参数,前三个第一个数值都是0,后两个为1,所以是两个不同数据流,用多流的好处我觉得就是把数据分开来免得混淆,一般引擎都会使用多流,每个流创建一个大的定点缓冲区,然后供给每次渲染使用下次渲染开始有置回去,你找个开源的看看就知道了
gameatp 2011-01-01
  • 打赏
  • 举报
回复
对就是这个意思,只要偏移写对就OK,
SetStreamSource第一个参数就是流的索引就这里用的

8,303

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧