Yardım Directx9 water problemi

Konu sahibi bu konuda soru soruyor. Sorusu ile ilgili bilgisi olanların yanıtlamasını bekliyor.

Redix

MT Üye
MT Üye
@hasanmacit 'in konusuyla directx9 güncellemeyi denedim. Çoğu problemi giderdim.
Oyuna girdim yerlerde falan bi sıkıntı yok ama bitek waterda suda şelalede vs problemler var.
Bilgisi olan yada şu dosyaya bak diyen var mı ?
Aldığım syserr;
  1. CMapOutdoor::BeginRenderCharacterShadowToTexture : Unable to Set Shadow Map Render Target
.
İlgili syserin cpp dosyası
MapOurdoorCharacterShadow:
#include "StdAfx.h"
#include "../eterLib/StateManager.h"
#include "../eterlib/Camera.h"

#include "MapOutdoor.h"

static int recreate = false;

void CMapOutdoor::SetShadowTextureSize(WORD size)
{
    if (m_wShadowMapSize != size)
    {
        recreate = true;
        Tracenf("ShadowTextureSize changed %d -> %d", m_wShadowMapSize, size);
    }

    m_wShadowMapSize = size;
}

void CMapOutdoor::CreateCharacterShadowTexture()
{
    recreate = false;
/*    extern bool GRAPHICS_CAPS_CAN_NOT_DRAW_SHADOW;

    if (GRAPHICS_CAPS_CAN_NOT_DRAW_SHADOW)
        return;
*/
    ReleaseCharacterShadowTexture();

    if (IsLowTextureMemory())
        SetShadowTextureSize(128);

    m_ShadowMapViewport.X = 1;
    m_ShadowMapViewport.Y = 1;
    m_ShadowMapViewport.Width = m_wShadowMapSize - 2;
    m_ShadowMapViewport.Height = m_wShadowMapSize - 2;
    m_ShadowMapViewport.MinZ = 0.0f;
    m_ShadowMapViewport.MaxZ = 1.0f;
    //Directx9 Update Fix
    if (FAILED(ms_lpd3dDevice->CreateTexture(m_wShadowMapSize, m_wShadowMapSize, 1, D3DUSAGE_RENDERTARGET, D3DFMT_R5G6B5, D3DPOOL_DEFAULT, &m_lpCharacterShadowMapTexture, NULL)))
    {
        TraceError("CMapOutdoor Unable to create Character Shadow render target texture\n");
        return;
    }

    if (FAILED(m_lpCharacterShadowMapTexture->GetSurfaceLevel(0, &m_lpCharacterShadowMapRenderTargetSurface)))
    {
        TraceError("CMapOutdoor Unable to GetSurfaceLevel Character Shadow render target texture\n");
        return;
    }
    //Directx9 Update Fix
    if (FAILED(ms_lpd3dDevice->CreateDepthStencilSurface(m_wShadowMapSize, m_wShadowMapSize, D3DFMT_D16, D3DMULTISAMPLE_NONE, 0, TRUE, &m_lpCharacterShadowMapDepthSurface, NULL)))
    {
        TraceError("CMapOutdoor Unable to create Character Shadow depth Surface\n");
        return;
    }
}

void CMapOutdoor::ReleaseCharacterShadowTexture()
{
    SAFE_RELEASE(m_lpCharacterShadowMapRenderTargetSurface);
    SAFE_RELEASE(m_lpCharacterShadowMapDepthSurface);
    SAFE_RELEASE(m_lpCharacterShadowMapTexture);
}

DWORD dwLightEnable = FALSE;

bool CMapOutdoor::BeginRenderCharacterShadowToTexture()
{
    //D3DXMATRIX matLightView, matLightProj;

    CCamera* pCurrentCamera = CCameraManager::Instance().GetCurrentCamera();

    //if (!pCurrentCamera)
    //    return false;

    if (recreate)
    //{
        CreateCharacterShadowTexture();
    //    recreate = false;
    //}

    D3DXMATRIX matLightView, matLightProj;
    D3DXVECTOR3 v3Target = pCurrentCamera->GetTarget();

    D3DXVECTOR3 v3Eye(v3Target.x - 1.732f * 1250.0f,
                      v3Target.y - 1250.0f,
                      v3Target.z + 2.0f * 1.732f * 1250.0f);

    const auto vv = D3DXVECTOR3(0.0f, 0.0f, 1.0f);
    D3DXMatrixLookAtRH(&matLightView,
        &v3Eye,
        &v3Target,
        &vv);

    D3DXMatrixOrthoRH(&matLightProj, 2550.0f, 2550.0f, 1.0f, 15000.0f);

    STATEMANAGER.SaveTransform(D3DTS_VIEW, &matLightView);
    STATEMANAGER.SaveTransform(D3DTS_PROJECTION, &matLightProj);

    dwLightEnable = STATEMANAGER.GetRenderState(D3DRS_LIGHTING);
    STATEMANAGER.SetRenderState(D3DRS_LIGHTING, FALSE);

    STATEMANAGER.SaveRenderState(D3DRS_TEXTUREFACTOR, 0xFF808080);
    STATEMANAGER.SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
    STATEMANAGER.SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TFACTOR);
    STATEMANAGER.SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
    STATEMANAGER.SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE);

    bool bSuccess = true;

    // Backup Device Context
    //if (FAILED(ms_lpd3dDevice->GetRenderTarget(&m_lpBackupRenderTargetSurface)))
    // Directx9 Update Fix
    if (FAILED(ms_lpd3dDevice->GetRenderTarget(0, &m_lpBackupRenderTargetSurface)))
    {
        TraceError("CMapOutdoor::BeginRenderCharacterShadowToTexture : Unable to Save Window Render Target\n");
        bSuccess = false;
    }

    if (FAILED(ms_lpd3dDevice->GetDepthStencilSurface(&m_lpBackupDepthSurface)))
    {
        TraceError("CMapOutdoor::BeginRenderCharacterShadowToTexture : Unable to Save Window Depth Surface\n");
        bSuccess = false;
    }
    //Directx9 Update Fix
    //if (FAILED(ms_lpd3dDevice->SetRenderTarget(m_lpCharacterShadowMapRenderTargetSurface, m_lpCharacterShadowMapDepthSurface)))
    if (FAILED(ms_lpd3dDevice->SetRenderTarget(0, m_lpCharacterShadowMapDepthSurface)))
    {
        TraceError("CMapOutdoor::BeginRenderCharacterShadowToTexture : Unable to Set Shadow Map Render Target\n");
        bSuccess = false;
    }
    //Directx9 Update Fix
    //if (FAILED(ms_lpd3dDevice->SetRenderTarget(m_lpCharacterShadowMapRenderTargetSurface, m_lpCharacterShadowMapDepthSurface)))
    if (FAILED(ms_lpd3dDevice->SetRenderTarget(0, m_lpCharacterShadowMapRenderTargetSurface)))
    {
        TraceError("CMapOutdoor::BeginRenderCharacterShadowToTexture : Unable to Set Shadow Map Render Target\n");
        bSuccess = false;
    }
    // Directx9 Update Fix
    if (FAILED(ms_lpd3dDevice->Clear(0L, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0xFF, 0xFF, 0xFF), 1.0f, 0)))
    {
        TraceError("CMapOutdoor::BeginRenderCharacterShadowToTexture : Unable to Clear Render Target");
        bSuccess = false;
    }

    if (FAILED(ms_lpd3dDevice->GetViewport(&m_BackupViewport)))
    {
        TraceError("CMapOutdoor::BeginRenderCharacterShadowToTexture : Unable to Save Window Viewport\n");
        bSuccess = false;
    }

    if (FAILED(ms_lpd3dDevice->SetViewport(&m_ShadowMapViewport)))
    {
        TraceError("CMapOutdoor::BeginRenderCharacterShadowToTexture : Unable to Set Shadow Map viewport\n");
        bSuccess = false;
    }
    return true;
    //return bSuccess;
}

void CMapOutdoor::EndRenderCharacterShadowToTexture()
{
    ms_lpd3dDevice->SetViewport(&m_BackupViewport);

    //ms_lpd3dDevice->SetRenderTarget(m_lpBackupRenderTargetSurface, m_lpBackupDepthSurface);
    ms_lpd3dDevice->SetDepthStencilSurface(m_lpBackupDepthSurface);
    ms_lpd3dDevice->SetRenderTarget(0, m_lpBackupRenderTargetSurface);

    SAFE_RELEASE(m_lpBackupDepthSurface);
    SAFE_RELEASE(m_lpBackupRenderTargetSurface);
    //SAFE_RELEASE(m_lpBackupDepthSurface);

    STATEMANAGER.RestoreTransform(D3DTS_VIEW);
    STATEMANAGER.RestoreTransform(D3DTS_PROJECTION);

    // Restore Device Context
    STATEMANAGER.SetRenderState(D3DRS_LIGHTING, dwLightEnable);
    STATEMANAGER.RestoreRenderState(D3DRS_TEXTUREFACTOR);
}
.
Ekran görüntüsü 2023-04-01 033223.png
 
Muhtemelen yanlış düzenleme yaptın. Bende hiç bir sıkıntı oluşmadı bugüne kadar. Texture sorunu, su sorunu falan hiç olmadı.
Ayrıca eğer bSuccess değişkeni başka dosya tarafından çağrılıp işlenmiyorsa, bu fix yazan kısımlar tamamen çöp demektir. Çünkü attığın koda göre bSuccess hiç bir işe yaramıyor.
 
Muhtemelen yanlış düzenleme yaptın. Bende hiç bir sıkıntı oluşmadı bugüne kadar. Texture sorunu, su sorunu falan hiç olmadı.
Ayrıca eğer bSuccess değişkeni başka dosya tarafından çağrılıp işlenmiyorsa, bu fix yazan kısımlar tamamen çöp demektir. Çünkü attığın koda göre bSuccess hiç bir işe yaramıyor.
fix yazmamın sebebi unutmuyım not aldım öylesıne oralarda skntılar vardı buıld almamı engellıyordu o yüzden yazdım cözmeye calıstım ama TARZANCA :d
 
Muhtemelen yanlış düzenleme yaptın. Bende hiç bir sıkıntı oluşmadı bugüne kadar. Texture sorunu, su sorunu falan hiç olmadı.
Ayrıca eğer bSuccess değişkeni başka dosya tarafından çağrılıp işlenmiyorsa, bu fix yazan kısımlar tamamen çöp demektir. Çünkü attığın koda göre bSuccess hiç bir işe yaramıyor.
cpu ile giriş yapmayı denedin mi ben cpula giriş yapmayı denedim sapıttı oyun :D dx8 de cpulada giriliyordu
 
cpu ile giriş yapmayı denedin mi ben cpula giriş yapmayı denedim sapıttı oyun :D dx8 de cpulada giriliyordu
Bende de CPU ile çalıştırınca oyun sapıtıyor. Ama directx8 de de aynı şey oluyordu ben de. Bugüne kadar hiç bir fileste de CPU nun çalıştığını görmedim, ya da benim pc den kaynaklıdır bilemiyorum. Ama bütün bunların ötesinde zaten GPU dururken sadece CPU ile oynamak çok gereksiz bir eylem. Çünkü çoğu zaman en kötü GPU bile CPU dan daya iyi performans verebilir. Çünkü CPU nun asıl görevi grafikleri işleme değildir, fakat GPU nun belkide en büyük görevi grafik işlemedir.(Ne kadar kötü de olsa..)

Fakat burada işin içine bir sürü teferruat giriyor. Çünkü bu iki donanım, bu gibi durumlarda sürekli olarak birbiriyle ilişki içindedir. Kaba tabirle; CPU, GPU ya ne yapması gerektiğini söyler ve GPU da bunu işleme alır ve işler. Öte yandan GPU, CPU dan daha hızlı grafik işleme hızına sahiptir ancak yine de CPU kadar geniş bir yelpazeye sahip değildir. Peki bu ne demek?

Bir CPU, birden fazla komutu algılayıp destekleyebilir ve kendi potansiyelinin yettiği kadarıyla işleme alabilir, ancak GPU da işler biraz değişiyor. Çünkü bazı komutlar en iyi GPU lar tarafından bile okunamaz. Bunu şöyle özetlersem daha anlaşılır olacaktır:
Directx 12 ile çalışan bir oyunu, directx 12 desteği olmayan bir ekran kartıyla oynamaya çalışmak.

Böyle bir durumda ekran kartı sadece kendi desteklediği Directx sürümü ile oyunu çalıştıracaktır ve oyunun barındırdığı dx12 kodlarını asla işleyemeyecektir.
Özetleyecek olursam; grafik işleme konusunda GPU her zaman için en iyi işleme alanıdır ancak bunu CPU nun komutlarıyla ve güç desteği ile gerçekleştirir. Eğer yenilikçi bir files hazırlanıyorsa CPU seçeneğinin tamamen devre dışı bırakılması bir sorun yaratmayacaktır.
Bunun yerine Auto seçeneği de kullanılabilir. Veya directx9 mevcut ise direkt olarak GPU da seçilebilir.
Her iki durumda da grafik işleme CPU-GPU işbirliği ile gerçekleştirilecektir ve her iki donanım eski veya kötü olsa bile ortak bir şekilde çalışacaktır.
 
Bende de CPU ile çalıştırınca oyun sapıtıyor. Ama directx8 de de aynı şey oluyordu ben de. Bugüne kadar hiç bir fileste de CPU nun çalıştığını görmedim, ya da benim pc den kaynaklıdır bilemiyorum. Ama bütün bunların ötesinde zaten GPU dururken sadece CPU ile oynamak çok gereksiz bir eylem. Çünkü çoğu zaman en kötü GPU bile CPU dan daya iyi performans verebilir. Çünkü CPU nun asıl görevi grafikleri işleme değildir, fakat GPU nun belkide en büyük görevi grafik işlemedir.(Ne kadar kötü de olsa..)

Fakat burada işin içine bir sürü teferruat giriyor. Çünkü bu iki donanım, bu gibi durumlarda sürekli olarak birbiriyle ilişki içindedir. Kaba tabirle; CPU, GPU ya ne yapması gerektiğini söyler ve GPU da bunu işleme alır ve işler. Öte yandan GPU, CPU dan daha hızlı grafik işleme hızına sahiptir ancak yine de CPU kadar geniş bir yelpazeye sahip değildir. Peki bu ne demek?

Bir CPU, birden fazla komutu algılayıp destekleyebilir ve kendi potansiyelinin yettiği kadarıyla işleme alabilir, ancak GPU da işler biraz değişiyor. Çünkü bazı komutlar en iyi GPU lar tarafından bile okunamaz. Bunu şöyle özetlersem daha anlaşılır olacaktır:
Directx 12 ile çalışan bir oyunu, directx 12 desteği olmayan bir ekran kartıyla oynamaya çalışmak.

Böyle bir durumda ekran kartı sadece kendi desteklediği Directx sürümü ile oyunu çalıştıracaktır ve oyunun barındırdığı dx12 kodlarını asla işleyemeyecektir.
Özetleyecek olursam; grafik işleme konusunda GPU her zaman için en iyi işleme alanıdır ancak bunu CPU nun komutlarıyla ve güç desteği ile gerçekleştirir. Eğer yenilikçi bir files hazırlanıyorsa CPU seçeneğinin tamamen devre dışı bırakılması bir sorun yaratmayacaktır.
Bunun yerine Auto seçeneği de kullanılabilir. Veya directx9 mevcut ise direkt olarak GPU da seçilebilir.
Her iki durumda da grafik işleme CPU-GPU işbirliği ile gerçekleştirilecektir ve her iki donanım eski veya kötü olsa bile ortak bir şekilde çalışacaktır.
Valla hatayı arıyorum ama bulamıyorum shadowla alakalı bi durum gölge gibi ama çözemedim cpuda sapıtıyor onu devre dışı bırakırım mühim değil, bende olmuyor dx8 de girince cpudanda giriş yapıyorum sıkıntısız ama dx9 da sapıtıyor geçtim dediğin gibi gpu dan girmelerini söyleriz veya auto yu bırakırız cpuyu kaldırırız da mesele sorunu cozememek :D sorunu cozsem eyv :D muhtemelen dönücem ama dx8 e geri ya yapcak bişey yok 2günümü aldı :D ilerleme yok
 
Geri