专职C++

不能停止的脚步

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  156 Posts :: 7 Stories :: 135 Comments :: 0 Trackbacks

常用链接

留言簿(13)

我参与的团队

搜索

  •  

最新评论

阅读排行榜

评论排行榜

  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 }

posted on 2010-02-04 11:36 冬瓜 阅读(1650) 评论(0)  编辑 收藏 引用 所属分类: 原创DirectXHGE

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理