游戏开发论坛

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

高手救命,关于DDraw中操作页面内存数据

[复制链接]

4

主题

10

帖子

16

积分

新手上路

Rank: 1

积分
16
发表于 2005-2-6 14:27:00 | 显示全部楼层 |阅读模式
小弟在学习用DirectDraw写一个演示程序。
在Lock一个surface后,对其进行内存数据操作(Alpha混合)。
但是每次出来的图形的Width总是只有原来的一半,但是Height是正常的。

请高手出招。谢谢,先。 [em24] [em24]

63

主题

871

帖子

891

积分

高级会员

Rank: 4

积分
891
QQ
发表于 2005-2-6 16:16:00 | 显示全部楼层

Re:高手救命,关于DDraw中操作页面内存数据

可能是Byte Per Pixel不对号

4

主题

10

帖子

16

积分

新手上路

Rank: 1

积分
16
 楼主| 发表于 2005-2-6 16:33:00 | 显示全部楼层

Re:高手救命,关于DDraw中操作页面内存数据

骑士,能不能说得详细一些

20

主题

398

帖子

398

积分

中级会员

Rank: 3Rank: 3

积分
398
发表于 2005-2-7 00:20:00 | 显示全部楼层

Re:高手救命,关于DDraw中操作页面内存数据

      首先要弄清表面的色彩深度。256色每个点用一个字节来表示;16位色每个点用两个字节表示;24位色每个点用3个字节表示;32位色每个点用4字节表示。

      另外还有一个表面跨距的概念,举个例子来说:假设是24位表面,宽度为431个像素,那么图像的每行数据占用431*3=1293个字节,然后看这个数是不是4的整数倍,如果不是还需要补成4的整数倍,也就是说,1293 Mod 4=1,所以每行数据的实际宽度为1293+(4-1)=1296个字节。

DDSURFACEDESC2 desc;
ZeroMemory( &desc, sizeof(desc) );
desc.dwSize = sizeof(desc);
HRESULT r=surf->Lock( 0, &desc, DDLOCK_WAIT | DDLOCK_WRITEONLY, 0 );

这个数据保存在desc.lPitch中,可以很方便的获得。

注意到了以上的问题应该就不会出错了!

4

主题

10

帖子

16

积分

新手上路

Rank: 1

积分
16
 楼主| 发表于 2005-2-7 09:14:00 | 显示全部楼层

Re:高手救命,关于DDraw中操作页面内存数据

骑士,还有一个问题。
我对页面做Alpha效果时,所有的源页面都是黑色,目标页面都是正常的。(16bit)。
不知道又是什么问题呀。
算法是从别人的源程序中找的。

谢谢。

20

主题

398

帖子

398

积分

中级会员

Rank: 3Rank: 3

积分
398
发表于 2005-2-7 10:35:00 | 显示全部楼层

Re:高手救命,关于DDraw中操作页面内存数据

是不是做完alpha运算后把源表面清除了?

把算法发上来看看好么?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-12-24 08:00

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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