Udostępnij przez


Zagadnienia dotyczące direct3D 9 do Direct3D 10 (Direct3D 10)

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 trybie Direct3D 10

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

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;

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

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, &paramDesc);
        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.

Przewodnik programowania dla Direct3D 10