1.如你所知,显示在屏幕上的图像仅仅只是是以某种格式存储在内存中的有色像素组成的矩阵。或是调色板化的或是RGB模式的。在不论什么一种情况下。要想做点什么你都必须知道如何绘制图到内存中,然而DirectDraw的设计者决定将显存的概念予以抽象,从而不管你的系统中的显卡有多么古怪,訪问视频表面的方法都是一样的。因此DirectDraw支持显示表面。

2.显示表面是能存储位图数据的矩形内存区域。有两种显示表面:主显示表面和从显示表面。

I. 主显示表面直接相当于被显卡光栅画的实际显存,而不论什么时候都是可见的。不论什么DirectDraw程序里都仅仅能有一个主显示表面,它直接指向屏幕图像并常驻VRAM(显存,帧存储器)。

II.从显示表面更灵活,大小随意,内存同意可随意创建。

用途:

A. 创建一或两个从表面它们总是和主显示表面有相同地色彩深度和几何分布。

当用下一个动画帧更新这些离屏面,然后迅速的拷贝或是用换页技术将离屏面切换到主显示面能够达到平滑显示动画的目的。

这称为双缓冲或三缓冲。

B.保存你的位图图像和游戏中的表示对象的动画。仅仅有使用DirectDraw显示表面才干调用使用于位图数据的硬件加速。

3.创建一个主题显示表面

A. 步骤:

     I.填充一个 DDSURFACEDESC2 数据结构,描写叙述你所希望创建的显示表面

     II.调用IDirectDraw7::CreareSurface()来创建显示表面。

DDSURFACEDESC2的结构

	typedef struct _DDSURFACEDESC2
{
DWORD dwSize;
DWORD dwFlags;
DWORD dwHeight;
DWORD dwWidth;
union
{
LONG lPitch;
DWORD dwLinearSize;
} DUMMYUNIONNAMEN(1);
DWORD dwBackBufferCount;
union
{
DWORD dwMopMapCount;
DWORDdwRefreshRate;
} DUMMYUNIONNAMEN(2)
DWORD dwAlphaBitDepth;
DWORD dwReserved;
LPVOID lpSurface;
DDCOLORKEY ddckCKDestOverlay;
DDCOLORKEY ddckCKDestBLt;
DDCOLORKEY ddckCKSrcOverlay;
DDCOLORKEY ddckCKSrcBlt;
DDCOLORKEY ddpfPixelFormat;
DDSCAPS2 ddsCaps;
DWORD dwTextureStage;
} DDSURFACEDESC2,FAR* LPDDSURFACEDESC2;

重要结构解释:

dwSize:全部Direct数据结构里面最重要的域,保存结构大小的字符。

     dwFlags:指示数据填充域或操作接受域。

     dwWidth:表面以像素计的宽度

     dwHeight:表面以像素计的高度。

     lPitch:显示模式的水平内存距离。

     lpSurface:这个域用于获取指向你所创建的显示面驻留的实际内存的指针。

dwBackBufferCount:这个域用于设置或是读取后备缓冲。

ddckCKDestBLt:这个域用于控制目标色键。即在位块传输操作中控制能够写入的色彩部件。

     ddckCKSrcBlt:这个域用于指示源色键,即基本上是运行位图操作时你不希望进行位块传输的颜色。

     ddpfPixelFormat:这个域用于获取显示表面的像素格式。

     ddsCaps:这个域用于返回你所请求的显示表面的一些未在别处定义的属性。

B.创建显示表面

 LPDDSURFACEDESC2 ddsd;
memset(&ddsd,0,sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_CAPS;
ddsd.ddsCaps = DDSCAPS_PRIMARYSURFACE; if(FAILED(lpdd -> CreareSurface(&ddsd,&lpddsprimary,NULL)))
{
//ERROR
}

若函数调用成功,lpddsprimary会指向新的显示表面接口。

《Windows游戏编程大师技巧》学习笔记——关于创建显示表面的更多相关文章

  1. Windows游戏编程大师技巧之三角形填充

    一.三角形的种类 三角形一般可以分为如下的四种类型(这四种类型是对于计算机来说的,不是数学意义上的分类): 平顶三角形:就是在计算机中显示的上面两个顶点的Y坐标相同. 平底三角形:就是在计算机中显示的 ...

  2. 《逐梦旅程 WINDOWS游戏编程之从零开始》笔记1——创建窗口&GDI

    第1章 创建窗口 步骤: 窗口类的设计 窗口类的注册 窗口的正式创建 窗口的显示与更新 消息循环体系 窗口过程函数处理消息 1. 设计:使用WNDCLASSEX结构体,这里注意的是C++中的结构体中的 ...

  3. 3D游戏编程大师技巧──2D引擎的编译问题

    接上一篇文章,这里将介绍2D引擎的编译,从现在开始才真正进入<3D游戏编程大师技巧>的学习.本书的第一.二章只是简介了游戏编程和windows编程,从第三章开始才是介绍<window ...

  4. 3D游戏编程大师技巧──环境搭建

    刚开微博,想借助这个平台与大家交流,写下自己的学习记录,希望得到大家的批评指正. 好了,进入主题.这段时间对游戏编程很感兴趣,于是在网友的推荐下开始学习<3D游戏编程大师技巧>这本书.今天 ...

  5. 《逐梦旅程 WINDOWS游戏编程之从零开始》笔记5——Direct3D中的顶点缓存和索引缓存

    第12章 Direct3D绘制基础 1. 顶点缓存 计算机所描绘的3D图形是通过多边形网格来构成的,网网格勾勒出轮廓,然后在网格轮廓的表面上贴上相应的图片,这样就构成了一个3D模型.三角形网格是构建物 ...

  6. 《逐梦旅程 WINDOWS游戏编程之从零开始》笔记2——透明贴图,动画技术

    第5章 透明贴图 像这样直接贴图会产生这种情况,所以我们需要透明贴图. 透明遮罩法:主要利用BitBlt函数中Raser(光栅)值的运算,需要准备素材图和遮罩图: 这个方法的原理解释见书131页. 示 ...

  7. 《逐梦旅程 WINDOWS游戏编程之从零开始》笔记3——输入消息处理,物理建模与粒子系统初步

    第7章 Windows游戏输入消息处理 1. 键盘消息处理 之前提到的窗口过程函数有两参数与消息输出有关——wParam和llParam LRESULT CALLBACK WindowProc( _I ...

  8. 《逐梦旅程 WINDOWS游戏编程之从零开始》笔记4——Direct3D编程基础

    第11章 Direct3D编程基础 2D游戏是贴图的艺术,3D游戏是渲染的艺术.这句话在我学过了之前的GDI编程之后,前一句算是有所体会,现在是来理解后一句的时候了. 安装DirectX SDK配置啥 ...

  9. 《逐梦旅程 WINDOWS游戏编程之从零开始》笔记10——三维天空的构建&三维粒子的实现&多游戏模型的载入

    第23章 三维天空的构建 目前描述三维天空的技术主要包括三种类型,直接来介绍使用最广泛的模拟技术,详细的描述可以见作者的博文. 天空盒(Sky Box),即放到场景的是一个立方体.它是目前使用最广泛的 ...

随机推荐

  1. JRE与JVM、JDK的区别

    JRE与JVM.JDK的区别 一. 详细介绍1.JVM -- java virtual machine JVM就是我们常说的java虚拟机,它是整个java实现跨平台的 最核心的部分,所有的java程 ...

  2. mysql中,由于JDBC连接限制了最大包长度1024B,即1KB,报错“max_allowed_packet' ”

    报错:org.springframework.dao.TransientDataAccessResourceException: PreparedStatementCallback; SQL [INS ...

  3. iOS Mapkit 定位REGcode地理位置偏移

    在iOS上,使用系统Mapkit定位,获取到的坐标会有偏移: 今有需求,用系统Mapkit定位,并Regcode出实际地理位置,修正偏移: 解决方案: 使用MapView的代理 - (void)map ...

  4. 《Java程序猿面试笔试宝典》之 什么是AOP

    AOP(Aspect-Oriented Programming.面向切面编程)是对面向对象开发的一种补充,它同意开发者在不改变原来模型的基础上动态地改动模型从而满足新的需求.比如.在不改变原来业务逻辑 ...

  5. 算法笔记_084:蓝桥杯练习 11-1实现strcmp函数(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 自己实现一个比较字符串大小的函数,也即实现strcmp函数.函数:int myStrcmp(char *s1,char *s2) 按照AS ...

  6. 运用Unity结合PolicyInjection实现拦截器[结合操作日志实例]

    上一篇文章我们通过Unity自身Unity.InterceptionExtension.IInterceptionBehavior实现一个有系统关异常日志记录:解决代码中到处充满的异常记录的代码: 本 ...

  7. ES6 let用法

    1.实现块作用域 2.不存在变量提升. ES6 明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域.凡是在声明之前就使用这些变量,就会报错.

  8. 【服务器时间修改为东八区】包括Apache2和mysql

    1.服务器Apache时间修改,可通过修改php.ini进行修改 所以就深入了解了一下, 发现Apache(PHP)的服务器时间时区默认为UTC(Coordinated UniversalTime 世 ...

  9. BAT特殊字符(转)

    BAT特殊字符1. 点 与echo连用,作用是换行 示例1 [输出空行] echo. 2 > 定向符[输出] 将命令的输出进行重定向 [一般用于将结果写入文件] 注意 nul 为空设备 > ...

  10. Groovy小结:java调用Groovy方法并传递参数

    Groovy小结:java调用Groovy方法并传递参数 @(JAVA总结) 1. 场景描述 在网上查了资料发现,java有三种方式调用groovy脚本.但是真正在实际的服务器环境中,嵌入groovy ...