- 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:
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.
Ancak bu mantık tam olarak nasıl çalışıyor?
Metin2'de ise bu işi yapan kod bloğu aşağıda:
C++:
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.