Dela via


Predikat

Predikat är en funktion som gör det möjligt för GPU:n i stället för processorn att bestämma att inte rita, kopiera eller skicka ett objekt.

Överblick

Den typiska användningen av predikat är med ocklusion; Om en avgränsningsruta ritas och är ockluderad, är det uppenbarligen ingen mening med att rita själva objektet. I det här fallet kan ritningen av objektet "predikat", vilket gör det möjligt att ta bort det från den faktiska återgivningen av GPU:n.

Först kan detta verka överflödigt utöver standarddjuptestet plus ett tidigt djuppass. Men predikat kan ta bort omkostnaderna för själva dragningskommandots tillstånd, plus rastreringen. Ett tidigt djuppass tar bort onödiga bildpunkter, men det kan fortfarande köra hörn, skrov, domäner och geometriskuggor och anropa indatamonteraren med fast funktion, tesselator och rasterizer. Genom att rita en enkel avgränsningsruta eller liknande avgränsningsvolym – vilket är enklare att bearbeta och rastrera än den verkliga modellen – undviker du onödig rastrering och bearbetning.

Till skillnad från Direct3D 11 är predikat frikopplat från frågor och expanderas i Direct3D 12 för att göra det möjligt för ett program att predika objekt baserat på eventuella resonemang som apputvecklaren kan besluta om (inte bara ocklusion).

SetPredication

Predikat kan anges baserat på värdet 64 bitar i en buffert (se D3D12_PREDICATION_OP).

När GPU:n kör ett SetPredication- kommando fästs värdet i bufferten. Framtida ändringar av data i bufferten påverkar inte predikattillståndet retroaktivt.

Om indataparametern Buffer är NULL inaktiveras predikatet.

Predicationstips finns inte i Direct3D 12-API:et. och predikat tillåts på kommandolistor för direkt, beräkning och kopiering. Källbufferten kan vara i valfri heaptyp (standard, uppladdning, återläsning, anpassad).

Kärnkörningen verifierar följande:

  • AlignedBufferOffset är en multipel av 8 byte
  • Resursen är en buffert
  • Åtgärden är en giltig medlem i uppräkningen
  • SetPredication kan inte anropas inifrån ett paket
  • Kommandolistetypen stöder predikat
  • Förskjutningen överskrider inte buffertstorleken

Felsökningsskiktet utfärdar ett fel om källbufferten inte finns i D3D12_RESOURCE_STATE_PREDICATION (vilket är samma som D3D12_RESOURCE_STATE_INDIRECT_ARGUMENT, och bara ett alias).

Den uppsättning åtgärder som kan predikas är:

ExecuteBundle är inte baserat på sig själv. I stället predikas enskilda åtgärder från listan ovan som finns i sidan av paketet.

Metoderna ID3D12GraphicsCommandList ResolveQueryData, BeginQuery och EndQuery är inte predikat.

räknare och frågor

predikatfrågor går igenom