MSAA Aktif etmek

Denizeri24

Gentleman
Geliştirici
Usta Üye
Mesaj
519
Çözümler
14
Beğeni
469
Puan
829
Ticaret Puanı
0
MSAA YOKKEN

nomssa.png


MSAA VARKEN (8x)
withmssa.png



EterLib/GrpDevice.cpp içinde aratılır:
C++:
ms_dwD3DBehavior = pkD3DModeInfo->m_dwD3DBehavior;

ve hemen üstüne eklenir;
C++:
    for (uint8_t i = 0; i <= D3DMULTISAMPLE_8_SAMPLES; i++)
    {
        const auto multisamplelevel = static_cast<D3DMULTISAMPLE_TYPE>(i);
        const auto result = ms_lpd3d->CheckDeviceMultiSampleType(ms_iD3DAdapterInfo, D3DDEVTYPE_HAL, ms_d3dPresentParameter.BackBufferFormat, Windowed, multisamplelevel, nullptr); // !!! REMOVE nullptr FOR DX8 !!!

        if (SUCCEEDED(result))
        {
#ifdef _DEBUG
            TraceError("multisamplelevel == %u", multisamplelevel);
#endif
            ms_d3dPresentParameter.MultiSampleType = multisamplelevel;
        }
    }


EterLib/GrpScreen.cpp içinde aratılır:
C++:
void CScreen::RenderBar3d(float sx, float sy, float sz, float ex, float ey, float ez)

ve fonksiyon komple değiştirilir;


C++:
void CScreen::RenderBar3d(float sx, float sy, float sz, float ex, float ey, float ez)
{
    assert(ms_lpd3dDevice != NULL);

    SPDTVertexRaw vertices[4] =
    {
        // HARD FIX BEGIN
        { sx - 0.5f, sy - 0.5f, sz, ms_diffuseColor, 0.0f, 0.0f },
        { sx - 0.5f, ey - 0.5f, ez, ms_diffuseColor, 0.0f, 0.0f },
        { ex - 0.5f, sy - 0.5f, sz, ms_diffuseColor, 0.0f, 0.0f },
        { ex - 0.5f, ey - 0.5f, ez, ms_diffuseColor, 0.0f, 0.0f },
        // HARD FIX END
    };

    if (SetPDTStream(vertices, 4))
    {
        STATEMANAGER.SetTexture(0, NULL);
        STATEMANAGER.SetTexture(1, NULL);
        STATEMANAGER.SetVertexShader(D3DFVF_XYZ|D3DFVF_DIFFUSE|D3DFVF_TEX1);
        STATEMANAGER.DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2);
    }
}


Otomatik olarak aygıt desteğini 8X e kadar tarar ve en yüksek olanı seçer. normal şartlarda D3DMULTISAMPLE_16_SAMPLES (16x) desteklenmiyor ama vulkan gibi d3d wrapper kullanılırsa destekliyor tabii tam ekran modda oyun çöküyor o yüzden en fazla D3DMULTISAMPLE_8_SAMPLES (8x) e kadar taramasını sağladım. (intel arc kaynaklı sıkıntı olabilir)..
 
Son düzenleme:
Aynen öyle yaptım şuanda build aldı. Şuan kendimden şüphe duydum baştan yapıyım dx9ları. Geçen yıl güncellemiştim bir yerde atlama yaptım sanırım. MSAA nın aktif olduğunu oyunda nasıl anlarım.
GPU kullanımı artar ayrıca foto çek uzak yerlerde tırtıklanma olur MSAA yoksa
 
Kullanacak arkadaşlara küçük bir not düşmek istiyorum:
Directx konusunda ben de çok bilgili sayılmam ancak edindiğim bilgi kadarıyla şunu söyleyeyim; Lütfen DirectX özelleştirme kodlarını, diğer Metin2 kodlarıyla bir tutmayın. Bu tür alanlar direkt kopyala-yapıştır yaparak kod ekleyebileceğiniz yerler değildir. Çünkü yapılan değişiklikler her bilgisayarda farklı sonuçlara neden olabilir. Mesela ben bir NVIDIA kullanıcısı olarak bu konudaki kod veya benzeri kodlar doğrudan kullandığımda hiç bir işime yaramamıştı. Sorunsuz build oluyor ancak oyun açılmıyor.
Ara bellek kilitlerini devredışı bırakmam gerekti bunun için. Tabi alternatif olarak tekrar kilitlenebilir hale getirmem gerekecek, çünkü bu şekilde hiç sağlıklı ve etik değil.
Sanıyorum ki markaların directx üzerinde çalışma prensibi farklı olabiliyor.(Hele ki söz konusu directx9 gibi eski bir sürümse)
Kısacası sadece ne yaptığınızı biliyorsanız yapın.
 
I have directx8.. can that be the problem?
Nothing changed, the aliasing is still there.

Are you sure this is the full tutorial?
 
DirectX8 için yapay zekadan yardım almaya çalışarak nasıl yapabiliriz diye düşündüm bana şu şekilde yanıtlar verdi;

Değiştirilmiş kodlar;

RenderBar3d fonksiyonu (Directx8 için):
void CScreen::RenderBar3d(float sx, float sy, float sz, float ex, float ey, float ez)
{
    assert(ms_lpd3dDevice != NULL);

    // Vertex format for DirectX 8
    struct SPDTVertexRaw
    {
        float x, y, z;
        DWORD color;
    };

    SPDTVertexRaw vertices[4] =
    {
        // HARD FIX BEGIN
        { sx - 0.5f, sy - 0.5f, sz, D3DCOLOR_ARGB(255, 255, 255, 255) },
        { sx - 0.5f, ey - 0.5f, ez, D3DCOLOR_ARGB(255, 255, 255, 255) },
        { ex - 0.5f, sy - 0.5f, sz, D3DCOLOR_ARGB(255, 255, 255, 255) },
        { ex - 0.5f, ey - 0.5f, ez, D3DCOLOR_ARGB(255, 255, 255, 255) },
        // HARD FIX END
    };

    if (SetPDTStream(vertices, 4))
    {
        // STATEMANAGER.SetTexture(0, NULL); // Texture handling might need to be adjusted for DirectX 8
        // STATEMANAGER.SetTexture(1, NULL); // Texture handling might need to be adjusted for DirectX 8
        ms_lpd3dDevice->SetFVF(D3DFVF_XYZ | D3DFVF_DIFFUSE); // Set the fixed function vertex format
        ms_lpd3dDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2);
    }
}

Bu kod, D3DCOLOR_ARGB kullanarak renk değerlerini belirtir ve vertex formatını DirectX 8'e uygun olarak düzenler. Ayrıca, texture işlemleri için gerekli olan kısımları belirttim, ancak bunları projenizin gereksinimlerine göre ayarlamanız gerekebilir.

konuda bulunan for döngüsü editlenmiş hali:
for (uint8_t i = 0; i <= D3DMULTISAMPLE_8_SAMPLES; i++)
{
    const auto multisamplelevel = static_cast<D3DMULTISAMPLE_TYPE>(i);
    const auto result = ms_lpd3d->CheckDeviceMultiSampleType(ms_iD3DAdapterInfo, D3DDEVTYPE_HAL, ms_d3dPresentParameter.BackBufferFormat, Windowed, multisamplelevel); // !!! REMOVE nullptr FOR DX8 !!!

    if (SUCCEEDED(result))
    {
#ifdef _DEBUG
        TraceError("multisamplelevel == %u", multisamplelevel);
#endif
        ms_d3dPresentParameter.MultiSampleType = multisamplelevel;
    }
}

1700246516867.png
 
Geri
Üst