[C++ & Py] Ymir'in Yarıda Bıraktığı Ekran Filtrelemeyi Aktifleştirme

  • Konuyu açan Konuyu açan Kaiser
  • Açılış Tarihi Açılış Tarihi
  • Yanıt Yanıt 7
  • Gösterim Gösterim 207

Kaiser

Admin
Admin
Geliştirici
Yardımsever Üye
Mesaj
4.390
Çözümler
439
Beğeni
4.947
Puan
1.849
Ticaret Puanı
0
Merhabalar, bildiğiniz gibi metin2'yi tamamen shadera geçiriyorum ve bu süreçte ister istemez pek çok dosya/kod boşa düşmüş oluyor ve hepsini kaldırıyorum.
Dün GrpScreen.cpp vb. içeriklerini shadera taşırken ScreenFilter.cpp dosyası dikkatimi çekti.
Küçücük kendi halinde duran ama devredışı bırakılmış bir dosya..
Ne işe yarıyor diye biraz göz attım ve ekranı renklendirerek filtreleme yaptığını öğrendim. Tabi mevcut haliyle çalışmıyor, ve ymir bunu direkt FALSE yaparak iptal etmiş.
Doğrudan TRUE'ya çevirip aktif etmeyi denedim fakat bu sefer de sahip olduğu Render fonksiyonu bozuk olduğu için çalışmadı. Ayrıca pack tarafında da yanlış değerler kullanmışlar. Velhasıl, biraz uğraş sonucunda bunu çalışır hale getirdim. Bu kodlar benim hiçbir işime yaramayacağı için ve bu işlemi ileride shaderla yapacağım için dosyayı direkt silmek yerine kullanmak isteyenler için düzeltip paylaşmak istedim.

İstediğiniz amaçta kullanabilirsiniz, hayal gücünüze kalmış.
Directx8'de de çalışmasını umuyorum ama emin değilim. Directx9'da test edildi ve sorun görülmedi.

İşlemler kısa ve basittir. Ancak yinede dikkatli olunuz.​

EterLib/ScreenFilter.cpp açın ve bulun:
C++:
Genişlet Daralt Kopyala
void CScreenFilter::SetEnable (BOOL /*bFlag*/)
{
    m_bEnable = FALSE;
}

Tamamen değiştirin:
C++:
Genişlet Daralt Kopyala
void CScreenFilter::SetEnable (BOOL bFlag) // <<--
{
    //m_bEnable = FALSE;
    m_bEnable = bFlag; // <<--
}

Aynı dosyanın içinde Render fonksiyonunu göreceksiniz:
C++:
Genişlet Daralt Kopyala
void CScreenFilter::Render()
{
    if (!m_bEnable)
        return;

    STATEMANAGER.SaveTransform (D3DTS_PROJECTION, &ms_matIdentity);
    STATEMANAGER.SaveTransform (D3DTS_VIEW, &ms_matIdentity);
    STATEMANAGER.SetTransform (D3DTS_WORLD, &ms_matIdentity);
    STATEMANAGER.SaveRenderState (D3DRS_ALPHABLENDENABLE, TRUE);
    STATEMANAGER.SaveRenderState (D3DRS_SRCBLEND, m_bySrcType);
    STATEMANAGER.SaveRenderState (D3DRS_DESTBLEND, m_byDestType);

    SetOrtho2D (CScreen::ms_iWidth, CScreen::ms_iHeight, 400.0f);
    SetDiffuseColor (m_Color.r, m_Color.g, m_Color.b, m_Color.a);
    RenderBar2d (0, 0, CScreen::ms_iWidth, CScreen::ms_iHeight);

    STATEMANAGER.RestoreRenderState (D3DRS_ALPHABLENDENABLE);
    STATEMANAGER.RestoreRenderState (D3DRS_SRCBLEND);
    STATEMANAGER.RestoreRenderState (D3DRS_DESTBLEND);
    STATEMANAGER.RestoreTransform (D3DTS_VIEW);
    STATEMANAGER.RestoreTransform (D3DTS_PROJECTION);
}

Bu fonksiyonun içeriğini tamamen değiştirin:

C++:
Genişlet Daralt Kopyala
void CScreenFilter::Render()
{
    if (!m_bEnable) // Kaiser: Eğer .msenv dosyasından aktif edilmemişse çalışmaz.
        return;
 
    /*
        Kaiser: Ana render döngüsünü kırmamak için bütün mevcut verileri-dokuları-matrisleri vb. sakla.
        Fonksiyon tüm görevi üstlenecektir.
    */
    STATEMANAGER.SaveRenderState(D3DRS_ZENABLE, FALSE);
    STATEMANAGER.SaveRenderState(D3DRS_ZWRITEENABLE, FALSE);

    STATEMANAGER.SaveRenderState(D3DRS_LIGHTING, FALSE);
    STATEMANAGER.SaveRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
    STATEMANAGER.SaveRenderState(D3DRS_SRCBLEND, m_bySrcType);
    STATEMANAGER.SaveRenderState(D3DRS_DESTBLEND, m_byDestType);

    STATEMANAGER.SaveTransform(D3DTS_PROJECTION, &ms_matIdentity);
    STATEMANAGER.SaveTransform(D3DTS_VIEW, &ms_matIdentity);
    STATEMANAGER.SaveTransform(D3DTS_WORLD, &ms_matIdentity);

    STATEMANAGER.SaveTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
    STATEMANAGER.SaveTextureStageState(0, D3DTSS_COLORARG1, D3DTA_DIFFUSE);
    STATEMANAGER.SaveTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
    STATEMANAGER.SaveTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE);
    STATEMANAGER.SetTexture(0, NULL);
    STATEMANAGER.SaveTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE);
    STATEMANAGER.SaveTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE);

    SetOrtho2D(CScreen::ms_iWidth, CScreen::ms_iHeight, 400.0f);
    SetDiffuseColor(m_Color.r, m_Color.g, m_Color.b, m_Color.a);
    RenderBar2d(0, 0, CScreen::ms_iWidth, CScreen::ms_iHeight);

    /*
        Kaiser: İşlem bitti. Saklanan her şeyi geri yükle ve döngüye devam et..
    */
    STATEMANAGER.RestoreTextureStageState(1, D3DTSS_ALPHAOP);
    STATEMANAGER.RestoreTextureStageState(1, D3DTSS_COLOROP);
    STATEMANAGER.RestoreTextureStageState(0, D3DTSS_ALPHAARG1);
    STATEMANAGER.RestoreTextureStageState(0, D3DTSS_ALPHAOP);
    STATEMANAGER.RestoreTextureStageState(0, D3DTSS_COLORARG1);
    STATEMANAGER.RestoreTextureStageState(0, D3DTSS_COLOROP);
    STATEMANAGER.RestoreTransform(D3DTS_WORLD);
    STATEMANAGER.RestoreTransform(D3DTS_VIEW);
    STATEMANAGER.RestoreTransform(D3DTS_PROJECTION);
    STATEMANAGER.RestoreRenderState(D3DRS_DESTBLEND);
    STATEMANAGER.RestoreRenderState(D3DRS_SRCBLEND);
    STATEMANAGER.RestoreRenderState(D3DRS_ALPHABLENDENABLE);
    STATEMANAGER.RestoreRenderState(D3DRS_LIGHTING);
    STATEMANAGER.RestoreRenderState(D3DRS_ZWRITEENABLE);
    STATEMANAGER.RestoreRenderState(D3DRS_ZENABLE);
}

PythonBackground.h:
C++:
Genişlet Daralt Kopyala
void RenderAfterLensFlare();
...
void RenderFilter(); // <<<<<---- Ekleyin

PythonBackground.cpp en sonuna ekleyin:
C++:
Genişlet Daralt Kopyala
void CPythonBackground::RenderFilter()
{
    CMapOutdoor& rkMap = GetMapOutdoorRef();
    rkMap.RenderScreenFiltering();
}

PythonApplication.cpp(Dikkat):
C++:
Genişlet Daralt Kopyala
void CPythonApplication::RenderGame()
{
    if (!PERF_CHECKER_RENDER_GAME)
    {
        ...
        ......
        .............
        m_pyBackground.RenderFilter(); // Ekleyin
        return;
    }
    ...
    ......
    .............
}


Source ile işimiz bu kadar.

Şimdi son olarak herhangi bir .msenv dosyasını açın.. (Örneğin c1.msenv)
Ve içinde şuna benzer bir blok görmeniz gerekiyor:
Kod:
Genişlet Daralt Kopyala
Group Filter
{
    Enable        0
    Color         0.556863 0.329412 0.329412 0.000000
    AlphaSrc      1
    AlphaDest     2
}

Burada Enable seçeneğini 1 olarak değiştirin.
Color seçeneğini dileğinize göre değiştirebilirsiniz ancak color değerinin son kısmı 0.0 OLMAMALIDIR! 0 ve 1 arasında bir değer verin.
Bu rengin şeffaflığını temsil eder.

Ve en önemlisi;
AlphaSrc = 5
AlphaDest = 6 olmalı

1 ve 2 directx'de blend-zero ve blend-one verilerine denk gelir ve bunlar etkisiz elemanlardır. Dolayısıyla bunları geçerli veriler olan 5 ve 6 ile değiştiriyoruz.


Bu düzenlemeyi ekran filtrelemenin çalışmasını istediğiniz haritaların .msenv dosyalarından yapmanız gerekir.

Sonuç( Mavi 1.Köy );
Orijinal ve Filtreleme
fff.webp
 
wp grubunda diyince ben bi heyecanlandım iyi güzel bir özellikte nerede kullanılabilir diye düşündüm aklıma gelmedi ne işimize yarayacak şimdi bu acaba
 
wp grubunda diyince ben bi heyecanlandım iyi güzel bir özellikte nerede kullanılabilir diye düşündüm aklıma gelmedi ne işimize yarayacak şimdi bu acaba
İşte sana düşünmek için bir fırsat
 
İşte sana düşünmek için bir fırsat
ya düşünüyorum hani bir event yap orada ekranı filtrele tarzı bir şey yapılabilir mi diye ama ekranın dümdüz 1 renk olması sanki bozuyor ya olmaz gibi geliyor. aynı anda 1 den fazla efekt verebilirsek belki bir şeyler yapılabilir sanki ya iyice düşünmek lazım.
 
ambulans eventi yaparsın oyunculardan biri rastgele oyunda yaralanır yani ambulansla hastaneye kaldırılır iyileşme ihtimali varsa iyileşir iyileşemezse oyunda hesabı banlanacak pardon hayattan
 
balathor'da sahne geçişi aşamasını yaparken bunu kullanmıştım, benzer mantıkta oyun açılışı ya da warp aşamalarındada kullanılabilir



2.50 de ki karartı efekti
 
aslında blend-zero ve blend-one etkisiz değil kanka, sadece alpha kanalını değiştirmek için yazmışlar bunu. sen direkt rgba değiştiriyorsun böyle.
 
aslında blend-zero ve blend-one etkisiz değil kanka, sadece alpha kanalını değiştirmek için yazmışlar bunu. sen direkt rgba değiştiriyorsun böyle.
Bizim durumumuzda (bu konuda) etkisiz oluyor. Çünkü burada amaçlanan zaten gelen rgba'yı şeffaf bir şekilde ekrana basmak.
blend-zero ve blend-one kullanıldığında alpha kanalı sürekli 0 ile sonuçlanır. Böyle bir durumda da ekrana şeffaf değil dümdüz tam renk basar.
Normalde çalışma prensibi bu ama bu konuda 1 ve 2 denediğimde ne şeffaf ne koyu hiçbir şey çizmedi. Muhtemelen diğer render işlemleri tarafından eziliyor veya yoksayılıyor bir şekilde.

Ayrıca pack içinden 1 ve 2 olarak ayarlamışlar fakat constructorda 5-6 kullanmışlar. (Belki test sürecinden kalma değerlerdir emin değilim, sonuçta sonradan vazgeçip bırakmışlar.)
C++:
Genişlet Daralt Kopyala
CScreenFilter::CScreenFilter()
{
    m_bEnable = FALSE;
    m_bySrcType = D3DBLEND_SRCALPHA;
    m_byDestType = D3DBLEND_INVSRCALPHA;
    m_Color = D3DXCOLOR (0.0f, 0.0f, 0.0f, 0.0f);
}
Zaten directx8 ile (o zamanlara göre) yapılabilecek en fazla şey budur herhalde.
 
Geri
Üst