HGE 注释:_init_lost

HGE 注释:_init_lost
  1  bool  HGE_Impl::_init_lost()
  2   {
  3       CRenderTargetList *target=pTargets;
  4  
  5   // Store render target
  6       //屏幕表面    
  7       pScreenSurf=0;
  8        //屏幕深度
  9       pScreenDepth=0;
 10  
 11       pD3DDevice->GetRenderTarget(&pScreenSurf);  //取渲染目标表面,这个函数在DX9有些变化
 12       pD3DDevice->GetDepthStencilSurface(&pScreenDepth);  //取屏幕深度
 13       //当存在渲染目标时
 14        while (target)
 15       {
 16            //如果目标纹理存在,则重新创建纹理
 17            if (target->pTex)
 18               D3DXCreateTexture(pD3DDevice, target->width, target->height, 1, D3DUSAGE_RENDERTARGET,
 19                                 d3dpp->BackBufferFormat, D3DPOOL_DEFAULT, &target->pTex);
 20            //如果深度存在,则重新创建深度表面
 21            if (target->pDepth)
 22               pD3DDevice->CreateDepthStencilSurface(target->width, target->height,
 23                                                     D3DFMT_D16, D3DMULTISAMPLE_NONE, &target->pDepth);
 24           target=target->next;
 25       }
 26  
 27   // Create Vertex buffer
 28       //创建顶点缓存
 29        if ( FAILED (pD3DDevice->CreateVertexBuffer(VERTEX_BUFFER_SIZE* sizeof (hgeVertex),
 30                                                 D3DUSAGE_WRITEONLY,
 31                                                 D3DFVF_HGEVERTEX,
 32                                                 D3DPOOL_DEFAULT, &pVB )))
 33       {
 34           _PostError("Can't create D3D vertex buffer");
 35            return   false ;
 36       }
 37        //设置顶点格式,在Dx9中,将DX8的这个函数SetVertexShader分成了SetVertexShader和SetFVF
 38       //在DX9中,我们只需要使用SetFVF就可以设置顶点格式了
 39       pD3DDevice->SetVertexShader( D3DFVF_HGEVERTEX );
 40        //把一个顶点缓存绑定到一个设备数据流
 41       pD3DDevice->SetStreamSource( 0, pVB,  sizeof (hgeVertex) );
 42  
 43   // Create and setup Index buffer
 44       //创建索引缓存
 45        if ( FAILED( pD3DDevice->CreateIndexBuffer(VERTEX_BUFFER_SIZE*6/4* sizeof (WORD),
 46                                                 D3DUSAGE_WRITEONLY,
 47                                                 D3DFMT_INDEX16,
 48                                                 D3DPOOL_DEFAULT, &pIB ) ) )
 49       {
 50           _PostError("Can't create D3D index buffer");
 51            return   false ;
 52       }
 53        //锁定顶点缓存
 54       WORD *pIndices, n=0;
 55        if ( FAILED( pIB->Lock( 0, 0, (BYTE**)&pIndices, 0 ) ) )
 56       {
 57           _PostError("Can't lock D3D index buffer");
 58            return   false ;
 59       }
 60        //建立索引 这里主要是针对hgeQuad的方式。DX中没有四边形图元,所以这里是由两个三角形拼起来的。
 61       //绘制三角形的时候,默认是逆时针方向绘三个顶点
 62        for ( int  i=0; i<VERTEX_BUFFER_SIZE/4; i++) {
 63            /*
 64               第一个三角形
 65               pIndices[0] = n;
 66               pIndices[1] = n+1;
 67               pIndices[2] = n+2;
 68            */
 69           *pIndices++=n;
 70           *pIndices++=n+1;
 71           *pIndices++=n+2;
 72            /*
 73               第二个三角形
 74               pIndices[0] = n+2;
 75               pIndices[1] = n+3;
 76               pIndices[2] = n;
 77            */
 78           *pIndices++=n+2;
 79           *pIndices++=n+3;
 80           *pIndices++=n;
 81           n+=4;
 82       }
 83       pIB->Unlock();
 84       pD3DDevice->SetIndices(pIB,0);
 85  
 86        // Set common render states
 87       //设置通用渲染状态
 88  
 89       //pD3DDevice->SetRenderState( D3DRS_LASTPIXEL, FALSE );
 90       //D3DRS_CULLMODE 这个参数用来指定三角形背面的剔除方式。
 91       //D3DCULL_NONE,不要剔除背面;
 92       //D3DCULL_CW,按照顺时针的方向的顶点剔除背面;
 93       //D3DCULL_CCW,按照逆时针方向剔除背面。
 94       pD3DDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );
 95        //关闭光照
 96       pD3DDevice->SetRenderState( D3DRS_LIGHTING, FALSE );
 97        //打开alpha通道
 98       pD3DDevice->SetRenderState( D3DRS_ALPHABLENDENABLE,   TRUE );
 99        //下面设置alpha混合系数
100       pD3DDevice->SetRenderState( D3DRS_SRCBLEND,  D3DBLEND_SRCALPHA );     //设置源混合方式 D3DBLEND_SRCALPHA:Blend factor is (As, As, As, As). 
101       pD3DDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );  //设置目的混合方式 D3DBLEND_INVSRCALPHA:Blend factor is ( 1 - As, 1 - As, 1 - As, 1 - As). 
102  
103       //调用alpha测试,用于提升性能
104       pD3DDevice->SetRenderState( D3DRS_ALPHATESTENABLE, TRUE );
105        //测试参考值,0x01相当于对于全透明的,将不渲染
106       pD3DDevice->SetRenderState( D3DRS_ALPHAREF,        0x01 );
107        //要求渲染>=参考值的像素
108       pD3DDevice->SetRenderState( D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL );
109  
110        //设置状态    
111       //纹理融合操作 
112       pD3DDevice->SetTextureStageState( 0, D3DTSS_COLOROP,   D3DTOP_MODULATE );   //设置颜色通道混合控制为:多参数
113       pD3DDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );     //
114       pD3DDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
115       
116       pD3DDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP,   D3DTOP_MODULATE );   /// /设置alpha通道混合控制为:多参数
117       pD3DDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );
118       pD3DDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE );
119        //D3DTSS_MIPFILTER过滤采用近点采样
120       pD3DDevice->SetTextureStageState(0, D3DTSS_MIPFILTER, D3DTEXF_POINT);
121  
122        if (bTextureFilter)  //如果使用纹理过滤
123       {
124           pD3DDevice->SetTextureStageState(0,D3DTSS_MAGFILTER,D3DTEXF_LINEAR);
125           pD3DDevice->SetTextureStageState(0,D3DTSS_MINFILTER,D3DTEXF_LINEAR);
126       }
127        else
128       {
129           pD3DDevice->SetTextureStageState(0,D3DTSS_MAGFILTER,D3DTEXF_POINT);
130           pD3DDevice->SetTextureStageState(0,D3DTSS_MINFILTER,D3DTEXF_POINT);
131       }
132  
133       nPrim=0;
134       CurPrimType=HGEPRIM_QUADS;     //当前主要操作类型
135       CurBlendMode = BLEND_DEFAULT;  //当前混合方式
136       CurTexture = NULL;               //当前纹理
137  
138       pD3DDevice->SetTransform(D3DTS_VIEW, &matView);   //设置视图,该值为默认值,没有变化
139       pD3DDevice->SetTransform(D3DTS_PROJECTION, &matProj);  //设置投影,已设为正交投影,具体参考我前面的散笔: HGE 的坐标转换函数注释说明_SetProjectionMatrix 140  
141        return   true ;
142   }

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