Názorný postup: Chybí objekty kvůli stavu zařízení
Tento názorný postup ukazuje, jak použít Visual Studio diagnostiky grafiky k prozkoumání objektu, který chybí z důvodu nesprávné konfigurace stavu zařízení.
Tento názorný postup znázorňuje, jak:
Použijte Seznam událostí grafiky k vyhledání potenciálních zdrojů problému.
Použijte okno Fáze kanálu grafiky ke kontrole účinku DrawIndexed volání rozhraní API Direct3D.
Použijte okno Historie pixelů grafiky ke konkrétnějšímu stanovení problému.
Zkontrolujte stav zařízení na výskyt potenciálních problémů nebo chybné konfigurace.
Situace
Jedním z důvodů, proč se nemusí objekty zobrazit tam, kde se očekává v 3D aplikaci, je špatná konfigurace grafického zařízení, které způsobují vyjmutí objektů z vykreslování - například, pokud vinuté pořadí způsobuje chybné vyloučení trojúhelníků, nebo pokud funkce rozsáhlého testu způsobí, že se zamítnou všechny obrazové body v objektu.
Ve scénáři, který je popsán v tomto návodu, jste právě dosáhli prvního milníku při vývoji vaší 3D aplikace a jste připraveni ji poprvé vyzkoušet.Při spuštění aplikace se na obrazovku vykreslí pouze uživatelské rozhraní.Pomocí Diagnostiky grafiky můžete zaznamenat problém do souboru protokolu grafiky pro účely ladění aplikace.Problém v aplikace vypadá následovně:
Informace o tom, jak zachytit problémy s grafikou v protokolu grafiky, naleznete zde: Zachycení informací grafiky.
Zkoumání
Pomocí nástrojů Diagnostiky grafiky můžete načíst soubor protokolu grafiky pro účely kontroly rámců, které byly zaznamenány během testu.
Přezkoumání snímku v protokolu grafiky
V Visual Studio načtěte protokol grafiky, který obsahuje snímek zobrazující chybějící model.Nová karta Diagnostika grafiky se zobrazí v Visual Studio.V horní části této karty je výstup cíle vykreslení vybraného snímku.V dolní části je Seznam snímků, který zobrazuje každý zachycený snímek jako miniaturu.
V seznamu snímků vyberte snímek, který ukazuje, že není zobrazen model.Cíl vykreslení je aktualizován, aby odrážel vybraný snímek.V tomto scénáři vypadá karta protokolu grafiky takto:
Po vybrání rámce, který znázorňuje problém, můžete použít Seznam událostí grafiky k provedení diagnostiky.Seznam událostí grafiky obsahuje každé volání rozhraní API Direct3D vytvořené pro vykreslení aktivní rámce, například volání API nastavující stav zařízení, tvorbu a aktualizaci vyrovnávací paměti a kreslení objektů, které se zobrazí ve snímku.Mnoho druhů volání je zajímavých, protože často (ale ne vždy) existuje odpovídající změna cíle vykreslení, když aplikace pracuje podle očekávání, například volání kreslení, odeslání, kopírování nebo mazání.Pokyny k vykreslení jsou zajímavé, protože každý z nich představuje geometrii, kterou aplikace vykreslila (pokyny k odeslání rovněž vykreslují geometrii).
Ujistěte se, zda dochází k voláním draw
Otevřete okno Seznam událostí grafiky.Na panelu nástrojů Diagnostika grafiky vyberte možnost Seznam událostí.
Zkontrolujte volání draw v seznamu událostí grafiky.Pro zjednodušení, zadejte v pravém horním rohu okna Seznam událostí grafiky v poli Hledání termín „Draw".Seznam tak bude vyfiltrován, aby obsahoval pouze události, které obsahují v názvech řetězec „Draw“.V tomto scénáři zjistíte, že bylo provedeno několik draw volání:
Po potvrzení, že jsou prováděny pokyny k vykreslování, můžete určit, které z nich odpovídá chybějící geometrii.Protože víte, že chybějící geometrie není do cíle vykreslení vykreslována (v tomto případě), můžete použít okno Fáze kanálu grafiky k určení, který pokyn k vykreslení odpovídá chybějící geometrii.Okno Fáze kanálu grafiky zobrazí geometrii, která byla odeslána jednotlivým voláním draw, bez ohledu na její vliv na cíl vykreslení.Při procházení pokynů k vykreslení jsou fáze kanálu aktualizovány a zobrazují geometrii, která je přidružena k danému pokynu, a cílový výstup vykreslení je aktualizován tak, aby po dokončení pokynu zobrazoval stav cíle vykreslení.
Vyhledání volání draw chybějící geometrie
Otevřete okno Fáze kanálu grafiky.Na panelu nástrojů Diagnostika grafiky vyberte možnost Fáze kanálu.
Projděte každé volání draw a hledejte v okně Fáze kanálu grafiky chybějící model.Vstupní Assembler fáze zobrazuje data raw modelu.Fáze Vertex Shader zobrazuje transformovaná data modelu.Fáze Pixel Shader zobrazuje výstup shaderu pixelu.Fáze Výstup fúze ukazuje sloučené vykreslení cíl tohoto volání draw a všechna předchozích volání draw.
Zastavte jakmile dosáhnete volání draw, které odpovídá chybějícímu modelu.V tomto scénáři okno Fáze kanálu grafiky ukazuje, že geometrie byla vykreslena, ale nezobrazila se v cíli vykreslení:
Po ověření, že aplikace vykreslila chybějící geometrii, a vyhledání odpovídajícího pokynu k vykreslení můžete vybrat část cílového výstupu vykreslení, která by měl zobrazovat chybějící geometrii, a potom použít okno Historie pixelů grafiky ke zjištění, proč byly pixely vyloučeny.Historie pixelu obsahuje seznam všech volání draw, který může mít vliv na určitý obrazový bod.Každý pokyn k vykreslení v okně Historie pixelů grafiky je identifikován číslem, které se také zobrazuje v okně Seznam událostí grafiky.To vám pomůže potvrdit, že pixel zobrazí chybějící geometrii a zjistit, proč byl pixel vyloučen.
Určení, proč byl pixel vyloučen
Otevřete okno Historie obrazového bodu grafiky.Na panelu nástrojů Diagnostika grafiky vyberte možnost Historie obrazového bodu.
Na základě miniatury Pixel Shader vyberte pixel ve výstupu vyrovnávací paměti rámců, který by měl obsahovat část chybějící geometrie.V tomto scénáři by výstup pixel shaderu měl pokrýt většinu cíle vykreslení; po výběru obrazového bodu vypadá okno Historie obrazových bodů grafiky takto:
Potvrďte, že vybraný pixel vykreslení obsahuje část geometrie, přiřazením počtu pokynů k vykreslení při kontrole (z okna Seznam událostí grafiky) k jednomu pokynu k vykreslení v okně Historie pixelů grafiky.Pokud žádná volání v okně Historie obrazových bodů grafiky nevyhovují volání malování, které kontrolujete, opakujte tyto kroky (kromě kroku 1), dokud nenaleznete shodu.V tomto scénáři vypadá odpovídající volání draw takto:
Když najdete shodu, rozbalte odpovídající volání draw v okně Historie grafických pixelů a potvrďte, že byl pixel vyloučen.Každý pokyn k vykreslení v okně Historie pixelů grafiky odpovídá jednomu nebo více geometrickým primitivům (bodům, čarám nebo trojúhelníkům), které protínají tento pixel v důsledku geometrie příslušného objektu.Každý takový průnik může přispět k konečné barvě pixelu.Základní tvar vyloučený kvůli nesplnění podmínek testu hloubky je reprezentován ikonou zobrazující písmeno Z nad šipkou, která směruje dolů zleva doprava.
Rozbalte vyloučené primitivum a proveďte dalšího prozkoumání stavu, který jeho vyloučení způsobil.Ve skupině Výstupní sloučení přesuňte ukazatel na Výsledek.Popisek označuje, proč bylo vyloučeno primitivum.V tomto scénáři zkouška odhalí, že bylo vynecháno primitivum, protože selhalo v hloubkovém testu, a proto nepřispělo ke konečné barvě obrazového bodu.
Po zjištění, zda se geometrie neobjevuje, protože primitiva nesplnila test hloubky, můžete usuzovat, že problém souvisí s nesprávně konfigurovaným stavem zařízení.Stav zařízení a další data objektu Direct3D mohou být zkoumány pomocí Tabulky objektu grafiky.
Přezkoumání stavu zařízení
Otevřete okno Tabulka objektu grafiky.Na panelu nástrojů Diagnostika grafiky vyberte možnost Tabulka objektů.
Vyhledejte objekt Zařízení D3D10 v tabulce objektů grafiky a potom otevřete objekt Zařízení D3D10.V Visual Studiose otevře nová karta d3d10 zařízení.Zjednodušení můžete dosáhnout tak, že seřadíte Tabulku objektu grafiky podle typu:
Prozkoumejte stav zařízení, který je zobrazen na kartě zařízení d3d10 zařízení, zda nenastaly potenciální problémy.Protože geometrie se nezobrazí, protože její primitiva nesplnila hloubkový test, můžete se zaměřit na stav zařízení, například šablonu hloubky, která ovlivňuje hloubkový test.V tomto scénáři popis šablony hloubky (depth stencil) (pod položkou stav výstupního sloučení) obsahuje neobvyklou hodnotu pro člena funkce hloubky, D3D10_COMPARISON_GREATER:
Po zjištění, zda může být příčinou problému vykreslování nesprávně konfigurovaná funkce hloubky, můžete pomocí těchto informací společně se znalostí kódu vyhledat, kde byla funkce hloubky nesprávně nastavena, a problém vyřešit.Pokud neznáte kód, může problém vyhledávat pomocí záchytných bodů, které jste shromáždili během ladění – například na základě Popisu hloubky vzorníku v tomto scénáři může vyhledat kód slov jako „hloubka“ nebo „VĚTŠÍ“.Po opravě kódu jej znovu vytvořte a spusťte aplikaci znovu, abyste zjistili, zda je problém vykreslování vyřešen: