zoukankan      html  css  js  c++  java
  • 游戏程序设计DirectX 9

    1,Dirext3D 是图形应用程序的底层接口(api),通过该接口可以直接使用硬件的3D加速性能来渲染三维场景,可以认为Direct3D就是应用程序和硬件设备之间的一个中间媒介。

         REF是Direct3D提供的参考光栅处理功能,它使用软件的方法来实现整个Direct3D的中的api,从而就可以放心的调用哪些硬件不支持但是DX3D支持的特性,

         D3D设备类型:D3DDEVTYPE_HAL标志来指定硬件抽象层,D3DDEVTYPE_REF指定REF设备。

         COM接口都是以I为前缀的,当使用c++编写DX的应用程序的时候许多COM组建方法和属性都可以直接调用,在com技术中可以通过特殊的函数或者com组件的缪戈接口来得

         到另一个com组件的接口,,另外,当完成某个接口的操作而需要释放他们的时候,需要用release来释放。                    

    2,表面缓冲区是像素的矩阵,Direct3D主要使用它来存储二位图像的数据。其实像素数据是存储在一个一维数组里。

        pitch存储区是一个比表面缓冲区大的存储区域。表面缓冲区是pitch存储区的一部分,此外表面缓冲区的宽度和高度以像素为单位,但pitch以字节为单位。

       在Direct3D中用IDirectSurface9 接口来表示表面缓冲区该接口提供直接对缓冲区进行读写的方法,主要的几种方法:

       a,LockRect----通过调用这个方法,可以锁定表面缓冲区并得到一个指向缓冲区的一个指针,在获得表面缓冲区指针后,可以通过指针偏移来读取像素数据。

       b,UnlockRect-----通过LockRect锁定表面缓冲区后,通过该方法接触对表面缓冲区的锁定。

       c,GetDesc-----填充一个用来描述表面缓冲区数据信息的D3DSURFACE_DEC结构从而获得表面缓冲区的信息。

       由于表面缓冲区和pitch存储区的不同,锁定一个表面缓冲区并对数据中某个指定像素进行操作,对于初学者是一个相当复杂的事情。下面通过代码来更好地讲述表面缓冲区的功能,以及如何操作表面缓冲区在程序中锁定了一个表面缓冲区并设置每个像素的颜色为红色。

       

    //假设surface是指向IDirectSurface9的接口指针
    //在实例中每个像素采用32为数据进行描述。
    //得到表面的描述。
    D3DSURFACE_RECT surfaceDesc;
    surface->Getdesc(&surfaceDesc);
    //得到指向数据区的指针
    D3DLOCKED_RECT lockedRect;
    surface->lockrect(&lockedRect,//指向锁定区域的指针
    	              0,//锁定整个表面缓冲区
    				  0);//锁定标志
    //给缓冲区设定颜色
    DWORD *imageData =(DWORD*)lockedRect.pBits;
    for (int i=0;i<surfaceDesc.Height;i++)
    {
    	for (int j=0;j<surfaceDesc.width;j++)
    	{
    		int index=i*lockedRect.pitch/4+j;
    		imageData[index]=0xffff0000;
    	}
    }
    surface->UnlockRect();
    //D3DLOCKED_RECT的定义如下:
    typedef struct _D3DLOCKED_RECT
    {
       INT pitch;//表面缓冲区pitch
       void *pBits;//指向数据区的起始指针
    }D3DLOCKED_RECT;
    

      在这段代码中可以看到与锁定表面缓冲区相关的代码,在程序中使用32位数据来描述每个像素,由于DWORD数据类型也是32位的,这样就可以使用DWORD类型的数据来描述每一个像素。

    3,交换链和页面翻转

         Direct3D维护者一组表面缓冲区,通常是两个或者三个,通常将这组表面缓冲区的组合叫做交换链。通过IDirect3DSwapChain9可以对交换链进行管理 ,因为Direct3D干礼者这个借口,我们很少需要对它进行操作。主要步骤:(1)将显示数据渲染到后缓冲区(2)进行Presenting操作,交换前后缓冲区(3)goto(1)

    4,深度缓冲区

          深度缓冲区也是一个表面缓冲区,但是在深度缓冲区中不是保存图片信息,而是保存着每个像素点对应的深度信息,最终图片的每个像素都对应 一个深度缓冲区中的一个数据元素,如果显然的图片有640*480个像素,则在深度缓冲区中有640*480个数据元素。、

          例如在显式遮挡关系的物体时,深度缓冲通过运算,判断是否需要在屏幕上显式像素,对于需要显式的像素,判断在对应位置上是否已经有深度更小的其他物体的像素。因为离摄像机越近的物体需要渲染的像素深度往往较小,当渲染的时候只将所有同一位置上具有最小深度的物体的像素渲染到屏幕表面,这样离摄像机较远的物体的像素就不会被渲染,渲染出来的像素属于离摄像机较近的物体,从而反映出物体之间的遮挡关系。

    5,顶点处理

          顶点是组成3D空间的基本元素,在Direct3D中对顶点的处理有两种方法,即软件处理方法和硬件处理方法,软件顶点处理在任何配置下都是被支持的,并且也都可用,但硬件顶点处理只有在显卡支持硬件顶点处理的情况下才可以使用

          硬件顶点处理应该是程序设计的首选方法,因为硬件肯定要比软件快,同时在硬件中进行顶点处理不占cpu资源,cpu在顶点处理的同时就可以进行其他计算。 

  • 相关阅读:
    人工智能深度学习:TensorFlow2.0如何保持和读取模型?
    人工智能深度学习:TensorFlow2.0实现回归问题
    InnoDB存储引擎中的锁
    Spring源码系列8
    Spring源码系列7
    Spring源码系列6
    Spring源码系列5
    Spring源码系列4
    Spring源码系列3
    Spring源码系列2
  • 原文地址:https://www.cnblogs.com/sunshinewave/p/2689850.html
Copyright © 2011-2022 走看看