Farklı nesneler için farklı gölgelendiriciler DirectX 11


13

Öğreniyorum Direct3D 11ve gölgelendirici yazımda bulduğum tüm temel eğitimlerde Vertex ve Pixel gölgelendiriciler yazılıyor, böylece tüm sahneyi aynı şekilde dönüştürüyorlar. Doku ile render küp gibi öğreticiler ...

Ama merak ediyorum, nesneleri nasıl ayırt ediyorsunuz? Örneğin, bir nesnenin ayna yüzeyini simüle etmek ve sahnenin geri kalanını oluşturmak için farklı gölgelendiriciler kullanmak isterseniz ne olur? Çoğu oyunun çeşitli görünüm ve dönüşümler elde etmek için birçok köşe ve piksel gölgelendirici kullanması gerektiğini düşünüyorum.

Teşekkür ederim.

Yanıtlar:


23

Evet, bir oyun motorunda genel olarak çeşitli gölgelendiriciler bulunur. Tipik örüntü:

  1. 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::CreatePixelShaderve 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.

  2. 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.

  3. Ç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. :)


Önce gölgelendiriciye ve sonra malzemeye göre sıralama öneriyorsunuz. Anahtarlama gölgelendiricilerinin anahtarlama malzemelerine karşı maliyeti hakkında kesin verileriniz var mı? Oh, ve DX9 için VS / PS kombinasyonuna "program" denir. DX11'de hala bu terminolojiyi kullanıp kullanmadıklarından emin değilim.
Panda Pijama

1
@PandaPajama Bu iyi bir soru. Hayır, anahtarlama malzemelerinin veya gölgelendiricilerin gerçek maliyetinin yakın tarihli ölçümlerini bilmiyorum veya bilmiyorum. Bu yaklaşım yıllardır "ortak bilgelik" olmuştur, ancak işlerin nasıl değiştiğini görmek için bazı gerçek ölçümler yapmaya değer ... belki zaman bulabilirsem bunu yaparım. :)
Nathan Reed
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.