游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3950|回复: 15

请教问题:为什么中间那块有锯齿,怎么给去掉!

[复制链接]

1

主题

11

帖子

11

积分

新手上路

Rank: 1

积分
11
发表于 2009-5-29 17:17:00 | 显示全部楼层 |阅读模式
本人学DirectX编程
两面两张图,一张是
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);
图像完整,
另外一张是出来的游戏界面,对角线方向出现锯齿,如何给去掉?
谢谢
代码如下:
初始化VB
    D3DVIEWPORT9 vp;
    m_pd3dDevice->GetViewport(&vp);

    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();

            if( FAILED( m_pd3dDevice->CreateTexture( 1024, 1024, 1, 0,
                D3DFMT_A8R8G8B8, D3DPOOL_SYSTEMMEM, &m_pMainTexture[2], NULL ) ) )
            {
                return E_FAIL;
            }
    m_pMainTexture 是程序写入图像

            if( FAILED( m_pd3dDevice->CreateTexture( 1024, 1024, 1, 0,
                D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &m_pBackTexture[2], NULL ) ) )
            {
                return E_FAIL;
            }

    m_pBackTexture 是渲染的


    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>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);
        }

1

主题

11

帖子

11

积分

新手上路

Rank: 1

积分
11
 楼主| 发表于 2009-5-31 10:06:00 | 显示全部楼层

Re: 请教问题:为什么中间那块有锯齿,怎么给去掉!

up一下,大侠帮忙看下啊! [em7]

19

主题

638

帖子

638

积分

高级会员

Rank: 4

积分
638
发表于 2009-5-31 10:58:00 | 显示全部楼层

Re:请教问题:为什么中间那块有锯齿,怎么给去掉!

顶点坐标或纹理坐标,有误差,差了那么零点几个像素呗

59

主题

404

帖子

404

积分

中级会员

Rank: 3Rank: 3

积分
404
发表于 2009-5-31 12:14:00 | 显示全部楼层

Re: 请教问题:为什么中间那块有锯齿,怎么给去掉!

恩, 可能是纹理坐标有误

1

主题

11

帖子

11

积分

新手上路

Rank: 1

积分
11
 楼主| 发表于 2009-5-31 21:26: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();

59

主题

404

帖子

404

积分

中级会员

Rank: 3Rank: 3

积分
404
发表于 2009-6-1 12:16:00 | 显示全部楼层

Re: 请教问题:为什么中间那块有锯齿,怎么给去掉!

这位朋友, 我大概知道你的问题在哪了。

有没有发现,你的整个屏幕都破碎了?就是从左下角到右上角的两个三角形都错位了。

是不是你先渲染到一个纹理, 然后再显示到屏幕上?可能在显示到屏幕上这个过程中,纹理坐标设置有问题

1

主题

11

帖子

11

积分

新手上路

Rank: 1

积分
11
 楼主| 发表于 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();
        
    }

5

主题

972

帖子

975

积分

高级会员

Rank: 4

积分
975
发表于 2009-6-1 20:56:00 | 显示全部楼层

Re:请教问题:为什么中间那块有锯齿,怎么给去掉!

会不会是半像素偏移的问题?

1

主题

11

帖子

11

积分

新手上路

Rank: 1

积分
11
 楼主| 发表于 2009-6-2 02:01:00 | 显示全部楼层

Re:请教问题:为什么中间那块有锯齿,怎么给去掉!

半夜醒了,突然之间明白了!(冥冥中谁告诉我的)!因为顶点设置有问题!x,y的width和height都要-1,就行了
CUSTOMVERTEXBACK cvVertices[] =
    {
        {  0.0f,  0.0f,                         0.0f, 1.0f, 0.0f, 0.0f},
        {  (float)vp.Width-1,  0.0f,              0.0f, 1.0f, (float)(((float)vp.Width)/1024.0), 0.0f},
        {  0.0f, (float)vp.Height-1,              0.0f, 1.0f, 0.0f, (float)(((float)vp.Height)/1024.0)},
        {  (float)vp.Width-1, (float)vp.Height-1,   0.0f, 1.0f, (float)(((float)vp.Width)/1024.0), (float)(((float)vp.Height)/1024.0)},
    };
就好了,谢谢大家

1

主题

11

帖子

11

积分

新手上路

Rank: 1

积分
11
 楼主| 发表于 2009-6-2 02:11:00 | 显示全部楼层

Re: 请教问题:为什么中间那块有锯齿,怎么给去掉!

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-20 01:15

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表