游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1839|回复: 3

请教:关于顶点数据流在不同字节顺序的机器上的问题.

[复制链接]

34

主题

70

帖子

76

积分

注册会员

Rank: 2

积分
76
发表于 2008-2-6 13:23:00 | 显示全部楼层 |阅读模式
    在底层渲染API(D3D,OpenGL)里面可以创建顶点缓冲区,位置还是由API内部自动调整.有可能是放在显存,有可能放在APG内存,也有可能是在普通内存里面的.如果CPU和GPU的字节顺序都是little-endian或者都是big-endian自然没有什么问题,但要是CPU和GPU之间的字节顺序不一样怎么办,呃^是不是没有这样的机器啊?
    还有就是比如说我定义一个模型文件格式,为了方便也为了速度我直接就把顶点缓冲区里面的数据一直一整块的写到文件里面去了,这样是不是文件就失去字节顺序的移植性?这样会不会还存在其他问题,比如内存对齐.如果我写文件的程序编译的时候用的4字节对齐,而读文件程序编译选项用的是2字节对齐.这样会不会使这个文件读不进来了?
    写得有点乱,不知道文件说清楚了没有.请教下各位达人了,谢谢!

0

主题

113

帖子

122

积分

注册会员

Rank: 2

积分
122
发表于 2008-2-7 16:04:00 | 显示全部楼层

Re:请教:关于顶点数据流在不同字节顺序的机器上的问题.

确实会失去字节顺序的移植性,并且在不同的内存对齐机器上可能有问题.
对于编译选项用的是2字节对齐还是4字节对齐,这个反倒不是问题,你可以在定义这个结构的时候,使用相关指令明确指定对齐方式,而不接受全局的编译选项.
VC 是用 #pragma 来指定的.

6

主题

471

帖子

1047

积分

金牌会员

Rank: 6Rank: 6

积分
1047
发表于 2008-2-8 11:09:00 | 显示全部楼层

Re:请教:关于顶点数据流在不同字节顺序的机器上的问题.

float传指针进去同理
void swap32(DWORD & d)
{
        BYTE w1 = (BYTE )(d & 0xff);
        BYTE w2 = (BYTE )((d >> 8) & 0xff);
        BYTE w3 = (BYTE )((d >> 16) & 0xff);
        BYTE w4 = (BYTE )(d >> 24);
        d = ((w1 << 24) | (w2 << 16) | (w3 << 8) | w4);
}

0

主题

113

帖子

122

积分

注册会员

Rank: 2

积分
122
发表于 2008-2-9 11:31:00 | 显示全部楼层

Re: 请教:关于顶点数据流在不同字节顺序的机器上的问题.

C/C++ 的 >> 操作是和字节顺序无关的.

字节顺序是指下面这种情况:
假设我们重问件中读一个DWORD
那么我们读到的实际是4个BYTE,
比如
BYTE data[4] = {0x01, 0x02, 0x03, 0x04};
那么这个data表示的是 0x01020304 还是 0x04030201 呢??

至于CPU和GPU的字节顺序是否一致问题,
API和显卡驱动程序会解决这个问题,
现在已经不是直接往 A000:0000 写数据的年代了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-12-20 01:22

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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