HGE的_Gfx_Init注释

HGE的_Gfx_Init注释
  1  // D3D初始化
  2  bool  HGE_Impl::_GfxInit()
  3  {
  4       static   const   char   * szFormats[] = { " UNKNOWN " " R5G6B5 " " X1R5G5B5 " " A1R5G5B5 " " X8R8G8B8 " " A8R8G8B8 " };   // 颜色格式串
  5      D3DADAPTER_IDENTIFIER8 AdID;   // D3D设备ID
  6      D3DDISPLAYMODE Mode;           // 显示模式
  7      D3DFORMAT Format = D3DFMT_UNKNOWN;   // 颜色格式
  8      UINT nModes, i;
  9      
 10  //  Init D3D
 11       // 创建dx8对象                        
 12      pD3D = Direct3DCreate8( 120 );  //  D3D_SDK_VERSION
 13       if (pD3D == NULL)
 14      {
 15          _PostError( " Can't create D3D interface " );
 16           return   false ;
 17      }
 18 
 19  //  Get adapter info
 20       // 取显卡信息
 21      pD3D -> GetAdapterIdentifier(D3DADAPTER_DEFAULT, D3DENUM_NO_WHQL_LEVEL,  & AdID);
 22      System_Log( " D3D Driver: %s " ,AdID.Driver);
 23      System_Log( " Description: %s " ,AdID.Description);
 24      System_Log( " Version: %d.%d.%d.%d " ,
 25              HIWORD(AdID.DriverVersion.HighPart),
 26              LOWORD(AdID.DriverVersion.HighPart),
 27              HIWORD(AdID.DriverVersion.LowPart),
 28              LOWORD(AdID.DriverVersion.LowPart));
 29 
 30  //  Set up Windowed presentation parameters
 31       // 设置窗口模式参数
 32       // 取显卡模式
 33       if (FAILED(pD3D -> GetAdapterDisplayMode(D3DADAPTER_DEFAULT,  & Mode))  ||  Mode.Format == D3DFMT_UNKNOWN) 
 34      {
 35           // 如果pD3D->GetAdapterDisplayMode被成功调用后,会设置Mode,所以Mode.Format==D3DFMT_UNKNOWN是有效的。
 36           // 如果取模式失败,或者取得模式后,得到的格式为D3DFMT_UNKNOWN,则失败。
 37          _PostError( " Can't determine desktop video mode " );
 38           if (bWindowed)  return   false ;
 39      }
 40      
 41      ZeroMemory( & d3dppW,  sizeof (d3dppW));
 42       // 设置后台缓冲
 43      d3dppW.BackBufferWidth   =  nScreenWidth;         // 后台缓存的宽度,像素为单位
 44      d3dppW.BackBufferHeight  =  nScreenHeight;     // 后台缓存的高度,像素为单位
 45      d3dppW.BackBufferFormat  =  Mode.Format;         // 像素格式
 46      d3dppW.BackBufferCount   =   1 ;                 // 后台缓存的个数
 47 
 48      d3dppW.MultiSampleType   =  D3DMULTISAMPLE_NONE;   // 指定多重采样类型,用于图型抗锯齿,在这里表示不抗锯齿
 49      d3dppW.hDeviceWindow     =  hwnd;                 // 指定的绘图窗口    
 50      d3dppW.Windowed          =  TRUE;                 // 显示方式,TRUE表示以窗口方式,FALSE表示以全屏方式
 51 
 52       // d3dppW.SwapEffect 设置后台到前台的方式
 53       if (nHGEFPS == HGEFPS_VSYNC) d3dppW.SwapEffect  =  D3DSWAPEFFECT_COPY_VSYNC;    // D3DSWAPEFFECT_COPY_VSYNC时值为4用来说明只有一个后缓冲区,并执行COPY操作,该值在DX9中,已经没有了
 54       else                       d3dppW.SwapEffect  =  D3DSWAPEFFECT_COPY;          // 当后台缓存为1时有用,将后台复制到前台,后台不变
 55 
 56       if (bZBuffer)  // 如果使用深度缓存
 57      {
 58          d3dppW.EnableAutoDepthStencil  =  TRUE;   // 创建并管理一个深度缓存
 59          d3dppW.AutoDepthStencilFormat  =  D3DFMT_D16;   // 表示深度值为16位二进制表示
 60      }
 61 
 62  //  Set up Full Screen presentation parameters
 63       // 下面是设置全屏模式
 64      nModes = pD3D -> GetAdapterModeCount(D3DADAPTER_DEFAULT);  // 取设备模式的个数
 65 
 66       for (i = 0 ; i < nModes; i ++ // 依次取出所有模式,并找出Mode.Format的最高值,并放到Format中
 67      {
 68          pD3D -> EnumAdapterModes(D3DADAPTER_DEFAULT, i,  & Mode);  // 取得第I个模式的信息
 69           if (Mode.Width  !=  (UINT)nScreenWidth  ||  Mode.Height  !=  (UINT)nScreenHeight)  continue ;
 70           if (nScreenBPP == 16   &&  (_format_id(Mode.Format)  >  _format_id(D3DFMT_A1R5G5B5)))  continue ;
 71           if (_format_id(Mode.Format)  >  _format_id(Format)) Format = Mode.Format;
 72      }
 73 
 74       if (Format  ==  D3DFMT_UNKNOWN)
 75      {
 76          _PostError( " Can't find appropriate full screen video mode " );
 77           if ( ! bWindowed)  return   false ;
 78      }
 79 
 80      ZeroMemory( & d3dppFS,  sizeof (d3dppFS));
 81      
 82      d3dppFS.BackBufferWidth   =  nScreenWidth;  // 后台缓存的宽度,像素为单位
 83      d3dppFS.BackBufferHeight  =  nScreenHeight; // 后台缓存的高度,像素为单位
 84      d3dppFS.BackBufferFormat  =  Format;          // 像素格式
 85      d3dppFS.BackBufferCount   =   1 ;              // 后台缓存的个数
 86      d3dppFS.MultiSampleType   =  D3DMULTISAMPLE_NONE;  // 指定多重采样类型,用于图型抗锯齿,在这里表示不抗锯齿
 87      d3dppFS.hDeviceWindow     =  hwnd;         // 指定的绘图窗口    
 88      d3dppFS.Windowed          =  FALSE;        // 显示方式,TRUE表示以窗口方式,FALSE表示以全屏方式
 89 
 90      d3dppFS.SwapEffect        =  D3DSWAPEFFECT_FLIP;   // 后台复制到前台,缓存不变。缓存数大于1时使用。这里好像有点不对
 91      d3dppFS.FullScreen_RefreshRateInHz  =  D3DPRESENT_RATE_DEFAULT;   // 屏幕屏新频率,一般使用显示器默认的就可以了。
 92 
 93       if (nHGEFPS == HGEFPS_VSYNC) d3dppFS.FullScreen_PresentationInterval  =  D3DPRESENT_INTERVAL_ONE;       // 前台与后台缓存交换频率
 94       else                       d3dppFS.FullScreen_PresentationInterval  =  D3DPRESENT_INTERVAL_IMMEDIATE;
 95 
 96       if (bZBuffer)
 97      {
 98          d3dppFS.EnableAutoDepthStencil  =  TRUE;             // 创建并管理一个深度缓存
 99          d3dppFS.AutoDepthStencilFormat  =  D3DFMT_D16;     // 表示深度值为16位二进制表示
100      }
101 
102      d3dpp  =  bWindowed  ?   & d3dppW :  & d3dppFS;  // 根据窗口选择d3dpp
103 
104       if (_format_id(d3dpp -> BackBufferFormat)  <   4 ) nScreenBPP = 16 // Screen Bitdepth,在窗口模式下,该值无效。将使用系统自带的
105       else  nScreenBPP = 32 ;
106      
107  //  Create D3D Device
108       // 创建设备
109       if ( FAILED( pD3D -> CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd,
110                                    D3DCREATE_SOFTWARE_VERTEXPROCESSING,
111                                    d3dpp,  & pD3DDevice ) ) )
112      {
113          _PostError( " Can't create D3D device " );
114           return   false ;
115      }
116       // 调整窗口
117      _AdjustWindow();
118 
119      System_Log( " Mode: %d x %d x %s\n " ,nScreenWidth,nScreenHeight,szFormats[_format_id(Format)]);
120 
121  //  Create vertex batch buffer
122 
123      VertArray = 0 ;   // 批量顶点缓冲区指针,将会在Gfx_BeginScene末尾Lock该值。
124      textures = 0 ;
125 
126  //  Init all stuff that can be lost
127       // 设置投影Matrix
128      _SetProjectionMatrix(nScreenWidth, nScreenHeight);
129       // 创建一个单位Matrix
130      D3DXMatrixIdentity( & matView);
131       // 初始化缓冲区,_init_lost也在设备、资源丢失的时候,使用。
132       if ( ! _init_lost())  return   false ;
133      Gfx_Clear( 0 );  // 清屏到指定颜色,在这里是黑色。
134       return   true ;
135  }

你可能感兴趣的:(HGE的_Gfx_Init注释)