Evet, bir oyun motorunda genel olarak çeşitli gölgelendiriciler bulunur. Tipik örüntü:
Motoru başlatırken ve oyun dünyasını yüklerken, oluşturma için kullanacağınız tüm gölgelendiricileri hazırlayın. "Hazırla" ile bunları belleğe yükleyin, gerekirse derleyin ID3D11Device::CreatePixelShader
ve D3D gölgelendirici nesnelerini tahsis edip gitmeye hazır hale getirmek için tüm benzer çağrıları yapın. Nesneleri bir dizide veya başka bir veri yapısında tutun.
Genellikle tepe gölgelendiricileri ile birlikte çalışmak üzere tasarlanmış piksel gölgelendiricileri arasında bire bir ilişkiniz olur. Onları gerçekten bir köşe gölgelendirici ve bir piksel gölgelendirici (ve belki de geometri / gövde / etki alanı gölgelendiricileri) içermesine rağmen, sadece "gölgelendirici" olarak adlandırdığım tek bir nesne olarak düşünüyorum.
Her kare, oluşturulacak nesnelerin (kafeslerin) listesini bulduğunuzda, gölgelendiriciye göre sıralayın. Fikir, belirli bir gölgelendiriciye sahip tüm nesneleri birlikte çizerek gölgelendiricileri bir çerçeveye geçirme sayısını en aza indirmektir. Bunun nedeni, gölgelendiricilerin değiştirilmesi biraz pahalı bir işlemdir (çerçeve başına kesinlikle yüz veya bin kez yapabilmenize rağmen, bu gerçekten çok pahalı değildir ).
Aslında, bir adım daha ileri gidebilir ve ağları önce gölgelendiriciye ve ikinci olarak malzemeye göre sıralayabilirsiniz. "Malzeme" ile, bir gölgelendiricinin ve bunun için bir dizi doku ve parametrenin bir kombinasyonunu kastediyorum. Gölgelendiriciler genellikle içine beslenen bazı dokulara ve sayısal parametrelere (sabit tamponlarda depolanır) sahiptir, bu nedenle örneğin bir tuğla malzeme ve asfalt malzemesi, sadece farklı dokularda aynı gölgelendirici kodunu kullanabilir.
Çizmek için, sadece gölgelendiricilerin üzerinden geçirin, her gölgelendiriciyi içine yerleştirin ID3D11DeviceContext
, parametreleri ayarlayın (sabit tamponlar, dokular vb.), Sonra nesneleri çizin. Sözde gölgelendiriciler / malzeme ayrımını da içeren sözde kodda:
for each shader:
// Set the device context to use this shader
pContext->VSSetShader(shader.pVertexShader);
pContext->PSSetShader(shader.pPixelShader);
for each material that uses this shader:
// Set the device context to use any constant buffers, textures, samplers,
// etc. needed for this material
pContext->VSSetConstantBuffers(...);
pContext->PSSetConstantBuffers(...);
pContext->PSSetShaderResources(...);
pContext->PSSetSamplers(...);
for each mesh that uses this material:
// Set any constant buffers containing parameters specific to the mesh
// (e.g. world matrix)
pContext->VSSetConstantBuffers(...);
// Set the context to use the vertex & index buffers for this mesh
pContext->IASetInputLayout(mesh.pInputLayout);
pContext->IASetVertexBuffers(...);
pContext->IASetIndexBuffer(...);
pContext->IASetPrimitiveTopology(...)
// Draw it
pContext->DrawIndexed(...)
Nesneleri, ağları, gölgelendiricileri, giriş düzenlerini, sabit arabellekleri vb. Yönetmeyle ilgili söylenebilecek çok şey var, ancak bu, başlamanız için yeterli olmalıdır. :)