[PL] XNA 3.0 – musisz być ekspertem w HLSL


Zacząłem się bawić Xna 3.0. Całkiem fajna zabawka, natomiast im dłużej się bawię tym bardziej dochodzę do wniosku, iż aby cokolwiek na tej platformie zrobić to trzeba niestety lub stety bardzo dobrze opanować język shaderów czyli HLSL.

Mnie to osobiście nie martwi, natomiast trochę dziwnie na początku mi się programowało kiedy naprawde najprostsze rzeczy musiałem wrzucać w *.fx.

Oczywiście jak weźmiemy pod uwagę, np. model to można go sobie świetnie opatrzyć oteksturować i wprowadzić podstawowe efekty w aplikacji do animacji 3D. Później taki model wyeksportować do FBX i voila! Takie narzędzie jak Softimage XSI (korzystam z darmowego Mod Toola aby zrobić sobie testowe modele) nawet pozwala przy teksturowaniu dodawać efekty zgodne z językiem shaderów wspieranym przez DirectX (czyli także przez Xna).

Wszystko fajnie, tylko jakbym chciał sprawnie animować proceduralne tekstury i przekazywać parametr do shaderów, koniec końców, gdzieś w końcu trzeba zajrzeć do kodu.. i tu.. jak się do tej pory bałeś shaderów to niestety.. trzeba się nauczyć. Klasa BasicEffect ma bardzo krótkie możliwości.

Parę przykładów, jakbym chciał w kodzie podmienić teksturę dla swojego obiektu, lub oteksturować obiekt stworzony nie z wgranego modelu tylko z w biegu stworzonych vertexów?
Jak to zrobić?

1) Załadować teksturę przez ContentManagera: Content.Load<Texture2d>(“mojaTekstura”);
2) Stworzyć efekt (.fx) w HLSL, w którym praktycznie nic nie robimy w vertexshader (no może poza podstawową projekcją), przekazujemy teksturę jako parametr i tworzymy odpowiedni sampler. Na koniec w pixelshader proste tex2D(sampler,uv);

Oczywiście zapomniałem o koordynatach UV dla tekstury. Jak tworzymy geometrię w sposób programowalny to oczywiście i o tym trzeba pamiętać. Przy prostych bryłach jeśli mapowanie planarne się sprawdza (po którejś z osiek) to zupełnie banał, przy innych trzeba było by sobie pewnie przypomnieć algorytmy na mapowanie cylindryczne i sferyczne. To się by jednak i tak sprawdziło przy różnych zwariowanych obiektach rodem z demek scenowych. Przy czymś bardziej skomplikowanym i tak polecam żeby te UV jednak pomapował nam jakiś grafik w aplikacji do tego dedykowanej a my w shaderze już tylko robimy z teksturą co nam się żywnie podoba.

Do samo z mgłą, kiedyś byłem przyzwyczajony, że mogę najprostszy przykład zrealizować za pomocą RenderState’ów. Teraz niestety muszę w VertexShader uwzględnić parametr przypisany do :FOG i sobie te mgłę zgodnie z własnym widzi mi się policzyć.

Mnie się ta zabawa podoba, chodzę jak po mgle bo zauważyłem, że prawie na śmierć podstawową matematykę przy grafice 3D zapomniałem, natomiast jeśli się gubicie to jedyne co mogę polecić to albo dobrą książkę na temat Shaderów albo ostrą lekturę online zanim coś naprawdę jazzy wam wyjdzie w Xna (jeśli mowa o grafice 3D).

Swoją drogą wiedza na temat shaderów może się przydać. Do WPF powstał toolkit, gdzie shadery można podpinać pod kontrolki WPF. Nowy WPF (4.0) będzie umożliwiał mieszanie XNA/DirectX i WPF. Coraz bardziej rozmyty jest ten świat 🙂

Poniżej parę screenów z moich pierwszych godzin zabaw z Xna 3.0.
Będzie więcej i jak w końcu uznam, że więcej rozumiem niż zgaduje to postaram się napisać jakiś tutorial jak najsprawniej z tym cudem zacząć 🙂

image image

PS do Bitera: tak.. wiem co napiszesz (jeśli to czytasz) 🙂


Technorati Tags: ,,,

Comments (2)

  1. Biter says:

    hehe, to już nie wiem czy to pisać 😉

    Napisze tylko że jak znajdziesz nieco więcej czasu i sił to zapraszam w każdej chwili, możemy coś fajnego skombinować, ten retro-pomysł też fajnie by było kiedyś tam zrealizować 😉

    p.s. Jestem całkowicie zielony w tym temacie więc wybacz elementarne pytanie – czy aplikacje stworzone w Xna wymagają od strony usera zainstalowania bibliotek frameworka?

  2. Aby uruchomić aplikację napisaną w XNA wymagany jest:

    .NET Framework

    DirectX Runtime

    XNA Runtime

    Co do retro to jak widać powyżej idzie w strone retro 😉 A do testów synchro i tak muzyki Traymussa używam so.. will see.

Skip to main content