gpt4 book ai didi

c++ - 在 C++ 中从头开始创建 DirectDraw 表面

转载 作者:行者123 更新时间:2023-11-30 04:17:22 27 4
gpt4 key购买 nike

我正在尝试将二维数组转换为 DDS 并将其保存到文件中。 Array 充满了 Color 结构(每个结构都有红色、绿色、蓝色和 alpha 分量)。一旦我将数组设置为正确的格式,我确信将它保存到文件部分不会有问题。

我可以为此使用库(只要它的许可证允许我在封闭源项目中使用它并在 Linux 和 Windows 上工作)或手动执行,如果我能找到一个不错的资源解释如何去做。

如果有人能指出正确的方向,我将不胜感激。

最佳答案

在 DirectDraw 中,您可以通过在 DDSURFACEDESC 结构中设置某些字段并将其传递给 CreateSurface 方法,从内存中的数据创建表面>IDirectDraw 接口(interface)。

首先,您需要通过将dwFlags 字段设置为以下标志集来告诉DirectDraw DDSURFACEDESC 结构的哪些字段包含正确的信息:DDSD_WIDTH | DDSD_高度 | DDSD_像素格式 | DDSD_LPSURFACE | DDSD_PITCH.

哦,这只适用于系统内存表面,所以可能需要在 ddsCaps.dwCaps 字段中添加 DDSCAPS_SYSTEMMEMORY 标志(如果 DirectDraw 不会默认情况下执行此操作)。

然后您在lpSurface 字段中指定像素数据数组的起始地址。如果您的缓冲区是连续的,只需将 lPitch 设置为 0。否则您可以在那里设置正确的间距(两个后续扫描线的开头之间的字节距离)。

ddpfPixelFormat 字段中设置正确的像素格式,在 dwRGBBitCount 中设置正确的位深度,在 dwRBitMask 中设置正确的 RGB 掩码,dwGBitMaskdwBBitMask

然后将 lXPitch 设置为像素的字节数(RGB 为 3)。这取决于您使用的像素格式。

然后将填充的结构传递给CreateSurface,看看是否有效。

当您以这种方式创建表面时,请记住 DirectDraw 不会自己管理其数据缓冲区,并且一旦您在表面上调用 Release 就不会释放此内存。当 Surface 不再使用此内存时,您需要自行释放它。

另一方面,如果你想让这个像素数据放在显存中,你需要以通常的方式创建一个离屏表面然后锁定它,将你的像素复制到显存中它自己的缓冲区(你'我们会在 lpSurface 字段中找到它的地址,并记得将 lPitch 计算在内!),然后解锁它。

关于c++ - 在 C++ 中从头开始创建 DirectDraw 表面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17123947/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com