2012-11-20 7 views

Odpowiedz

11

Jeśli zamiarem jest wykorzystanie go jako wejście do innego shadera: - wystarczy upewnić się, stworzył texture2D z D3D11_BIND_RENDER_TARGET i D3D11_BIND_SHADER_RESOURCE.

  • Bind teksturę jako cel renderowania i renderowania do niego.
  • Odwiąż go jako cel renderowania i powiąż go jako zasobu modułu cieniującego i użyj go w następnym module cieniującym.
  • Należy zauważyć, że tekstura nie może zostać powiązana jako cel i zasób w tym samym czasie.

Jeśli zamiarem jest, aby uzyskać dostęp do tekstury na CPU z wykorzystaniem C++ jako tablica pikseli, potem trzeba popracować. Niestety, ze względu na obecne architektury GPU, nie jest możliwy bezpośredni dostęp do pikseli texture2D, ponieważ piksele faktycznie żyją w potencjale pamięci GPU w specjalnym formacie (format swizzlowany).

  • Utwórz teksturę, na którą może się wyświetlać GPU.
  • Utwórz teksturę pomostową (D3D11_USAGE_STAGING), która będzie używana do odbierania danych wyjściowych układu GPU.
  • Renderuj na teksturę GPU.
  • Wydaj ID3D11DeviceContext :: CopyResource() lub ID3D11DeviceContext :: CopySubresource()
  • połączeń ID3D11DeviceContext :: Mapa() w zasobie pomostowym, aby uzyskać dostęp do pikseli.
  • Wywołanie ID3D11DeviceContext :: Unmap() dla zasobu pomostowego.
  • Wywołanie ID3D11DeviceContext :: UpdateSubresource() w celu zaktualizowania wersji zasobu, którą posiada GPU.

Jak widać, nie jest to z pewnością trywialny zestaw operacji i jest sprzeczny z tym, do czego jest dzisiaj zoptymalizowana architektura GPU. Na pewno nie poleciłbym tego.

Jeśli nie skończyć się tą drogą, należy również przeczytać o wszystkich problemów perf pamięci GPU odczytany pochodzi z: http://msdn.microsoft.com/en-us/library/windows/desktop/bb205132(v=vs.85).aspx#Performance_Considerations

Powiązane problemy