关于 像素对齐 行间距pitch 的问题

chifagao 2011-07-18 11:05:18
行间距pitch 肯定不是 图像的宽度。 一般大于 图像的宽度

这个间隙 什么时候产生和什么阶段存在的? 是将 像素写入到 磁盘 还是读入到 内存是产生的?还是一直就存在。

图像在磁盘存储时 存不存在 间隙 ? 写入到磁盘是 将 间隙的字节和像素一起写入 还是只 写入 像素字节本身?

...全文
287 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
xychzh 2011-07-20
  • 打赏
  • 举报
回复
修正上楼:
“像素格式也取决于创建时的格式”
应该是:
“像素格式取决于要保存的格式”
xychzh 2011-07-20
  • 打赏
  • 举报
回复
再补充一下,这个pitch的值是IDirect3DTexture9在加载纹理时决定的,从该值可以看到实际的纹理占了多少内存。跟图片本身的像素尺寸无关。
比如你不从图片加载,自己构造一个二维像素数据,加载到IDirect3DTexture9时,会根据你给的宽高,及像素格式来决定它要为这些像素如何分配内存,以获得最大性能。

关于写入到文件,我的测试结果是可能会和pitch一致,也可能不会
1:我加载了一个非2的次幂纹理,载入后被扩充成了2的次幂尺寸,然后保存纹理后,尺寸也是2的次幂,与pitch一致
2:我创建了一个1×1的D3DFMT_A1R5G5B5格式纹理,其pitch是4(而原本只有16位),保存到纹理后,图像宽度依然是1×1
这样可以得出的大致结论就是,宽高肯定是和创建后的宽高一致的,像素格式也取决于创建时的格式,而pitch应该只算是他纹理本身的内存组织方式。

以上都是由测试产生的想法,同样仅供参考。
xychzh 2011-07-20
  • 打赏
  • 举报
回复
一般情况下,如果禁用了2的次幂处理,则pitch就是图像原宽度的字节数,如果没禁用,则宽度就为缩放后的宽度字节数,
总之它总是等于图像创建完后通过GetLevelDesc()函数得到的宽度的字节数
以上都是通过测试D3DXCreateTextureFromFileEx()得出的大致结果。

另外,对于一些特殊格式,情况也会有所不一样,以CreateTexture()为例:
比如:
1×1、2×2的D3DFMT_A8L8格式纹理(16位)或者D3DFMT_L8(8位)纹理,其pitch始终是4字节,而且不管是否禁用了2的次幂限制,都是4字节。(似乎4是pitch的最低值)

可能是为了最大化的提升性能,所以,做了很多特殊的处理,总之是无规律的,无法用一个“公式”直接得到什么结论的,如果能把所有情况都测试一下,然后列个表,看看pitch的值到底都是多少,或许会更好一些。

一般读写纹理时用pitch做为图像一行的宽度就不会有什么问题。
我所知道的就是这些了,都是测试的结果,没看过SDK,对不对不能保证,你参考下吧。

8,303

社区成员

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

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