DirectDraw:lpitch的理解

 lpitch是结构体DDSURFACEDESC2的一项,这个结构体描述了页面/表面的一些信息。

      lpitch一般译做步幅(stride)或内存宽度(memory width)。注意,它与DDSURFACEDESC2结构体中的另一项dwWidth的意义是不一样的。

     lpitch的单位是字节,dwWidth的单位是像素。所以,一个640×480×8(640×480个像素,每像素用8位,即一个字节表示)页面,dwWidth=640 像素(字节)。但是,此时Lpitch不一定就等于640(字节)!同样一个640×480×16的页面,它的Lpitch值也不一定等于640×2(字节)。

   这是因为,Lpitch中的字节数有时还包含了高速缓冲区的内存字节数。如下图:

       

       通过以上图可以看到,页面外面还有一段额外内存,而这段内存是未知的;所以说,假如一个640×480×8的页面,它的dwWidth值是640,但是,它的Lpitch值应该是640+x,x就是高速缓冲区Cache占用的内存。

      所以,如果要访问这个页面缓冲区的第y行的第x个像素,应该这样:

     ddsd.lpSurface[x+y*ddsd.lpitch]

时间: 2024-11-17 13:34:38

DirectDraw:lpitch的理解的相关文章

初次接触:DirectDraw

第六章 初次接触:DirectDraw 本章,你将初次接触DirectX中最重要的组件:DirectDraw.DirectDraw可能是DirectX中最强大的技术,因为其贯穿着2D图形绘制同时其帧缓存层也是DirectX3D的基础.当然,DirectX8.0中DirectDraw已经完全集成到了DirectX3D里面.此外,如果你对DirectDraw深有了解,那将拥有创建任何DOS16/32类型的图形化程序的能力.DirectDraw是理解众多DirectX自身概念的钥匙.所以,听仔细了.

DirectDraw 与 DirectInput 的游戏编程体验

我想关于这个主题的文章,不算少,但也不算太多.但大多是分别介绍 DirectDraw 与 DirectInput,而并没有将其结合起来,也许你会问:"分开与合并起来并没有本质区别啊!".其实的确没有本质区别,但那样使那些最初对游戏编程报有极大热情的爱好者感到非常失望,因为这其中的一个并不能完全满足他们的要求,并且使其感到巨大的阻力,从而失去信心.所以本文将 DirectDraw 与 DirectInput结合起来去讲一个主题就是"游戏编程",请注意是"游戏

DirectDraw用到的DDSURFACEDESC2

DDSURFACEDESC2 结构定义一个需求的平面.下面的例子演示了结构的定义和标志位的设定: // Create the primary surface with one back buffer.  ZeroMemory(&ddsd, sizeof(ddsd)); ddsd.dwSize = sizeof(ddsd); ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT; ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYS

DirectDraw 显示 YUV

在网上找了一段代码,能工作,但是颜色不对,红的变成蓝色的,黄的变青色了,有时间找找问题. 这个问题在我初学DirectX是困惑了我很久,贴出来为初学者提供一个参考.   #include "ddraw.h" #pragma comment(lib,"ddraw.lib") #define FILE_HEIGHT            288 #define FILE_WIDTH            352 #define DRAW_TOP            0

使用DirectDraw直接显示YUV视频数据

最近在编写一个进行视频播放的ActiveX控件,工作已经接近尾声,现将其中显示YUV数据的使用DirectDraw的一些经验总结如下:(解码部分不是我编写的,我负责从网络接收数据,将数据传给解码器,并将解码得到的YUV数据进行显示,最初在显示部分我是先将YUV数据转换为RGB数据,再以位图的形式显示到屏幕上,但发现CPU占用率比较高,后来改用DirectDraw直接显示YUV数据) 1.在DirectDraw中创建YUV表面   与一般表面不同的是,创建YUV表面时需要指定象素格式,并指定YUV

C/C++:如何理解复杂的声明

http://blog.chinaunix.net/u/12783/showart_378340.html   C/C++:如何理解复杂的声明 这里说的声明,不光适用于C/C++,其他的一些语言也能适用. 与java和C#等不同,声明和定义在C/C++中有着比较明显的区别:声明仅仅是介绍名字(introduce names),而定义则会为该名字分配相应的空间.打个通俗的比喻:声明就是你在谈话中提到某个人的名字,而定义就是把你提到的这个人带到谈话的人群中来,让大家见识一下他/她是什么样子. 这里主

编程-我这个有不理解的地方帮我讲讲好吗?

问题描述 我这个有不理解的地方帮我讲讲好吗? #include ""mainwindow.h""#include ""ui_mainwindow.h""#include <QTextFrame>#include <QDebug>#include <QLineEdit>#include <QDialog>#include <QPushButton>#include &l

HTTP协议是无状态协议,怎么理解

HTTP协议是无状态协议,怎么理解?   Http是一个无状态协议,同一个会话的连续两个请求互相不了解,他们由最新实例化的环境进行解析,除了应用本身可能已经存储在全局对象中的所有信息外,该环境不保存与会话有关的任何信息.  自己的理解,在asp.net里:每次提交服务器的页面没有任何关系,每次记录在页面的信息下次提交是记不住的,(除了应用本身可能已经存储在全局对象中的所有信息外)在.net里实际就是ViewState,ViewState是asp.net中保存页面信息的基本单位,应用时就是保存在控

理解finalize()-析构函数替代者

函数 理解finalize()-析构函数替代者   在许多方面,Java 类似于 C++.Java 的语法非常类似于 C++,Java 有类.方法和数据成员:Java 的类有构造函数: Java 有异常处理.       但是,如果你使用过 C++ 会发现 Java 也丢掉一些可能是你熟悉的特性.这些特性之一就是析构函数.取代使用析构函数,Java 支持finalize() 方法.       在本文中,我们将描述 finalize() 与 C++ 析构函数的区别.另外,我们将创建一个简单的 A