zoukankan      html  css  js  c++  java
  • 《Windows游戏编程大师技巧》学习笔记——关于创建显示表面

    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会指向新的显示表面接口。

  • 相关阅读:
    结对四则运算04—网页版
    每周总结07
    每周总结06
    求循环数组中最大子数组的和
    每周总结05
    每周总结03
    每周总结04
    四则运算03
    开发过程记录
    Ubuntu下安装mysql和可视化工具超级简单教程
  • 原文地址:https://www.cnblogs.com/tlnshuju/p/6828849.html
Copyright © 2011-2022 走看看