Tag: directx

Entries for tag "directx", ordered from most recent. Entry count: 78.

Uwaga! Informacje na tej stronie mają ponad 5 lat. Nadal je udostępniam, ale prawdopodobnie nie odzwierciedlają one mojej aktualnej wiedzy ani przekonań.

Pages: > 1 ... 6 7 8 9 10 >

# Wycinanie komentarzy ze skompilowanego shadera

Thu
19
Feb 2009

Shader Direct3D skompilowany do kodu binarnego (np. funkcją D3DXCompileShaderFromFile) zawiera w sobie nie tylko instrukcje asemblerowe, ale i dodatkowe informacje - komentarze. Te komentarze nie są bezużyteczne. Tam zapisana jest np. tablica stałych, którą można odczytać funkcją D3DXGetShaderConstantTable. Jednak jeśli ona nie jest potrzebna, te komentarze można z kodu wyciąć i wtedy shader staje się dużo mniejszy.

Jak to zrobić? Choć trzeba grzebać wprost w pamięci, to nie jest trudne. Konkretny algorytm opisuje na swoim blogu Jesus de Santos Garcia we wpisie Stripping comments from Shader bytecodes. Ja tutaj streszczę go krótko swoimi słowami.

Format binarny skompilowanych shaderów D3D jest udokumentowany w MSDN, na stronie Direct3D Shader Codes. Składa się z sekwencji 32-bitowych tokenów. Ostatni z nich ma wartość 0x0000FFFF i oznacza koniec kodu. Komentarz natomiast rozpoczyna się tokenem 0x####FFFE, gdzie "####" (starsze dwa bajty) to liczba następujących dalej 32-bitowych wartości stanowiących treść komentarza. Takie komentarze można po prostu wyciąć z kodu shadera i gotowe :)

Comments | #directx #rendering Share

# Nowy artykuł - Preprocesor w shaderach HLSL

Thu
22
May 2008

W następnym artykule opisałem, jak używa się preprocesora w języku shaderów HLSL. Pisząc coś bardziej skomplikowanego niż pojedyncze efekty graficzne - np. silnik - na vertex shader i pixel shader trzeba czasem spojrzeć jak na zestaw ustawień, tak jak w starym dobrym Fixed Function Pipeline. Pojawia się taki problem, że każda kombinacja ustawień to powinien być osobny shader. W artykule przedstawiłem jedno z rozwiązań - kompilowanie kodu HLSL z użyciem proprocesora (#if itp.), z ustawieniami wpisanymi jako wartości makr. Zapraszam do lektury: Preprocesor w shaderach HLSL.

Comments | #rendering #productions #directx Share

# D3DPTEXTURECAPS_NONPOW2CONDITIONAL

Tue
13
May 2008

Jak wiadomo, tekstury nie muszą być kwadratowe, ale generalnie powinny mieć boki będące potęgami dwójki - tj. 1, 2, 4, 8, 16, 32, 64, 128, 256, 512 itd. Ograniczenie to znoszą jedynie układy firmy nVidia z SM3 (od GF6), ale karty ATI z SM3 nadal je mają. Odpowiada za to flaga D3DPTEXTURECAPS_POW2 pola TextureCaps struktury D3DCAPS9.

Jest jednak taka sytuacja, kiedy to ograniczenie jest bardzo uciążliwe. Chodzi o użycie tekstury jako Render Target. Wówczas, jeśli powinna mieć co najmniej rozmiar ekranu, przykładowo dla rozdzielczości 1280 x 1024 musiałaby mieć rozmiar 2048 x 1024 i dużo miejsca by się marnowało.

Dlatego jakby specjalnie w tym celu, praktycznie wszystkie układy graficzne posiadają flagę D3DPTEXTURECAPS_NONPOW2CONDITIONAL, która pozwala na używanie tekstur o dowolnych rozmiarach pod pewnymi warunkami (opisanymi w DX SDK pod hasłem "D3DCAPS9"):

Comments | #directx #rendering Share

# DirectX Debug i dxcpl

Mon
05
May 2008

Jeśli masz zainstalowany DirectX SDK, możesz przestawić swojego DirectX w wersję Debug. W tym celu wybierz Start > Uruchom > "dxcpl" i w oknie 1. przesuń suwak "Debug Output Level" na przedostatni ząbek 2. przełącz na "Use Debug Version of Direct3D 9" 3. wciśnij "Apply".

dxcpl

DirectX w wersji Debug prawdopodobnie działa wolniej, dlatego nie zostawiałbym go tak na stałe, ale chwilowe przełączenie w ten tryb może się bardzo przydać. Po zrobieniu tego trzeba uruchomić swój program w trybie debugowania (w Visual C++ to będzie F5) i w czasie pracy programu albo po jego zakończeniu obserwować panel Output. Będą tam wypisywane różne ostrzeżenia i błędy, a wiele wywołań funkcji D3D może się wręcz nie udać, bo DirectX dużo lepiej sprawdza wszystkie dane i zależności.

Mnie w ten sposób udało się znaleźć nie tylko wiele błędów które powodowały niedziałanie programu, ale i takich rzeczy, które na mojej karcie graficznej działały mimo, że nie musiały. Na przykład blokowanie z flagą D3DLOCK_DISCARD zamiast 0 bufora, który nie miał D3DUSAGE_DYNAMIC, albo nawet używanie wypełnionego bufora dynamicznego do renderowania zanim go odblokowałem :)

Comments | #directx #tools Share

# Kolejność pól FVF

Tue
22
Apr 2008

O tym jeszcze chyba nie pisałem, a sprawa jest ciężka, bo DirectX SDK, o ile wiem, jasno tego nie precyzuje. Chodzi o kolejność, w jakiej powinny pojawiać się pola w strukturze wierzchołka opisywanej przez FVF. Dlatego postanowiłem sobie to raz a porządnie spisać:

Comments | #directx Share

# Przekształcenie wektora przez macierz

Thu
20
Mar 2008

Transformację w 3D opisuje macierz 4x4. Pełne przekształcenie punktu (x,y,z) przez taką macierz polega na pomnożeniu (x,y,z,1) przez tą macierz, a potem podzieleniu trzech pierwszych składowych przez składową czwartą w. Używamy tu tzw. współrzędnych jednorodnych (ang. Homogeneous Coordinates). W D3DX dokonuje tego funkcja D3DXVec3TransformCoord.

Przekształcenie wektora wskazującego kierunek (w przeciwieństwie do punktu opisującego położenie) musi nie brać pod uwagę translacji, czyli czwartego wiersza macierzy. Dlatego przekształcenie wektora polega zwykle na pomnożeniu (x,y,z) przez podmacierz 3x3 tej macierzy. W D3DX dokonuje tego funkcja D3DXVec3TransformNormal.

Jeśli ten wektor jest wektorem normalnym wierzchołka siatki, teoretycznie należy go przekształcić przez odwrotność transpozycji (lub transpozycję odwrotności - to bez różnicy) tej macierzy, której używamy do przekształcania pozycji wierzchołków. W praktyce jednak, jeśli podmacierz 3x3 tej macierzy zawiera tylko rotację (i ewentualnie skalowanie proporcjonalne), a nie zawiera skalowania nieproporcjonalnego ani ścinania, wektory bazowe w tej macierzy są ortogonalne, więc jej odwrotność jest równa jej transpozycji i te przekształcenia się znoszą. Dlatego wystarczy przekształcić wektor wprost przez daną macierz, bez odwracania i transponowania (a wynik ewentualnie znormalizować, jeśli było skalowanie).

W swojej bibliotece matematycznej mam jeszcze jedną funkcję, nazwaną po prostu Transform. Przekształca ona punkt (x,y,z,1) przez podmacierz 4x3 podanej macierzy, nie wyliczając współczynnika w i nie dzieląc przez niego. To znacznie przyspiesza obliczenia względem funkcji TransformCoord i wystarcza wszędzie tam, gdzie macierz nie zawiera przekształcenia perspektywicznego, bo jej czwarta kolumna jest wtedy zawsze równa (0,0,0,1).

Za wszelkie uproszczenia przepraszam. Możnaby o tym dużo pisać. Chciałem tu tylko pokazać, że teoretyczne "pomnożyć wektor przez macierz" przybiera w praktyce różne formy i trzeba umieć prawidłowo je stosować.

Comments | #math #directx Share

# D3DFVFCAPS_PSIZE

Wed
12
Mar 2008

Wiem, że mechanizm Point Sprites jest przestarzały i ma wielu przeciwników, ale czasem jest dobrym rozwiązaniem. Ta notka będzie dla tych, którzy go stosują. Mogą się oni nieprzyjemnie zdziwić (tak jak ja ostatnio), że na niektórych kartach graficznych cząsteczki mają złą wielkość (np. są ogromne zamiast takich jakie mają być albo nie widać ich w ogóle).

Winny jest D3DFVFCAPS_PSIZE. Ten Caps mówi, czy rozmiar cząsteczki może być brany ze struktury wierzchołka o semantyce D3DFVF_PSIZE. Co ciekawe, legitymują się nim wszystkie, nawet stare karty firmy ATI, ale z kart firmy NVIDIA tylko te należące do generacji GeForce 6 i nowszych.

Co wobec tego zrobić? Kiedy rozmiar punktu nie może być brany z wierzchołka, jest odczytywany z ustawienia D3DRS_POINTSIZE. Na szczęście nawet wtedy wierzchołek może zawierać element D3DFVF_PSIZE, tylko on po prostu nie działa. Tak więc prawidłowym rozwiązaniem jest używać D3DFVF_PSIZE jeśli jest taka potrzeba, ale na wszelki wypadek wyliczyć też jakiś średni rozmiar cząsteczki i wpisać go do D3DRS_POINTSIZE.

Comments | #rendering #directx Share

# Prezentacja do wykładu o Direct3D

Thu
28
Feb 2008

Zrobiłem w ramach pewnych zajęć na studiach prezentację do wykładu na temat Direct3D 9. Obejmuje przegląd biblioteki od inicjalizacji poprzez renderowanie trójkątów, bufory wierzchołków i indeksów, teksturowanie, oświetlenie aż do shaderów. Ma 96 slajdów. Nie wiem, czy z samej prezentacji - nie słysząc wykładu - można się dużo nauczyć, ale zapraszam do przeglądania:

Comments | #productions #directx Share

Pages: > 1 ... 6 7 8 9 10 >

[Download] [Dropbox] [pub] [Mirror] [Privacy policy]
Copyright © 2004-2020