Yardım Terrain giydirme mantığı hk.

  • Konuyu açan Konuyu açan Kaiser
  • Açılış Tarihi Açılış Tarihi
  • Yanıt Yanıt 2
  • Gösterim Gösterim 109
Konu sahibi bu konuda soru soruyor. Sorusu ile ilgili bilgisi olanların yanıtlamasını bekliyor.

Kaiser

Admin
Admin
Geliştirici
Yardımsever Üye
Mesaj
4.042
Çözümler
398
Beğeni
4.216
Puan
1.849
Ticaret Puanı
0
Merhabalar, yine farklı fanteziler peşinde koşturuyorum ve bir konuda net bir sonuca ulaşamadım. Metin2 ve benzeri olan tüm oyunlarda terrain giydirme mantığı aynı şekilde işliyor. (Kısaca; karolar halinde eklenip, daha sonra gerekli state ayarlarıyla işleniyorlar.)
Ancak bu mantık tam olarak nasıl çalışıyor?

Metin2'de ise bu işi yapan kod bloğu aşağıda:

C++:
Genişlet Daralt Kopyala
else
{
    bool isFirst = true;
    for (DWORD j = 1; j < pTerrain->GetNumTextures(); ++j)
    {
        TTerainSplat& rSplat = rTerrainSplatPatch.Splats[j];

        if (!rSplat.Active)
            continue;

        if (rTerrainSplatPatch.PatchTileCount[sPatchNum][j] == 0)
            continue;

        const TTerrainTexture& rTexture = m_TextureSet.GetTexture(j);

        D3DXMatrixMultiply(&matSplatColorTexTransform, &m_matViewInverse, &rTexture.m_matTransform);
        STATEMANAGER.SetTransform(D3DTS_TEXTURE0, &matSplatColorTexTransform);
        
        if (isFirst)
        {
            STATEMANAGER.SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
            STATEMANAGER.SetTexture(0, rTexture.pd3dTexture);
            STATEMANAGER.SetTexture(1, rSplat.pd3dTexture);
            STATEMANAGER.DrawIndexedPrimitive(ePrimitiveType, 0, m_iPatchTerrainVertexCount, 0, wPrimitiveCount);
            STATEMANAGER.SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
            isFirst = false;
        }
        else
        {

            STATEMANAGER.SetTexture(0, rTexture.pd3dTexture);
            STATEMANAGER.SetTexture(1, rSplat.pd3dTexture);
            STATEMANAGER.DrawIndexedPrimitive(ePrimitiveType, 0, m_iPatchTerrainVertexCount, 0, wPrimitiveCount);
        }
        std::vector<int>::iterator aIterator = std::find(m_RenderedTextureNumVector.begin(), m_RenderedTextureNumVector.end(), (int)j);
        if (aIterator == m_RenderedTextureNumVector.end())
            m_RenderedTextureNumVector.push_back(j);
        ++m_iRenderedSplatNum;
        if (m_iRenderedSplatNum >= m_iSplatLimit)
            break;
    }
}

Mesela bu kodda: if bloğundaki STATEMANAGER.SetTexture(0, rTexture.pd3dTexture); kısmı alpha kanallarını temsil ederken, else bloğunda da yer alan aynı tanım ise dokuyu temsil ediyor.
İşlenen veriler aynı olmasına rağmen(rTexture.pd3dTexture) her iki blokta da farklı şeyleri temsil ediyorlar.

Kısacası; bu işlemin başlangıç ve sonuç arasındaki bağlamları bilenler burada fikirlerini paylaşırlarsa sevinirim.
 
Hocam harita yaparken aynı anda 3 dds dosyası ile zemini boyayabiliyoruz, fazlasında ise world editor kapanıyor, hata veriyor.

Bu işlemde yani boyamada; attığınız kod parçacığına baktığımda ilk olarak alfa kanalı devre dışı kalıyor ve alfa devre dışı kaldığı için saydamlık olmadan ekrana çizilmiş oluyor, devamındaki else'de bu sefer alfa kanalı işleniyor ve önceki dokularla saydamlıklı birleşim yapılıyor. Bu iki blok arasındaki farklılık, aynı doku yüklemesinin bağlamdan bağımsız olarak farklı etki oluşturmasını sağlıyor, yani STATEMANAGER.SetTexture(0, rTexture.pd3dTexture); her iki blokta aynı işlemi yapar, ancak çevredeki alfa ayarları nedeniyle farklı sonuçlar veriyor.

Bu durumda akla takılan soru neden böyle bir yöntem izlemişler?
Harita yapma ve az buçuk kodlama tecrübelerimden yola çıkarsam:
-Grafik programlamada, çok katmanlı kaplamalar (terrain splats) ve alfa kanallarıyla çalışmak, daha gerçekçi ve ayrıntılı yüzeyler oluşturmak için sık kullanılan bir teknik bildiğiniz üzere, böylelikle doku katmanları ile zengin görseller elde etme, katmanları dinamik olarak işleme ve GPU'dan verimli şekilde yararlanma imkanı sağlıyor.


ChatGPT ile biraz sohbet ettim ve şu şekilde cevap verdi:
  • İlk katmanın doğrudan çizilmesi, oyun içi temel zemin rengini hızlı bir şekilde belirler ve isFirst flagı ile ilk işlem sonlandırılır. Daha sonra gelen else bloğu, gerekli görüldüğünde alfa ile saydam geçişler ekleyerek detaylandırmayı sağlar.
  • Böyle bir mantık, sahneye görsel zenginlik katarken, performansı ve kaynak tüketimini de kontrol altında tutar.
 
Hocam harita yaparken aynı anda 3 dds dosyası ile zemini boyayabiliyoruz, fazlasında ise world editor kapanıyor, hata veriyor.

Bu işlemde yani boyamada; attığınız kod parçacığına baktığımda ilk olarak alfa kanalı devre dışı kalıyor ve alfa devre dışı kaldığı için saydamlık olmadan ekrana çizilmiş oluyor, devamındaki else'de bu sefer alfa kanalı işleniyor ve önceki dokularla saydamlıklı birleşim yapılıyor. Bu iki blok arasındaki farklılık, aynı doku yüklemesinin bağlamdan bağımsız olarak farklı etki oluşturmasını sağlıyor, yani STATEMANAGER.SetTexture(0, rTexture.pd3dTexture); her iki blokta aynı işlemi yapar, ancak çevredeki alfa ayarları nedeniyle farklı sonuçlar veriyor.

Bu durumda akla takılan soru neden böyle bir yöntem izlemişler?
Harita yapma ve az buçuk kodlama tecrübelerimden yola çıkarsam:
-Grafik programlamada, çok katmanlı kaplamalar (terrain splats) ve alfa kanallarıyla çalışmak, daha gerçekçi ve ayrıntılı yüzeyler oluşturmak için sık kullanılan bir teknik bildiğiniz üzere, böylelikle doku katmanları ile zengin görseller elde etme, katmanları dinamik olarak işleme ve GPU'dan verimli şekilde yararlanma imkanı sağlıyor.


ChatGPT ile biraz sohbet ettim ve şu şekilde cevap verdi:
  • İlk katmanın doğrudan çizilmesi, oyun içi temel zemin rengini hızlı bir şekilde belirler ve isFirst flagı ile ilk işlem sonlandırılır. Daha sonra gelen else bloğu, gerekli görüldüğünde alfa ile saydam geçişler ekleyerek detaylandırmayı sağlar.
  • Böyle bir mantık, sahneye görsel zenginlik katarken, performansı ve kaynak tüketimini de kontrol altında tutar.
Evet yüzeysel olarak da olsa bunların farkındayım, ancak aslında asıl merak ettiğim şey şu; bu mantıkta çalışan bir kodda işlenen tekstürleri nasıl harici olarak işleyebilirim? Burada bir çok texture işleniyor(yeşil alanlar, güvenli alan, dağların texturesi vb.) hepsi bu blokla işleniyor.
"Ben bu işlenen tekstür verilerini nasıl referans olarak çekebilirim ve işleyebilirim?" sorusunun cevabını bulamadım açıkçası.

Kabaca tabir etmek gerekirse item->GetVnum() ile nasıl ki itemin mevcut vnum verisini çekiyoruz, burada da aynı olmasa da benzer bir şekilde işlenen tekstürleri doğrudan çekmek istiyorum. Hatta bu blokta işlenen tüm tekstürleri aynı anda çeksem de olur. Ham haliyle veya son haliyle..

Fakat buradaki mantıktan dolayı her iki blokta da dokuların verileri ve özellikleri değişiyor ve sabit bir şekilde dokuyu çekemiyorum.
 
Geri
Üst