Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Poniższa strona zawiera podstawowy zarys kluczowych różnic między direct3D 9 i Direct3D 10. W poniższym konspekcie przedstawiono pewne informacje ułatwiające deweloperom używanie środowiska Direct3D 9 w celu eksplorowania i powiązania z usługą Direct3D 10.
Chociaż informacje w tym temacie porównują Direct3D 9 z Direct3D 10, ponieważ direct3D 11 opiera się na ulepszeniach wprowadzonych w trybie Direct3D 10 i 10.1, te informacje są również potrzebne do migracji z direct3D 9 do Direct3D 11. Aby uzyskać informacje na temat przechodzenia poza tryb Direct3D 10 do Direct3D 11, zobacz Migrowanie do wersji Direct3D 11.
-
omówienie głównych zmian strukturalnych w Direct3D 10
- usuwanie funkcji stałych
- sprawdzanie poprawności czasu tworzenia obiektu urządzenia
- Abstrakcji aparatu /separacji
- wskazówki dotyczące szybkiego rozwiązywania problemów z kompilacją aplikacji
-
napędzanie interfejsu API Direct3D 10
- tworzenie zasobów
- widoków
- statyczny i dynamiczny dostęp do zasobów
- efekty Direct3D 10
- HLSL bez efektów
- kompilacji cieniowania
- tworzenie zasobów cieniowania
- interfejs warstwy odbicia cieniowania
- układy asemblera danych wejściowych — cieniowania wierzchołków/powiązania strumienia wejściowego
- wpływ usuwania nieaktywnego kodu cieniowania
- Przykład struktury danych wejściowych cieniowania wierzchołków
- tworzenie obiektu stanu
- Przenoszenie tekstur
-
przenoszenie cieniowania
- cieniowania Direct3D 10 są tworzone w HLSL
- podpisy cieniowania i łączenia
- powiązania etapu cieniowania HLSL
- stałe
- płaszczyzny klipów użytkownika w programie HLSL na poziomie funkcji 9 i wyższym
-
dodatkowe różnice w trybie Direct3D 10, aby obejrzeć
- liczby całkowite jako wejściowe
- kursory myszy
- mapowanie texels na piksele w Direct3D 10
- zmiany zachowania zliczania odwołań
- testowego poziomu współpracy
- StretchRect
- dodatkowe różnice w wersji Direct3D 10.1
- Tematy pokrewne
Omówienie głównych zmian strukturalnych w trybie Direct3D 10
- usuwanie funkcji stałych
- sprawdzanie poprawności czasu tworzenia obiektu urządzenia
Proces renderowania przy użyciu urządzenia Direct3D 10 jest strukturalnie podobny do Direct3D 9.
- Ustawianie źródła strumienia wierzchołków
- Ustaw układ wejściowy w trybie Direct3D 10 (ustaw deklarację strumienia wierzchołka w trybie Direct3D 9)
- Deklarowanie topologii pierwotnej
- Ustawianie tekstur
- Ustawianie obiektów stanu
- Ustawianie cieniowania
- Rysować
Wywołanie Draw łączy operacje ze sobą; kolejność wywołań przed wywołaniem rysowania jest dowolna. Główne różnice w projekcie interfejsu API Direct3D 10 są następujące:
- Usuwanie funkcji stałej
- Usunięcie bitów CAPS — podstawowy zestaw funkcji Direct3D 10 jest gwarantowany
- Bardziej rygorystyczne zarządzanie: dostęp do zasobów, stan urządzenia, stałe cieniowania, łączenie cieniowania (dane wejściowe i wyjściowe do cieniowania) między etapami
- Zmiany nazwy punktu wejścia interfejsu API odzwierciedlają użycie pamięci wirtualnego procesora GPU (Map() zamiast Lock()).
- Warstwę debugowania można dodać do urządzenia w czasie tworzenia
- Topologia pierwotna jest teraz stanem jawnym (oddzielonym od wywołania Draw)
- Jawne stałe cieniowania są teraz przechowywane w stałych
- Tworzenie cieniowania odbywa się w całości w programie HLSL. Kompilator HLSL znajduje się teraz w podstawowej biblioteki DLL Direct3D 10.
- Nowy programowalny etap — cieniator geometrii
- Usunięcie elementu BeginScene()/EndScene()
- Typowe funkcje 2D, koncentracji uwagi i zarządzania kartami zaimplementowane w nowym składniku: DXGI
Usuwanie funkcji stałej
Czasami zaskakujące jest, że nawet w aucie Direct3D 9, który w pełni wykorzystuje programowalny potok, pozostaje wiele obszarów, które zależą od potoku funkcji stałej (FF). Najbardziej typowe obszary są zwykle związane z renderowaniem wyrównanym do obszaru ekranu dla interfejsu użytkownika. Z tego powodu prawdopodobnie konieczne będzie utworzenie cieniowania emulacji FF lub zestawu cieniowania, które zapewniają niezbędne zachowania zastępcze.
Ta dokumentacja zawiera oficjalny dokument zawierający źródła cieniowania zastępczego dla najbardziej typowych zachowań FF (zobacz Fixed Function EMU Sample). Niektóre zachowania pikseli funkcji stałej, w tym test alfa, zostały przeniesione do cieniowania.
Weryfikacja czasu tworzenia obiektu urządzenia
Potok Direct3D 10 został przeprojektowany od podstaw w sprzęcie i oprogramowaniu z podstawowym zamiarem zmniejszenia obciążenia procesora CPU (w czasie rysowania). Aby zmniejszyć koszty, wszystkie typy danych urządzeń zostały przypisane do obiektu z jawnymi metodami tworzenia udostępnianymi przez samo urządzenie. Umożliwia to ścisłą walidację danych w czasie tworzenia obiektu zamiast podczas wywołania Rysuj, tak jak często w przypadku direct3D 9.
Abstrakcje silnika/separacja
Aplikacje, w tym gry, które chcą obsługiwać zarówno Direct3D 9, jak i Direct3D 10, muszą mieć warstwy renderowania abstrahowane od pozostałej części bazy kodu. Istnieje wiele sposobów osiągnięcia tego celu, ale kluczem do wszystkich z nich jest projektowanie warstwy abstrakcji dla urządzenia Direct3D niższego poziomu. Wszystkie systemy powinny komunikować się ze sprzętem za pośrednictwem wspólnej warstwy, która została zaprojektowana w celu zapewnienia zarządzania zasobami procesora GPU i typem niskiego poziomu.
Bezpośrednie usuwanie zależności direct3D 9
Podczas przenoszenia dużych, wcześniej przetestowanych baz kodu ważne jest zminimalizowanie ilości zmian kodu w tych, które są absolutnie niezbędne do zachowania wcześniej przetestowanych zachowań w kodzie. Najlepsze rozwiązania obejmują wyraźne dokumentowanie, w których elementy zmieniają się przy użyciu komentarzy. Często warto mieć standard komentowania dla tej pracy, który umożliwia szybką nawigację za pośrednictwem bazy kodu.
Poniżej znajduje się przykładowa lista standardowych komentarzy jednowierszowych/początkowych bloków, które mogą być używane do tej pracy.
| Przedmiot | Opis |
|---|---|
| usunięto // Direct3D 10 |
Użyj tego miejsca, w którym usuwane są wiersze/bloki kodu |
|
// Direct3D 10 WYMAGA AKTUALIZACJI |
Ułatwia dodanie dodatkowych notatek do komentarza NEED UPDATE, który sugeruje, co działa /nowy interfejs API powinien być używany do późniejszej wizyty w kodzie na potrzeby konwersji zachowania. Duże użycie asercji(false) powinno być również używane, gdy \\ Direct3D 10 WYMAGA AKTUALIZACJI występuje, aby upewnić się, że nie uruchamiasz nieświadomie błędnego kodu |
|
// Zmieniono tryb Direct3D 10 |
Obszary, w których wystąpiły poważne zmiany, powinny być przechowywane w przyszłości, ale skomentowane |
|
// Direct3D 10 END |
Kwalifikator bloku kodu końcowego |
W przypadku wielu wierszy źródła należy użyć stylu C /* */ komentarze zbyt, ale dodać odpowiednie komentarze początkowe / końcowe wokół tych obszarów.
Wskazówki dotyczące szybkiego rozwiązywania problemów z kompilacją aplikacji
- zastępowanie typów Direct3D 9
- rozwiązywanie problemów z łączem
- symulowanie adresów CERTYFIKACJI urządzeń
Zastępowanie typów Direct3D 9
Może być przydatne wstawienie pliku nagłówka wysokiego poziomu zawierającego definicje typów /przesłonięcia dla typów podstawowych Direct3D 9, które nie są już obsługiwane przez nagłówki Direct3D 10. Pomoże to zminimalizować ilość zmian w kodzie i interfejsach, w których istnieje bezpośrednie mapowanie z typu Direct3D 9 do nowo zdefiniowanego typu Direct3D 10. Takie podejście jest również przydatne do zachowania kodu w jednym pliku źródłowym. W tym przypadku dobrym pomysłem jest zdefiniowanie neutralnych/ogólnie nazwanych typów wersji, które opisują typowe konstrukcje używane do renderowania, ale obejmują zarówno interfejsy API Direct3D 9, jak i Direct3D 10. Na przykład:
#if defined(D3D9)
typedef IDirect3DIndexBuffer9 IDirect3DIndexBuffer;
typedef IDirect3DVertexBuffer9 IDirect3DVertexBuffer;
#else //D3D10
typedef ID3D10Buffer IDirect3DIndexBuffer;
typedef ID3D10Buffer IDirect3DVertexBuffer
#endif
Inne przykłady konkretnej wersji Direct3D 10 obejmują:
typedef ID3D10TextureCube IDirect3DCubeTexture;
typedef ID3D10Texture3D IDirect3DVolumeTexture;
typedef D3D10_VIEWPORT D3DVIEWPORT;
typedef ID3D10VertexShader IDirect3DVertexShader;
typedef ID3D10PixelShader IDirect3DPixelShader;
Rozwiązywanie problemów z łączem
Zaleca się tworzenie aplikacji Direct3D 10 i Windows Vista przy użyciu najnowszej wersji programu Microsoft Visual Studio. Można jednak utworzyć aplikację systemu Windows Vista, która zależy od wersji Direct3D 10 przy użyciu starszej wersji programu Visual Studio 2003. Direct3D 10 jest składnikiem platformy Windows Vista, który ma zależności (podobnie jak w przypadku zestawu SDK platformy Server 2003 SP1) w następującej bibliotece: BufferOverflowU.lib jest potrzebny do rozwiązania wszelkich buffer_security problemów z konsolidatorem sprawdzania.
Symulowanie adresów CAPs urządzeń
Wiele aplikacji zawiera obszary kodu, które zależą od dostępnych danych CAPS urządzenia. Obejście tego celu przez zastąpienie wyliczenia urządzenia i wymuszenie na rozsądnych wartościach capS urządzeń. Zaplanuj ponowne odwiedzanie obszarów, w których istnieją zależności od CAPS później w celu pełnego usunięcia CAPS tam, gdzie to możliwe.
Kierowanie interfejsu API Direct3D 10
Ta sekcja koncentruje się na zmianach zachowania spowodowanych przez interfejs API Direct3D 10.
- tworzenie zasobów
- widoków
- statyczny i dynamiczny dostęp do zasobów
- efekty Direct3D 10
- HLSL bez efektów
- kompilacji cieniowania
- tworzenie zasobów cieniowania
- interfejs warstwy odbicia cieniowania
- układy asemblera danych wejściowych — cieniowania wierzchołków/powiązania strumienia wejściowego
- wpływ usuwania nieaktywnego kodu cieniowania
- Przykład struktury danych wejściowych cieniowania wierzchołków
- tworzenie obiektu stanu
Tworzenie zasobów
Interfejs API Direct3D 10 zaprojektował zasoby jako typy ogólnych, które mają określone flagi powiązania zgodnie z zaplanowanym użyciem. Ten punkt projektowy został wybrany w celu ułatwienia niemal wszechobecnego dostępu do zasobów w potoku dla scenariuszy, takich jak renderowanie do buforu wierzchołka, a następnie natychmiastowe rysowanie wyników bez przerywania procesora CPU. W poniższym przykładzie pokazano alokację wierzchołków i buforu indeksu, gdzie widać, że opis zasobu różni się tylko od flag powiązania zasobów procesora GPU.
Interfejs API Direct3D 10 udostępnia metody pomocnika tekstury do jawnego tworzenia zasobów typu tekstury, ale jak można sobie wyobrazić, są to naprawdę funkcje pomocnicze.
- CreateTexture2D()
- CreateTextureCube()
- CreateTexture3D()
W przypadku określania wartości docelowej Direct3D 10 prawdopodobnie chcesz przydzielić więcej elementów w czasie tworzenia zasobów niż w przypadku używania funkcji Direct3D 9. Stanie się to najbardziej widoczne w przypadku tworzenia obiektów docelowych renderowania i tekstur, w których należy również utworzyć widok umożliwiający uzyskanie dostępu do buforu i ustawienie zasobu na urządzeniu.
Samouczek 1: Podstawowe Direct3D 10
Nuta
Direct3D 10 i nowsze wersje Direct3D rozszerzają format pliku DDS, aby obsługiwać nowe formaty DXGI, tablice tekstur i tablice mapy modułu. Aby uzyskać więcej informacji na temat rozszerzenia formatu pliku DDS, zobacz przewodnik programowania dla usługi DDS.
Widoki
Widok jest specjalnie wpisany, interfejs do danych przechowywanych w buforze pikseli. Zasób może mieć przydzielone kilka widoków jednocześnie, a ta funkcja jest wyróżniona w przykładzie Single Pass Render to Cubemap zawartego w tym zestawie SDK.
Developers Guide (Przewodnik dla programistów) na stronie Resource Access
przykład CubeMap
Dostęp do zasobów statycznych i dynamicznych
Aby uzyskać najlepszą wydajność, aplikacje powinny partycjonować ich użycie danych pod względem statycznego i dynamicznego charakteru danych. Direct3D 10 został zaprojektowany tak, aby korzystać z tego podejścia i w związku z tym reguły dostępu do zasobów zostały znacznie zaostrzone w porównaniu z Direct3D 9. W przypadku zasobów statycznych najlepiej wypełnić zasób swoimi danymi w czasie tworzenia. Jeśli aparat został zaprojektowany wokół tworzenia, blokowania, wypełniania, odblokowywania punktu projektowego Direct3D 9, możesz odroczyć populację z sekcji Tworzenie czasu przy użyciu zasobu przejściowego i metody UpdateSubResource w interfejsie zasobu.
Efekty Direct3D 10
Korzystanie z systemu Efektów Direct3D 10 wykracza poza zakres tego artykułu. System został napisany, aby w pełni wykorzystać korzyści architektoniczne zapewniane przez funkcję Direct3D 10. Zobacz sekcję Effects (Direct3D 10), aby uzyskać więcej informacji na temat jej użycia.
HLSL bez efektów
Potok cieniowania Direct3D 10 może być napędzany bez użycia systemu Efektów Direct3D 10. Należy pamiętać, że w tym wystąpieniu wszystkie stałe, cieniowanie, próbkator i powiązanie tekstury muszą być zarządzane przez samą aplikację. Aby uzyskać więcej szczegółów, zobacz przykładowy link i następujące sekcje tego dokumentu:
HLSL bez przykładowych efektów
Kompilacja cieniowania
Kompilator HLSL Direct3D 10 oferuje ulepszenia definicji języka HLSL i dlatego ma możliwość działania w 2 trybach. Aby uzyskać pełną obsługę funkcji wewnętrznych i semantyki stylu Direct3D 9, kompilacja powinna być wywoływana przy użyciu flagi TRYB ZGODNOŚCI, który można określić na podstawie kompilacji.
Semantyka języka HLSL specyficznego dla modelu cieniowania 4.0 i funkcje wewnętrzne dla direct3D 10 można znaleźć w HLSL. Główne zmiany składni z Direct3D 9 HLSL do podjęcia najwięcej uwagi są w obszarze dostępu tekstury. Nowa składnia jest jedyną formą obsługiwaną przez kompilator poza trybem zgodności.
Nuta
Interfejsy API typu kompilatora Direct3D 10 (D3D10CompileShader i D3D10CompileEffectFromMemory) są dostarczane przez środowiska uruchomieniowe Direct3D 10, 10.1 i 11, które działają w systemie Windows Vista i nowszych. Interfejsy API kompilatora direct3D 10 mają takie same funkcje jak kompilator HLSL dostarczany w zestawie SDK DirectX (grudzień 2006 r.). Ten kompilator HLSL nie obsługuje profilów Direct3D 10.1 (vs_4_1, ps_4_1, gs_4_1, fx_4_1) i nie ma wielu optymalizacji i ulepszeń. Możesz uzyskać kompilator HLSL, który obsługuje profile direct3D 10.1 z najnowszej starszej wersji zestawu SDK DirectX. Aby uzyskać informacje na temat starszego zestawu SDK DirectX, zobacz Gdzie jest zestaw SDK DirectX?. Najnowszą wersję kompilatora wiersza polecenia HLSL Fxc.exe i interfejsy API D3DCompiler z zestawu Windows SDK.
Tworzenie zasobów cieniowania
Tworzenie skompilowanych wystąpień cieniowania poza systemem Efektów Direct3D 10 odbywa się w bardzo podobny sposób do direct3D 9, jednak w trybie Direct3D 10 ważne jest zachowanie podpisu danych wejściowych cieniowania w celu późniejszego użycia. Podpis jest zwracany domyślnie jako część obiektu blob cieniowania, ale może zostać wyodrębniony w celu zmniejszenia wymagań dotyczących pamięci w razie potrzeby. Aby uzyskać więcej informacji, zobacz Using Shaders in Direct3D 10.
Interfejs warstwy odbicia cieniowania
Warstwa odbicia cieniowania to interfejs, za pomocą którego można uzyskać informacje o wymaganiach cieniowania. Jest to szczególnie przydatne podczas tworzenia powiązań zestawu wejściowego (patrz poniżej), w których może być konieczne przejście przez wymagania wejściowe modułu cieniowania, aby upewnić się, że dostarczasz poprawną strukturę wejściową do cieniowania. Wystąpienie interfejsu warstwy odbicia można utworzyć jednocześnie jako wystąpienie skompilowanego cieniowania.
Warstwa odbicia cieniowania zastępuje metody D3DX9, które zapewniają podobne funkcje. Na przykład IsParameterUsed jest zastępowany metodą GetDesc.
Układy asemblera danych wejściowych — cieniowania wierzchołków/łączenie strumienia wejściowego
Asembler wejściowy (IA) zastępuje deklarację strumienia wierzchołka w stylu Direct3D 9, a struktura opisu jest bardzo podobna w postaci. Główną różnicą, jaką przynosi IA, jest to, że utworzony obiekt układu IA musi bezpośrednio mapować na określony format sygnatury wejściowej cieniowania. Obiekt mapowania utworzony w celu połączenia strumienia wejściowego z cieniowaniem może być używany w dowolnej liczbie cieniowań, w których sygnatura wejściowa cieniowania jest zgodna z cieniowaniem użytym do utworzenia układu wejściowego.
Aby najlepiej napędzać potok danymi statycznymi, należy rozważyć permutacje formatu strumienia wejściowego w celu uzyskania możliwych podpisów wejściowych cieniowania i jak najszybszego utworzenia wystąpień obiektów układu IA i ponownego użycia ich tam, gdzie to możliwe.
Wpływ usuwania nieaktywnego kodu cieniowania
W poniższej sekcji przedstawiono znaczącą różnicę między direct3D 9 i Direct3D 10, która prawdopodobnie wymaga starannej obsługi w kodzie aparatu. Cieniowania zawierające wyrażenia warunkowe często mają pewne ścieżki kodu usunięte w ramach procesu kompilacji. W wersji Direct3D 9 dwa rodzaje danych wejściowych mogą zostać usunięte (oznaczone do usunięcia), gdy nie są używane: dane wejściowe podpisu (jak w poniższym przykładzie) i stałe dane wejściowe. Jeśli koniec buforu stałego zawiera nieużywane wpisy, deklaracja rozmiaru w cieniatorze będzie odzwierciedlać rozmiar buforu stałego bez nieużywanych wpisów na końcu. Oba te rodzaje danych wejściowych pozostają w podpisach lub w stałych Direct3D 10 z specjalnym wyjątkiem w przypadku nieużywanych stałych danych wejściowych na końcu buforu stałego. Może to mieć wpływ na aparat podczas obsługi dużych cieniowania i tworzenia układów wejściowych. Elementy, które są usuwane przez optymalizacje martwych kodu w kompilatorze, muszą być nadal deklarowane w strukturze danych wejściowych. W poniższym przykładzie pokazano następujące kwestie:
Przykład struktury danych wejściowych cieniowania wierzchołków
struct VS_INPUT
{
float4 pos: SV_Position;
float2 uv1 : Texcoord1;
float2 uv2 : Texcoord2; *
};
* Usuwanie martwego kodu Direct3D 9 spowodowałoby usunięcie deklaracji w cieniatorze z powodu warunkowego usunięcia martwego kodu
float4x4 g_WorldViewProjMtx;
static const bool g_bLightMapped = false; // define a compile time constant
VS_INPUT main(VS_INPUT i)
{
VS_INPUT o;
o.pos = mul( i.pos, g_WorldViewProjMtx);
o.uv1 = i.uv1;
if ( g_bLightMapped )
{
o.uv2 = i.uv2;
}
return o;
}
Możesz też jeszcze bardziej oczywiste, że stała jest stałą czasu kompilacji z następującą deklaracją:
#define LIGHT_MAPPED false
W powyższym przykładzie w obszarze Direct3D 9 element uv2 zostanie usunięty ze względu na optymalizacje nieaktywnego kodu w kompilatorze. W obszarze Direct3D 10 martwy kod będzie nadal usuwany, ale układ modułu zbierającego cieniowania wymaga definicji danych wejściowych. Warstwa odbicia cieniowania zapewnia środki do obsługi tej sytuacji w ogólny sposób, w którym można przejść przez wymagania wejściowe modułu cieniowania i upewnić się, że podano pełny opis mapowania sygnatur wejściowych strumienia wejściowego do cieniowania.
Oto przykładowa funkcja wykrywania istnienia semantycznej nazwy/indeksu w podpisie funkcji:
// Returns true if the SemanticName / SemanticIndex is used in the input signature.
// pReflector is a previously acquired shader reflection interface.
bool IsSignatureElementExpected(ID3D10ShaderReflection *pReflector, const LPCSTR SemanticName, UINT SemanticIndex)
{
D3D10_SHADER_DESC shaderDesc;
D3D10_SIGNATURE_PARAMETER_DESC paramDesc;
Assert(pReflector);
Assert(SemanticName);
pReflector->GetDesc(&shaderDesc);
for (UINT k=0; k<shaderDesc.InputParameters; k++)
{
pReflector->GetInputParameterDesc( k, ¶mDesc);
if (wcscmp( SemanticName, paramDesc.SemanticName)==0 && paramDesc.SemanticIndex == SemanticIndex)
return true;
}
return false;
}
Tworzenie obiektu stanu
Podczas przenoszenia kodu aparatu może pomóc początkowo użyć domyślnego zestawu obiektów stanu i wyłączyć wszystkie ustawienia stanu renderowania urządzenia Direct3D 9/tekstury. Spowoduje to renderowanie artefaktów, ale jest najszybszym sposobem uruchamiania rzeczy. Później można utworzyć system zarządzania obiektami stanu, który może używać klucza złożonego, aby umożliwić maksymalne ponowne użycie liczby używanych obiektów stanu.
Przenoszenie tekstur
Obsługiwane formaty plików
Funkcje D3DXxxCreateXXX i D3DXxxSaveXXX, które tworzą lub zapisują teksturę z lub do pliku graficznego (na przykład D3DX10CreateTextureFromFile) obsługują inny zestaw formatów plików w trybie Direct3D 10 niż w trybie Direct3D 9:
| Format pliku | Direct3D 9 | Direct3D 10 |
|---|---|---|
| .bmp | tak | tak |
| .jpg | tak | tak |
| .tga | tak | |
| .png | tak | tak |
| .Dds | tak | tak |
| .Ppm | tak | |
| .Dib | tak | |
| .Hdr | tak | |
| .pfm | tak | |
| .Tiff | tak | |
| .gif | tak | |
| .tif | tak |
Aby uzyskać szczegółowe informacje, porównaj wyliczenia direct3D 9 D3DXIMAGE_FILEFORMAT z wyliczeniami D3DX10_IMAGE_FILE_FORMAT dla direct3D 10.
Nuta
Biblioteka narzędzi D3DX (D3DX 9, D3DX 10 i D3DX 11) jest przestarzała dla systemu Windows 8. W przypadku przetwarzania pliku tekstury zalecamy użycie DirectXTex.
Formaty tekstur mapowania
W poniższej tabeli przedstawiono mapowanie formatów tekstur z direct3D 9 do Direct3D 10. Każda zawartość w formatach niedostępnych w DXGI musi zostać przekonwertowana przez procedury narzędziowe.
| Direct3D 9 Format | Direct3D 10 Format |
|---|---|
| D3DFMT_UNKNOWN | DXGI_FORMAT_UNKNOWN |
| D3DFMT_R8G8B8 | Niedostępne |
| D3DFMT_A8R8G8B8 | DXGI_FORMAT_B8G8R8A8_UNORM & DXGI_FORMAT_B8G8R8A8_UNORM_SRGB |
| D3DFMT_X8R8G8B8 | DXGI_FORMAT_B8G8R8X8_UNORM & DXGI_FORMAT_B8G8R8X8_UNORM_SRGB |
| D3DFMT_R5G6B5 | DXGI_FORMAT_B5G6R5_UNORM² |
| D3DFMT_X1R5G5B5 | Niedostępne |
| D3DFMT_A1R5G5B5 | DXGI_FORMAT_B5G5R5A1_UNORM² |
| D3DFMT_A4R4G4B4 | DXGI_FORMAT_B4G4R4A4_UNORM³ |
| D3DFMT_R3G3B2 | Niedostępne |
| D3DFMT_A8 | DXGI_FORMAT_A8_UNORM |
| D3DFMT_A8R3G3B2 | Niedostępne |
| D3DFMT_X4R4G4B4 | Niedostępne |
| D3DFMT_A2B10G10R10 | DXGI_FORMAT_R10G10B10A2 |
| D3DFMT_A8B8G8R8 | DXGI_FORMAT_R8G8B8A8_UNORM & DXGI_FORMAT_R8G8B8A8_UNORM_SRGB |
| D3DFMT_X8B8G8R8 | Niedostępne |
| D3DFMT_G16R16 | DXGI_FORMAT_R16G16_UNORM |
| D3DFMT_A2R10G10B10 | Niedostępne |
| D3DFMT_A16B16G16R16 | DXGI_FORMAT_R16G16B16A16_UNORM |
| D3DFMT_A8P8 | Niedostępne |
| D3DFMT_P8 | Niedostępne |
| D3DFMT_L8 | DXGI_FORMAT_R8_UNORM Uwaga: użyj narzędzia .r swizzle w cieniatorze, aby zduplikować czerwony na inne składniki, aby uzyskać zachowanie D3D9. |
| D3DFMT_A8L8 | DXGI_FORMAT_R8G8_UNORM Uwaga: użyj swizzle .rrrg w cieniatorze, aby zduplikować czerwony i przenieść zielony do składników alfa, aby uzyskać zachowanie D3D9. |
| D3DFMT_A4L4 | Niedostępne |
| D3DFMT_V8U8 | DXGI_FORMAT_R8G8_SNORM |
| D3DFMT_L6V5U5 | Niedostępne |
| D3DFMT_X8L8V8U8 | Niedostępne |
| D3DFMT_Q8W8V8U8 | DXGI_FORMAT_R8G8B8A8_SNORM |
| D3DFMT_V16U16 | DXGI_FORMAT_R16G16_SNORM |
| D3DFMT_W11V11U10 | Niedostępne |
| D3DFMT_A2W10V10U10 | Niedostępne |
| D3DFMT_UYVY | Niedostępne |
| D3DFMT_R8G8_B8G8 | DXGI_FORMAT_G8R8_G8B8_UNORM (w DX9 dane zostały przeskalowane w górę o 255.0f, ale można to obsłużyć w kodzie cieniowania). |
| D3DFMT_YUY2 | Niedostępne |
| D3DFMT_G8R8_G8B8 | DXGI_FORMAT_R8G8_B8G8_UNORM (w DX9 dane zostały przeskalowane w górę o 255.0f, ale można to obsłużyć w kodzie cieniowania). |
| D3DFMT_DXT1 | DXGI_FORMAT_BC1_UNORM & DXGI_FORMAT_BC1_UNORM_SRGB |
| D3DFMT_DXT2 | DXGI_FORMAT_BC1_UNORM & DXGI_FORMAT_BC1_UNORM_SRGB Uwaga: DXT1 i DXT2 są takie same z perspektywy interfejsu API/sprzętu... jedyną różnicą była "premultiplied alpha", która może być śledzona przez aplikację i nie wymaga oddzielnego formatu. |
| D3DFMT_DXT3 | DXGI_FORMAT_BC2_UNORM & DXGI_FORMAT_BC2_UNORM_SRGB |
| D3DFMT_DXT4 | DXGI_FORMAT_BC2_UNORM & DXGI_FORMAT_BC2_UNORM_SRGB Uwaga: DXT3 i DXT4 są takie same z perspektywy interfejsu API/sprzętu... jedyną różnicą była "premultiplied alpha", która może być śledzona przez aplikację i nie wymaga oddzielnego formatu. |
| D3DFMT_DXT5 | DXGI_FORMAT_BC3_UNORM & DXGI_FORMAT_BC3_UNORM_SRGB |
| D3DFMT_D16 & D3DFMT_D16_LOCKABLE | DXGI_FORMAT_D16_UNORM |
| D3DFMT_D32 | Niedostępne |
| D3DFMT_D15S1 | Niedostępne |
| D3DFMT_D24S8 | Niedostępne |
| D3DFMT_D24X8 | Niedostępne |
| D3DFMT_D24X4S4 | Niedostępne |
| D3DFMT_D16 | DXGI_FORMAT_D16_UNORM |
| D3DFMT_D32F_LOCKABLE | DXGI_FORMAT_D32_FLOAT |
| D3DFMT_D24FS8 | Niedostępne |
| D3DFMT_S1D15 | Niedostępne |
| D3DFMT_S8D24 | DXGI_FORMAT_D24_UNORM_S8_UINT |
| D3DFMT_X8D24 | Niedostępne |
| D3DFMT_X4S4D24 | Niedostępne |
| D3DFMT_L16 | DXGI_FORMAT_R16_UNORM Uwaga: użyj narzędzia .r swizzle w cieniatorze, aby zduplikować kolor czerwony na inne składniki, aby uzyskać zachowanie D3D9. |
| D3DFMT_INDEX16 | DXGI_FORMAT_R16_UINT |
| D3DFMT_INDEX32 | DXGI_FORMAT_R32_UINT |
| D3DFMT_Q16W16V16U16 | DXGI_FORMAT_R16G16B16A16_SNORM |
| D3DFMT_MULTI2_ARGB8 | Niedostępne |
| D3DFMT_R16F | DXGI_FORMAT_R16_FLOAT |
| D3DFMT_G16R16F | DXGI_FORMAT_R16G16_FLOAT |
| D3DFMT_A16B16G16R16F | DXGI_FORMAT_R16G16B16A16_FLOAT |
| D3DFMT_R32F | DXGI_FORMAT_R32_FLOAT |
| D3DFMT_G32R32F | DXGI_FORMAT_R32G32_FLOAT |
| D3DFMT_A32B32G32R32F | DXGI_FORMAT_R32G32B32A32_FLOAT |
| D3DFMT_CxV8U8 | Niedostępne |
| D3DDECLTYPE_FLOAT1 | DXGI_FORMAT_R32_FLOAT |
| D3DDECLTYPE_FLOAT2 | DXGI_FORMAT_R32G32_FLOAT |
| D3DDECLTYPE_FLOAT3 | DXGI_FORMAT_R32G32B32_FLOAT |
| D3DDECLTYPE_FLOAT4 | DXGI_FORMAT_R32G32B32A32_FLOAT |
| D3DDECLTYPED3DCOLOR | Niedostępne |
| D3DDECLTYPE_UBYTE4 | DXGI_FORMAT_R8G8B8A8_UINT Uwaga: Funkcja Shader pobiera wartości UINT, ale jeśli są potrzebne liczby zmiennoprzecinkowe typu Direct3D 9 (0,0f, 1,0f... 255.f), UINT można tylko przekonwertować na float32 w cieniatorze. |
| D3DDECLTYPE_SHORT2 | DXGI_FORMAT_R16G16_SINT Uwaga: Funkcja Shader pobiera wartości SINT, ale jeśli potrzebne są całkowite liczby zmiennoprzecinkowe typu Direct3D 9, SINT można po prostu przekonwertować na zmiennoprzecinkowy32 w cieniatorze. |
| D3DDECLTYPE_SHORT4 | DXGI_FORMAT_R16G16B16A16_SINT Uwaga: Funkcja Shader pobiera wartości SINT, ale jeśli potrzebne są liczby zmiennoprzecinkowe typu Direct3D 9, sINT można po prostu przekonwertować na zmiennoprzecinkowy32 w cieniatorze. |
| D3DDECLTYPE_UBYTE4N | DXGI_FORMAT_R8G8B8A8_UNORM |
| D3DDECLTYPE_SHORT2N | DXGI_FORMAT_R16G16_SNORM |
| D3DDECLTYPE_SHORT4N | DXGI_FORMAT_R16G16B16A16_SNORM |
| D3DDECLTYPE_USHORT2N | DXGI_FORMAT_R16G16_UNORM |
| D3DDECLTYPE_USHORT4N | DXGI_FORMAT_R16G16B16A16_UNORM |
| D3DDECLTYPE_UDEC3 | Niedostępne |
| D3DDECLTYPE_DEC3N | Niedostępne |
| D3DDECLTYPE_FLOAT16_2 | DXGI_FORMAT_R16G16_FLOAT |
| D3DDECLTYPE_FLOAT16_4 | DXGI_FORMAT_R16G16B16A16_FLOAT |
| FourCC "ATI1" | DXGI_FORMAT_BC4_UNORM |
| FourCC "ATI2" | DXGI_FORMAT_BC5_UNORM |
¹DXGI 1.1, który jest zawarty w środowisku uruchomieniowym Direct3D 11, obejmuje formaty BGRA. Jednak obsługa tych formatów jest opcjonalna dla urządzeń Direct3D 10 i 10.1 ze sterownikami zaimplementowanymi w modelu sterowników wyświetlania systemu Windows (WDDM) dla systemu Windows Vista (WDDM 1.0). Rozważ użycie DXGI_FORMAT_R8G8B8A8_UNORM zamiast tego. Alternatywnie możesz utworzyć urządzenie przy użyciu D3D10_CREATE_DEVICE_BGRA_SUPPORT, aby mieć pewność, że komputery obsługują tylko komputery ze środowiskiem uruchomieniowym Direct3D 11.0 i zainstalowanym sterownikiem WDDM 1.1 lub nowszym.
Formaty ²DXGI 1.0 zdefiniowane 5:6:5 i 5:5:5:1, ale nie były obsługiwane przez środowisko uruchomieniowe Direct3D 10.x lub Direct3D 11.0. Te formaty są opcjonalnie obsługiwane w środowisku uruchomieniowym DXGI 1.2 w środowisku uruchomieniowym DirectX 11.1, który jest wymagany dla kart wideo poziomu funkcji 11.1 i WDDM 1.2 (model sterowników wyświetlania począwszy od systemu Windows 8) i jest już obsługiwany na poziomach funkcji 10level9.
³DXGI 1.2 wprowadził format 4:4:4:4. Ten format jest opcjonalnie obsługiwany w środowisku uruchomieniowym DirectX 11.1, który jest wymagany dla kart wideo poziomu funkcji 11.1 i sterowników WDDM 1.2 i jest już obsługiwany na poziomach funkcji 10level9.
W przypadku formatów nieskompresowanych DXGI ogranicza obsługę dowolnych wzorców formatu pikseli; wszystkie nieskompresowane formaty muszą być typu RGBA. Może to wymagać przesyłania istniejących formatów pikseli zasobów, które zalecamy, aby w miarę możliwości obliczane jako proces wstępny w trybie offline.
Przenoszenie cieniowania
Cieniowania Direct3D 10 są tworzone w programie HLSL
Direct3D 10 ogranicza użycie języka zestawu tylko do celów debugowania, dlatego wszystkie ręcznie napisane cieniowania zestawów używane w direct3D 9 będą musiały zostać przekonwertowane na HLSL.
Podpisy cieniowania i łączenie
Omówiliśmy wymagania dotyczące łączenia zestawu wejściowego z podpisami wejściowymi cieniowania wierzchołków we wcześniejszej części tego dokumentu (zobacz powyżej). Należy pamiętać, że środowisko uruchomieniowe Direct3D 10 również zaostrzyło wymagania dotyczące łączenia etapu z cieniowaniami. Ta zmiana wpłynie na źródła cieniowania, w których powiązanie między etapami może nie zostać w pełni opisane w sekcji Direct3D 9. Na przykład:
VS_OUTPUT PS_INPUT
float4 pos : SV_POSITION; float4 pos : SV_POSITION;
float4 uv1 : TEXCOORD1; float4 uv1 : TEXCOORD1;
float4x3 tangentSp : TEXCOORD2; float4 tangent : TEXCOORD2; *
float4 Color : TEXCOORD6; float4 color : TEXCOORD6;
* Przerwana vs - PS Linkage - mimo że cieniowanie pikseli może nie być zainteresowany pełną macierzą, połączenie musi określać pełny zmiennoprzecinkowy4x3.
Należy pamiętać, że semantyka łączenia między etapami musi być dokładnie zgodna, jednak dane wejściowe etapów docelowych mogą być prefiksem wartości wyjściowych. W powyższym przykładzie cieniowanie pikseli może mieć pozycję i texcoord1 jako jedyne dane wejściowe, ale nie może mieć pozycji i texcoord2 jako jedyne dane wejściowe ze względu na ograniczenia kolejności.
Powiązania etapu cieniowania HLSL
Połączenie między cieniowaniami może wystąpić w dowolnym z następujących punktów w potoku:
- Moduł asemblera wejściowego do cieniowania wierzchołków
- Cieniowanie wierzchołków do cieniowania pikseli
- Cieniowania wierzchołków do cieniowania geometrii
- Cieniowania wierzchołków do strumienia wyjściowego
- Cieniowanie geometrii do cieniowania pikseli
- Cieniowania geometrii do strumienia
stałe
Aby ułatwić przenoszenie zawartości z direct3D 9, początkowe podejście do stałego zarządzania poza systemem Efektów może obejmować utworzenie pojedynczego buforu stałego zawierającego wszystkie wymagane stałe stałe. Ważne jest, aby wydajność porządkowała stałe w według oczekiwanej częstotliwości aktualizacji. Ta organizacja zmniejszy ilość nadmiarowych zestawów stałych do minimum.
Płaszczyzny klipów użytkownika w programie HLSL na poziomie funkcji 9 i wyższym
Począwszy od systemu Windows 8, można użyć atrybutu funkcji w deklaracji funkcji HLSL , a nie SV_ClipDistance, aby cieniowanie działało na poziomie funkcji 9_x, a także na poziomie funkcji 10 i wyższym. Aby uzyskać więcej informacji, zobacz Płaszczyzny klipów użytkownika na poziomie 9 sprzętu.
Dodatkowe różnice w trybie Direct3D 10 do obejrzenia
Liczby całkowite jako dane wejściowe
W wersji Direct3D 9 nie było rzeczywistej obsługi sprzętu dla typów danych całkowitych, jednak sprzęt Direct3D 10 obsługuje jawne typy całkowite. Jeśli masz dane zmiennoprzecinkowe w buforze wierzchołka, musisz mieć dane wejściowe zmiennoprzecinkowe. W przeciwnym razie typ liczby całkowitej będzie reprezentacją wzorca bitowego wartości zmiennoprzecinkowej. Typ liczby całkowitej nie jest dozwolony dla danych wejściowych cieniowania pikseli, chyba że wartość jest oznaczona bez interpolacji (zobacz modyfikatory interpolacji ).
Kursory myszy
W poprzednich wersjach systemu Windows standardowe procedury kursora myszy GDI nie działały poprawnie na wszystkich ekskluzywnych urządzeniach pełnoekranowych. Dodano interfejsy API SetCursorProperties, ShowCursori SetCursorPosition API. Ponieważ wersja GDI systemu Windows Vista w pełni rozumie DXGI powierzchni, nie ma potrzeby tego wyspecjalizowanego interfejsu API kursora myszy, więc nie ma odpowiednika Direct3D 10. Aplikacje Direct3D 10 powinny zamiast tego używać standardowych procedur kursora myszy GDI dla kursorów myszy.
Mapowanie texels na piksele w trybie Direct3D 10
W trybie Direct3D 9 centra texel i centra pikseli były pół jednostki (zobacz Bezpośrednie mapowanie Texels na piksele (Direct3D 9)). W trybie Direct3D 10 centra texel są już w połowie jednostek, więc w ogóle nie ma potrzeby przesuwania współrzędnych wierzchołków.
Renderowanie czworokątów pełnoekranowych jest bardziej proste dzięki funkcji Direct3D 10. Czworokąta pełnoekranowe powinny być zdefiniowane w przestrzeni clipspace (-1,1) i po prostu przekazywane przez cieniowanie wierzchołków bez zmian. W ten sposób nie ma potrzeby ponownego ładowania buforu wierzchołka za każdym razem, gdy zmienia się rozdzielczość ekranu, i nie ma dodatkowej pracy w cieniatorze pikseli, aby manipulować współrzędnymi tekstury.
Zmiany zachowania zliczania odwołań
W przeciwieństwie do poprzednich wersji Direct3D różne funkcje Zestawu nie będą zawierać odwołania do obiektów urządzeń. Oznacza to, że aplikacja musi upewnić się, że przechowuje odwołanie do obiektu tak długo, jak ten obiekt ma być powiązany z potokiem. Gdy liczba ref obiektu spadnie do zera, obiekt będzie niezwiązany z potoku, ponieważ zostanie zniszczony. Ten styl przechowywania odwołań jest również znany jako przytrzymywanie słabych odwołań, dlatego każda lokalizacja powiązania w obiekcie Device zawiera słabe odwołanie do interfejsu/obiektu. O ile nie określono inaczej, to zachowanie powinno być zakładane dla wszystkich metod Set. Za każdym razem, gdy zniszczenie obiektu powoduje ustawienie punktu powiązania na wartości NULL, warstwa debugowania wyświetli ostrzeżenie. Należy pamiętać, że wywołania metody Get urządzenia, takie jak OMGetRenderTargets, zwiększą liczbę zwracanych obiektów.
Poziom współpracy testowej
Funkcjonalność interfejsu API Direct3D 9 TestCooperativeLevel jest analogiczna do ustawiania DXGI_PRESENT_TEST podczas wywoływania Present.
StretchRect
Funkcja podobna do metody Direct3D 9 IDirect3DDevice9::StretchRect nie jest dostępna w 10 i 10.1 direct3D. Aby skopiować powierzchnie zasobów, użyj ID3D10Device::CopySubresourceRegion. W przypadku operacji zmiany rozmiaru renderowanie na teksturę przy użyciu filtrowania tekstur. Do konwertowania powierzchni MSAA na powierzchnie inne niż MSAA użyj ID3D10Device::ResolveSubresource.
Dodatkowe różnice w wersji Direct3D 10.1
System Windows Vista z dodatkiem Service Pack 1 (SP1) zawierał pomocniczą aktualizację direct3D 10 i Direct3D 10.1, która uwidoczniła następujące dodatkowe funkcje sprzętowe:
- Cieniowania msAA na próbkę
- Odczyt do odczytu szczegółowego msAA
- Niezależne tryby mieszania na element docelowy renderowania
- Tablice mapy modułu
- Renderowanie w formatach skompresowanych blokowo (BC)
Aktualizacja Direct3D 10.1 dodała obsługę następujących nowych interfejsów, które pochodzą z istniejących interfejsów:
Aktualizacja Direct3D 10.1 zawiera również następujące dodatkowe struktury:
Interfejs API Direct3D 10.1 zawiera nową koncepcję o nazwie poziom funkcji. Ta koncepcja oznacza, że można użyć interfejsu API Direct3D 10.1 do obsługi sprzętu Direct3D 10.0 (D3D10_FEATURE_LEVEL_10_0) lub Direct3D 10.1 (D3D10_FEATURE_LEVEL_10_1). Ponieważ interfejs API Direct3D 10.1 pochodzi z interfejsów Direct3D 10, aplikacje mogą tworzyć urządzenie Direct3D 10.1, a następnie używać go jako urządzenia Direct3D 10.0, z wyjątkiem sytuacji, w których potrzebne są nowe funkcje specyficzne dla wersji 10.1 (pod warunkiem, że D3D10_FEATURE_LEVEL_10_1 poziom funkcji jest obecny i obsługuje te funkcje).
Nuta
Urządzenia Direct3D 10.1 mogą używać istniejących profilów cieniowania HLSL 10.0 (vs_4_0, ps_4_0, gs_4_0) i nowych profilów 10.1 (vs_4_1, ps_4_1, gs_4_1) z dodatkowymi instrukcjami i możliwościami HLSL.
System Windows 7 zawierał pomocniczą aktualizację interfejsu API Direct3D 10.1, który jest zawarty w środowisku uruchomieniowym Direct3D 11. Ta aktualizacja dodaje obsługę następujących poziomów funkcji:
System Windows 7 dodał również obsługę funkcji Direct3D 10.1 dla systemu Windows Advanced Rasterization Platform (WARP). Sterownik WARP można określić przy użyciu D3D10_DRIVER_TYPE_WARP.
Aby uzyskać więcej informacji na temat funkcji Direct3D 10.1, zobacz Funkcji Direct3D 10.1 i wyliczenie D3D10_FEATURE_LEVEL1.
Tematy pokrewne
-
Przewodnik programowania dla Direct3D 10