|
|

楼主 |
发表于 2009-6-1 20:02:00
|
显示全部楼层
Re:请教问题:为什么中间那块有锯齿,怎么给去掉!
我的顶点代码如下,我的纹理是个1024X1024
CUSTOMVERTEXBACK cvVertices[] =
{
{ 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f},
{ (float)vp.Width, 0.0f, 0.0f, 1.0f, (float)(((float)vp.Width)/1024.0), 0.0f},
{ 0.0f, (float)vp.Height, 0.0f, 1.0f, 0.0f, (float)(((float)vp.Height)/1024.0)},
{ (float)vp.Width, (float)vp.Height, 0.0f, 1.0f, (float)(((float)vp.Width)/1024.0), (float)(((float)vp.Height)/1024.0)},
};
DWORD dwSizeofVertices = sizeof(cvVertices);
SAFE_RELEASE(m_pVBBackBuffer);
if( FAILED( m_pd3dDevice->CreateVertexBuffer( dwSizeofVertices,
D3DUSAGE_WRITEONLY, D3DFVF_CUSTOMVERTEXBACK,
D3DPOOL_MANAGED, &m_pVBBackBuffer ,NULL) ) )
return E_FAIL;
VOID* pVertices;
if( FAILED( m_pVBBackBuffer->Lock( 0, 0, (void**)&pVertices, 0 ) ) )
return E_FAIL;
memcpy( pVertices, cvVertices, dwSizeofVertices);
m_pVBBackBuffer->Unlock();
先渲染到一个纹理上,该纹理打印出图形文件没问题,
我做法是,先生成几个1024X1024的纹理,将游戏图形分层渲染到这几个纹理上,然后在一并渲染出来,
公用一个顶点,就是上面那个顶点坐标
渲染代码如下
if(m_nMainTextureCnt>0 && m_pBackInvalidate[0])
{
m_pd3dDevice->UpdateTexture(m_pMainTexture[0],m_pBackTexture[0]);
m_pBackInvalidate[0]=FALSE;
/*if(m_nMainTextureCnt>1)
{
sprintf(temp,"c:\\text0.jpg");
D3DXSaveTextureToFile(temp,D3DXIFF_JPG,m_pBackTexture[0],NULL);
}
*/
}
if(m_nMainTextureCnt>1 && m_pBackInvalidate[1])
{
m_pd3dDevice->UpdateTexture(m_pMainTexture[1],m_pBackTexture[1]);
m_pBackInvalidate[1]=FALSE;
/*
sprintf(temp,"c:\\text1.jpg");
D3DXSaveTextureToFile(temp,D3DXIFF_JPG,m_pBackTexture[1],NULL);
*/
}
if(m_nMainTextureCnt>2 && m_pBackInvalidate[2])
{
m_pd3dDevice->UpdateTexture(m_pMainTexture[2],m_pBackTexture[2]);
m_pBackInvalidate[2]=FALSE;
//char temp[256];
//static int cuc=0;
//sprintf(temp,"c:\\text2_%03d.jpg",cuc++);
//D3DXSaveTextureToFile(temp,D3DXIFF_JPG,m_pBackTexture[2],NULL);
}
if(m_nMainTextureCnt>3 && m_pBackInvalidate[3])
{
m_pd3dDevice->UpdateTexture(m_pMainTexture[3],m_pBackTexture[3]);
m_pBackInvalidate[3]=FALSE;
/*
static int text3=0;
static DWORD text3_t1 = 0;
static DWORD text3_t2 = 0;
char temp[100];
text3_t2 = GetTickCount();
if((text3_t2 - text3_t1)>3000)
{
sprintf(temp,"c:\\text3_%d.jpg",text3);
D3DXSaveTextureToFile(temp,D3DXIFF_JPG,m_pMainTexture[3],NULL);
text3++;
text3_t1 = text3_t2;
}
*/
}
if( SUCCEEDED( m_pd3dDevice->BeginScene() ) )
{
m_pd3dDevice->Clear( 0L, NULL, D3DCLEAR_TARGET , 0x00000000, 0.1f, 0L );
// TODO: render worldShowStatus(30,30);
if(m_nMainTextureCnt>0 )
{
m_pd3dDevice->SetTexture( 0, m_pBackTexture[0]);
m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE );
m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
m_pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_DISABLE );
m_pd3dDevice->SetStreamSource( 0, m_pVBBackBuffer, 0, sizeof(CUSTOMVERTEXBACK) );
m_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEXBACK );
m_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 2 );
}
//m_pParticleSystem->Render( m_pd3dDevice );
//if(m_xSnow.GetShowTag())m_xSnow.RenderSystem(g_xMainWnd.Get3DDevice());
if(m_nMainTextureCnt>1)
{
m_pd3dDevice->SetTexture( 0, m_pBackTexture[1] );
//设置alpha值(把纹理alpha和顶点alpha进行乘法运算)
m_pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,FALSE);
m_pd3dDevice->SetTextureStageState(0,D3DTSS_ALPHAARG1, D3DTA_TEXTURE );
m_pd3dDevice->SetTextureStageState(0,D3DTSS_ALPHAARG2, D3DTA_DIFFUSE );
m_pd3dDevice->SetTextureStageState(0,D3DTSS_ALPHAOP,D3DTOP_DISABLE);
if( m_d3dCaps.AlphaCmpCaps & D3DPCMPCAPS_GREATEREQUAL )
{
m_pd3dDevice->SetTextureStageState(0,D3DTSS_ALPHAOP,D3DTOP_SELECTARG1);
m_pd3dDevice->SetRenderState(D3DRS_ALPHATESTENABLE, TRUE );
m_pd3dDevice->SetRenderState(D3DRS_ALPHAREF, 0x1 );
m_pd3dDevice->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL );
}
m_pd3dDevice->SetStreamSource( 0, m_pVBBackBuffer, 0, sizeof(CUSTOMVERTEXBACK) );
m_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEXBACK);
m_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 2 );
}
if(m_nMainTextureCnt>2)
{
m_pd3dDevice->SetTexture( 0, m_pBackTexture[2]);
m_pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,TRUE);
m_pd3dDevice->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_SRCALPHA);
m_pd3dDevice->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA);
m_pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );
m_pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE );
m_pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE );
if( m_d3dCaps.AlphaCmpCaps & D3DPCMPCAPS_GREATEREQUAL )
{
m_pd3dDevice->SetTextureStageState(0,D3DTSS_ALPHAOP,D3DTOP_SELECTARG1);
m_pd3dDevice->SetRenderState(D3DRS_ALPHATESTENABLE, TRUE );
m_pd3dDevice->SetRenderState(D3DRS_ALPHAREF, 0x1 );
m_pd3dDevice->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL );
}
m_pd3dDevice->SetStreamSource( 0, m_pVBBackBuffer, 0, sizeof(CUSTOMVERTEXBACK) );
m_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEXBACK );
m_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 2 );
m_pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,FALSE);
}
if(m_nMainTextureCnt>3)
{
m_pd3dDevice->SetTexture( 0, m_pBackTexture[3] );
//设置alpha值(把纹理alpha和顶点alpha进行乘法运算)
m_pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,FALSE);
m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE );
m_pd3dDevice->SetTextureStageState(0,D3DTSS_ALPHAARG1, D3DTA_TEXTURE );
m_pd3dDevice->SetTextureStageState(0,D3DTSS_ALPHAARG2, D3DTA_DIFFUSE );
m_pd3dDevice->SetTextureStageState(0,D3DTSS_ALPHAOP,D3DTOP_DISABLE);
if( m_d3dCaps.AlphaCmpCaps & D3DPCMPCAPS_GREATEREQUAL )
{
m_pd3dDevice->SetTextureStageState(0,D3DTSS_ALPHAOP,D3DTOP_SELECTARG1);
m_pd3dDevice->SetRenderState(D3DRS_ALPHATESTENABLE, TRUE );
m_pd3dDevice->SetRenderState(D3DRS_ALPHAREF, 0x1 );
m_pd3dDevice->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL );
}
m_pd3dDevice->SetStreamSource( 0, m_pVBBackBuffer, 0, sizeof(CUSTOMVERTEXBACK) );
m_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEXBACK);
m_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 2 );
}
//ShowStatus(0,0);
RenderText();
//ShowStatus(0,100);
m_pd3dDevice->EndScene();
}
|
|