Мерцание сглаженного backbuffer в DX9 - PullRequest
0 голосов
/ 26 февраля 2020

Я пытаюсь отобразить прозрачную серую сцену как индикатор смерти, и у меня возникают проблемы с мерцанием, только когда включена мультисэмплинг! Я попытался загрузить текстуру из файла вместо того, чтобы иметь ее сырой, как сейчас, и я также пробовал разные эффекты свопинга и разные типы msaa, но ни один из них не работал. Я думал, что это может быть что-то с устройством ясно, но, как я смотрю на это все должно быть хорошо. Чтобы быть уверенным, я проверяю, поддерживается ли мультисэмплинг и есть ли он на самом деле. Я понятия не имею, где проблема может быть: / Каждая помощь будет с благодарностью оценена :) Изображение, иллюстрирующее проблему

    static PVERTEX vMESH[] = {
        { -0.5f, 0.0f,  0.5f, 0.0f, 0.0f},
        {  0.5f, 0.0f,  0.5f, 1.0f, 0.0f},
        { -0.5f, 0.0f, -0.5f, 0.0f, 1.0f},
        {  0.5f, 0.0f, -0.5f, 1.0f, 1.0f}};
    LPVOID pDATA = NULL;

    m_pDevice->CreateVertexBuffer(
        4 * sizeof(PVERTEX),
        0, T3DFVF_PVERTEX,
        D3DPOOL_MANAGED,
        &m_pBACKVB, NULL);

    D3DXCreateTexture(
        m_pDevice,
        pMODE->Width,
        pMODE->Height, 1,
        D3DUSAGE_RENDERTARGET,
        pMODE->Format,
        D3DPOOL_DEFAULT,
        &m_pBACKTEX);

    m_pBACKTEX->GetSurfaceLevel( 0, &m_pBACKBUF);
    m_pDevice->GetDepthStencilSurface(&m_pZBUF);
    m_pDevice->GetRenderTarget( 0, &m_pRTARGET);

    m_pBACKVB->Lock( 0, 0, &pDATA, 0);
    memcpy( pDATA, vMESH, 4 * sizeof(PVERTEX));
    m_pBACKVB->Unlock();

void CTClientGame::BeginGHOSTScene()
{
    m_pDevice->m_pDevice->SetRenderTarget( 0, m_pDevice->m_pBACKBUF);
    m_pDevice->m_pDevice->Clear(
        0, NULL,
        D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,
        D3DCOLOR_ARGB( 0, 0, 0, 0),
        1.0f, 0);
}

void CTClientGame::EndGHOSTScene()
{
    DWORD dwALPHA = DWORD((DWORD(m_dwGHOSTTick * ALPHA_MAX / TGHOST_TICK) << 24) & 0xFF000000);

    CTClientCAM vCAMERA;
    D3DXMATRIX vWorld;

    m_pDevice->m_pDevice->SetRenderTarget( 0, m_pDevice->m_pRTARGET);
    m_pDevice->m_pDevice->Clear(
        0, NULL,
        D3DCLEAR_TARGET,
        D3DCOLOR_ARGB( 0xFF, 0x00, 0x00, 0x00),
        1.0f, 0);
    D3DXMatrixIdentity(&vWorld);

    vCAMERA.InitOrthoCamera(
        m_pDevice->m_pDevice,
        -1.0f,
        1.0f,
        1.0f,
        1.0f);

    vCAMERA.SetPosition(
        D3DXVECTOR3( 0.0f, 0.5f, 0.0f),
        D3DXVECTOR3( 0.0f, 0.0f, 0.0f),
        D3DXVECTOR3( 0.0f, 0.0f, 1.0f),
        FALSE);
    vCAMERA.Activate(TRUE);

    m_pDevice->m_pDevice->SetTextureStageState( 0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE);
    m_pDevice->m_pDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_DOTPRODUCT3);
    m_pDevice->m_pDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
    m_pDevice->m_pDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_TFACTOR);

    m_pDevice->m_pDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
    m_pDevice->m_pDevice->SetTextureStageState( 1, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
    m_pDevice->m_pDevice->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE);

    m_pDevice->m_pDevice->SetSamplerState( 0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP);
    m_pDevice->m_pDevice->SetSamplerState( 0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP);

    m_pDevice->m_pDevice->SetRenderState( D3DRS_TEXTUREFACTOR, 0x004C4C4C);
    m_pDevice->m_pDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE);
    m_pDevice->m_pDevice->SetRenderState( D3DRS_ALPHATESTENABLE, FALSE);
    m_pDevice->m_pDevice->SetRenderState( D3DRS_FOGENABLE, FALSE);

    m_pDevice->m_pDevice->SetRenderState( D3DRS_ZWRITEENABLE, FALSE);
    m_pDevice->m_pDevice->SetRenderState( D3DRS_ZENABLE, FALSE);

    m_pDevice->m_pDevice->SetStreamSource( 0, m_pDevice->m_pBACKVB, 0, sizeof(PVERTEX));
    m_pDevice->m_pDevice->SetTexture( 0, m_pDevice->m_pBACKTEX);

    m_pDevice->m_pDevice->SetTransform( D3DTS_WORLD, &vWorld);
    m_pDevice->m_pDevice->SetFVF(T3DFVF_PVERTEX);
    m_pDevice->m_pDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 2);

    m_pDevice->m_pDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG2);
    m_pDevice->m_pDevice->SetRenderState( D3DRS_BLENDOP, D3DBLENDOP_SUBTRACT);
    m_pDevice->m_pDevice->SetRenderState( D3DRS_TEXTUREFACTOR, 0xFFFFFFFF);
    m_pDevice->m_pDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_ONE);
    m_pDevice->m_pDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_ONE);
    m_pDevice->m_pDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE);
    m_pDevice->m_pDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 2);

    m_pDevice->m_pDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
    m_pDevice->m_pDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
    m_pDevice->m_pDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TFACTOR);

    m_pDevice->m_pDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
    m_pDevice->m_pDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
    m_pDevice->m_pDevice->SetRenderState( D3DRS_BLENDOP, D3DBLENDOP_ADD);
    m_pDevice->m_pDevice->SetRenderState( D3DRS_TEXTUREFACTOR, dwALPHA);

    m_pDevice->m_pDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 2);
    m_pCamera->Activate(TRUE);
}
...