5

Próbuję renderować do dwóch tekstur za pomocą jednego przebiegu przy użyciu SDK C++ directx 11. Chcę, aby jedna tekstura zawierała kolor każdego piksela obrazu wynikowego (co normalnie widzę na ekranie podczas renderowania sceny 3D), a inna tekstura zawierała normalny dla każdego piksela i głębokości (3 zmienne dla normalnego i 1 zmiennoprzecinkowe) na głębokość). W tej chwili mogę stworzyć dwa cele renderowania i przekazać pierwsze przejście jako kolory, a następnie przekazać normalne i głębokie do każdego celu renderowania. Wydaje się to jednak stratą czasu, ponieważ w pierwszym przebiegu mogę uzyskać informacje o kolorze, wartości normalnej i głębokości każdego piksela. Czy istnieje sposób, aby jakoś wyprowadzić dwie tekstury za pomocą cieniowania pikseli?Renderowanie do wielu tekstur z jednym przejściem w DirectX 11

Każda pomoc zostanie doceniona.

P.S. Myślę, że coś podobnego do RWTexture2D lub RWStructuredBuffer w pixel shader. Nieco tła: Będę potrzebował dwóch obrazów do dalszego przetwarzania w module cieniującym Compute. Co wywołuje boczne pytanie o synchronizację: ponieważ moduł cieniujący pikseli (w przeciwieństwie do modułu cieniującego Compute) zapisuje każdy piksel po jednym na raz, jak powinienem wiedzieć, kiedy moduł cieniujący pikseli jest gotowy i nakazuje procesorowi Compute, aby rozpoczął przetwarzanie obrazu?

Odpowiedz

10

Musisz użyć MRT (wiele celów renderujących), aby renderować to za jednym razem.

można wiązać zarówno celów, jak wyjść z użyciem OMSetRenderTargets

http://msdn.microsoft.com/en-us/library/windows/desktop/ff476464(v=vs.85).aspx

Jest przykładem w http://hieroglyph3.codeplex.com/ (DefferedRendering), które następnie pokazuje, jak napisać do obu faktur naraz.

Wystarczy w zasadzie swoją pixel shader będzie wyjście struktura zamiast jednego koloru:

struct PS_OUTPUT 
{ 
    float4 Color: SV_Target0; 
    float4 Normal: SV_Target1; 
}; 

Również w DirectX11 nie należy trzeba napisać głębokości do normalnego bufora, można po prostu użyć bufora głębokości.

Aby zsynchronizować moduł cieniujący Pixel/Compute, nie można uruchomić modułu cieniującego pikseli i modułu cieniującego Compute w tym samym czasie na tym samym urządzeniu, więc po zakończeniu wywołań rysowania tekstury są gotowe do wykorzystania w obliczeniach do wysyłki .

+0

Dzięki. Zwłaszcza w przypadku linków. Nie możesz zacząć wyobrażać sobie, jak bardzo są pomocne. Dzięki jeszcze raz. Nawiasem mówiąc, przez "bufor głębi" rozumiesz wartość SV_Depth dla pixel shadera? (Myślę, że gdzieś to czytam, ale nie jestem zbyt pewny.) +1 i przyjęta odpowiedź. – l3utterfly

+0

Brak problemów. SV_Depth to, jeśli chcesz napisać własną wartość głębokości, jest to przydatne w niektórych przypadkach (głębokość od raytracerów PixelShader lub niektórych manipulatorów Texture Array). Chodzi mi o to, że zasób DepthStencil może być również powiązany z widokiem Shader Resource View, więc ponieważ wiążesz również bufor głębi z twoją sceną, możesz równie dobrze go użyć, to nic nie kosztuje) – catflier

Powiązane problemy