- Mesaj
- 4.391
- Çözümler
- 439
- Beğeni
- 4.948
- 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.
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++:
void CScreenFilter::SetEnable (BOOL /*bFlag*/)
{
m_bEnable = FALSE;
}
Tamamen değiştirin:
C++:
void CScreenFilter::SetEnable (BOOL bFlag) // <<--
{
//m_bEnable = FALSE;
m_bEnable = bFlag; // <<--
}
Aynı dosyanın içinde Render fonksiyonunu göreceksiniz:
C++:
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++:
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++:
void RenderAfterLensFlare();
...
void RenderFilter(); // <<<<<---- Ekleyin
PythonBackground.cpp en sonuna ekleyin:
C++:
void CPythonBackground::RenderFilter()
{
CMapOutdoor& rkMap = GetMapOutdoorRef();
rkMap.RenderScreenFiltering();
}
PythonApplication.cpp(Dikkat):
C++:
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:
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