Tag: directx

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

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 ... 5 6 7 8 >

# Koszmar DrawIndexedPrimitive

11:06
Sat
02
Feb 2008

Dzisiaj postanowiłem zwrócić waszą uwagę na pewną sprawę w interfejsie DirectX, która dla zaawansowanych jest oczywista, a początkującym może sprawić nie lada problem. Mnie długo zajęło zrozumienie, co dokładnie oznaczają parametry liczbowe funkcji:

HRESULT SetStreamSource(
  UINT StreamNumber,
  IDirect3DVertexBuffer9 * pStreamData,
  UINT OffsetInBytes,
  UINT Stride
);
HRESULT DrawIndexedPrimitive(
  D3DPRIMITIVETYPE Type,
  INT BaseVertexIndex,
  UINT MinIndex,
  UINT NumVertices,
  UINT StartIndex,
  UINT PrimitiveCount
);

Warto zgłębić ten temat, by uniknąć potem wrednych błędów (na czele z klasycznym "Nic nie widać" :) Pisząc w największym skrócie:

Comments | #directx #rendering Share

# DirectX 10 jest fajny

15:19
Wed
09
Jan 2008

Zająłem się ostatnio Direct3D 10 i bardzo mi się podoba. API jest piękne, a karta GeForce 8800 GT ma ogromną moc obliczeniową. Zrzucenie balastu wstecznej kompatybilności zawsze wychodzi na dobre. Szkoda tylko, że wymaga tak nowoczesnego sprzętu i co gorsza, Windowsa Vista. Moje pierwsze eksperymenty:

A to jest 750000 wierzchołków na klatkę generowane w pełni na GPU (bez żadnego bufora, tekstury czy innych danych podawanych do shadera), z użyciem instancingu i obliczeń na liczbach całkowitych:

Comments | #rendering #directx Share

# Szarpanie gry

23:27
Fri
07
Dec 2007

Szarpanie gry to wredny błąd. Długo nie wierzyłem w ogóle w jego istnienie - dopóki sam go nie doświadczyłem w swoim kodzie, najpierw na laptopie, a potem również na blaszaku. Chodzi o sytuację, kiedy FPS-ów jest dużo, ale mimo tego animacja "szarpie". Powiązany z tym może być jest błąd opóźniania się obrazu za wejściem z myszki, doświadczany przy pisaniu GUI. Rozwiązania są różnorodne:

Comments | #directx #rendering #algorithms Share

# Alpha Testing kontra Shadow Mapping

12:01
Sun
18
Nov 2007

Alpha Testing to funkcja przydatna tam, gdzie skomplikowany kształt obiektu określają przezroczyste miejsca na teksturze zamiast układu geometrii - np. do rysowania drzew, trawy itp. Problem w tym, że taki alfa-test trzeba też wykonać przy rysowaniu obiektu do Shadow Mapy, Shadow Mapa jest często w formacie zmiennoprzecinkowym (np. R32F), a przy renderowaniu do tekstur w formatach zmiennoprzecinkowych ustawienia takie jak alfa-blending i alfa-testing często nie działają.

Rozwiązaniem jest napisanie sobie alfa-testu samemu w Pixel Shaderze za pomocą instrukcji anulującej rysowanie piksela - texkill. W języku HLSL odpowiada jej funkcja clip. Przykładowy kod wygląda tak:

// Zadeklarowane jest: out float4 Out : COLOR0
// Wypełniam Out, łącznie z kanałem alfa
// Zakładam granicę alfa = 128, czyli 0.5
// Na końcu Pixel Shadera dodaję:
clip(Out.a - 0.5);

Jeszcze większy problem z obiektami używającymi alfa-testu mają ci, którzy realizują cienie za pomocą drugiej techniki - Shadow Volume. Z inicjatywy Skalniaka próbowaliśmy niedawno przedyskutować tą sprawę w tym wątku forum.

Comments | #rendering #directx Share

# Shadery a sprawa preprocesora

15:53
Sun
19
Aug 2007

Fakt nr 1 - shadery warto pisać w HLSL albo innym tego typu języku. Kompilatory generują dobry kod, więc nie ma sensu babrać się w czystym asemblerze. Fakt nr 2 - shaderów potrzeba wiele. Najlepiej, żeby można było generować nowe shadery z różnych kombinacji jakiś swoich ustawień. Niektórzy radzą sobie bez tego, ale ja nie wyobrażam sobie jak. Shadery zastępują przecież niektóre ustawienia renderowania z dawnego nieprogramowalnego potoku i tak też na nie patrzę - jak na własny potok sterowany ustawieniami. Mają przy tym tą zaskakującą na początku nauki cechę, że nie można ich łączyć - na raz może być ustawiony jeden shader, który musi zawierać wszystko, co jest do zrobienia na wierzchołku albo pikselu.

Rozwiązaniem jest dołączenie do gry źródła shadera (np. pliku FX) i jego kompilacja w czasie ładowania albo w czasie samej gry, w razie potrzeby, z odpowiednimi ustawieniami. Jak odwzorować to w kodzie shadera? Opcje są dwie, a nawet trzy.

Ta, która dla mnie odpada natychmiast to skorzystanie z instrukcji warunkowych Static Branching. Po co marnować cenny czas na instrukcje sprawdzania warunku, który zawsze będzie niespełniony, jeśli można wygenerować osobny shader, który danego kodu po prostu nie zawiera?

Opcja pierwsza to wstawienie do kodu dyrektyw warunkowych preprocesora typu #ifdef (OPCJA == 1), gdzie OPCJA będzie makrem przekazywanym jako parametr podczas kompilacji shadera. Opcja druga to wstawienie do kodu warunków typu if (OPCJA == 1), gdzie OPCJA również będzie makrem. Obydwa rozwiązania wygenerują równie dobry kod. To drugie wydaje się przy tym bardzie eleganckie.

Niestety ma jedną wadę. O ile fragmenty kodu można objąć w if (OPCJA == 1), o tyle czegoś takiego nie można napisać dla pól struktury definiującej dane przekazywane z VS do PS. Tam natomiast muszą występować różne pola, niektóre nieużywane, zależnie od parametrów kompilacji danego shadera. Każde takie pole natomiast, nawet jeśli nieużywane, musi być wypełniane przez VS, choćby samymi zerami (swoją drogą - cóż za bzdura! - to powinno generować ostrzeżenie a nie błąd kompilacji), a to kosztuje dodatkową, niepotrzebną instrukcję w VS.

Toteż pozostaje objąć te nie zawsze wykorzystywane pola struktury w dyrektywy #ifdef. Skoro przy niektórych wartościach makr w ogóle ich nie będzie, to nie można też ich wtedy używać w kodzie. Tak więc warunki w kodzie też trzeba wtedy objąć w #ifdef zamiast w if. Co Należało Dowieść :) Tak też mam zrobione u siebie.

Comments | #rendering #directx Share

# Wchodząc w szczegóły

11:35
Thu
03
May 2007

Kot zadał na forum - w temacie Narzut BeginPass / EndPass - ciekawe pytanie dotyczące jak najlepszej (oczywiście z punktu widzenia wydajności) organizacji procesu renderowania obiektów w silniku, w którym wykorzystujemy mechanizm efektów FX. Temat jest o tyle ciekawy, że mnie również dotyczy :) Dlatego wszelkie odpowiedzi mile widziane.

Przy okazji padł link do ciekawego znaleziska - ktoś napisał sobie swoje My own little DirectX FAQ z kilkoma ciekawymi informacjami.

Jeszcze mały off-topic: Wszystkim kolegom piszącym w tym roku maturę życzę powodzenia i ocen dostatecznie wysokich, żeby dostali się na swoje wymarzone studia - bo w takim momencie chyba to jest dla młodego kodera najważniejsze. GL & HF :)

Comments | #rendering #directx Share

# Dobra dokumentacja na wagę złota

14:12
Fri
13
Apr 2007

Dokumentacja... Najbardziej znienawidzona część każdego programu. Prawie nikt nie lubi jej pisać, ale wszyscy wiedzą, że jest niezbędna. Dokumentacja jest tym, co najlepiej odróżnia prawdziwy, dopracowany program od eksperymentu/prototypu.

Dla odbiorcy danego programu (czy - przede wszystkim - biblioteki) dobra dokumentacja to nieoceniona pomoc. Zaawansowani tym się właśnie różnią od początkujących, że nie boją się do niej zaglądać, bo wiedzą, że znajdą tam systematyczny i szczegółowy opis każdej funkcji, jej działania i parametrów. Tylko czy na pewno kompletny?

MSDN zawsze pozostaje dla mnie pod tym względem wzorem. Ale już dokumentacji w DirectX SDK można co nieco zarzucić, szczególnie jej części poświęconej D3DX. Oprócz braku rozdziałów opisujących ogólnie sposób używania poszczególnych interfejsów doskwierają liczne drobiazgi. Na przykład:

D3DXMACRO Macros[MACRO_COUNT+1];
for (int i = 0; i < MACRO_COUNT; i++) {
  Macros[i].Name = // ...
  Macros[i].Definition = // ...
}
Macros[MACRO_COUNT].Name = NULL;
Macros[MACRO_COUNT].Definition = NULL;

Comments | #directx #philosophy #software engineering Share

# DirectX Ops

20:31
Fri
16
Mar 2007

Błędne działanie NVMeshMender

W skład pakietu DirectX SDK wchodzi m.in. ciekawe narzędzie, któremu dziś przyjrzałem się bliżej, a z którego chyba niewiele osób korzysta. Chodzi o dxops.exe. Ten napisany w C#, konsolowy programik "karmi się" skryptami zapisanymi w plikach tekstowych w prostym języku, w którym kolejne instrukcje mogę wczytywać, zapisywać oraz przetwarzać tekstury (we wszelkich obsługiwanych przez D3DX formatach) oraz siatki (w formacie X). Pośród możliwości programu warto wymienić:

Nie jest to w sumie nic ponad możliwości dostępne z poziomu funkcji D3DX, ale ich udostępnienie jako narzędzia nie wymagającego pisania kodu czyni ten program godnym uwagi.

Niestety z nieznanych mi przyczyn dxops źle generuje normalne dla moich siatek eksportowanych do formatu X z Blendera. Pozostaje więc NVMeshMender, który niestety też nie jest idealny (co pokazałem na załączonym zrzucie ekranu).

Comments | #rendering #directx #tools Share

Pages: > 1 ... 5 6 7 8 >

STAT NO AD
[Stat] [STAT NO AD] [Download] [Dropbox] [pub] [Mirror] [Privacy policy]
Copyright © 2004-2018