Dawno, dawno temu – co w dziedzinie programowania grafiki oznacza perspektywę kilkuletnią – większość przetwarzania odbywała się we wbudowanym, stałym potoku graficznym. Shadery wprawdzie były, ale oferowane przez nie możliwości były dosyć ubogie (zwłaszcza jeśli chodzi o te do pikseli), a poza tym należało kodować je w niezbyt przyjaznym języku podobnym do asemblera. Pewnie dlatego, a dodatkowo także z powodu małego wsparcia kart graficznych, większość efektów realizowano przy pomocy odpowiednich tekstur, stanów ich faz i tym podobnych wynalazków. Bardzo często tak było po prostu łatwiej.
Zadziwiające jest to, że teraz nierzadko bywa dokładnie odwrotnie :) Chociaż na początku można jeszcze uważać, że ustawianie przeróżnych stanów stałego potoku i poleganie wbudowanie jest łatwiejsze, a shadery dają “tylko” większe możliwości, to jednak z czasem to myślenie zawsze powinno się zmienić. W końcu przecież napisanie algorytmu określającego dokładnie krok po kroku, co się dzieje z wierzchołkiem lub pikselem, dla programisty z założenia musi być łatwiejsze niż ustawianie jakichś dziwnych flag, będącymi swoistymi wytrychami do standardowego sposobu przetwarzania.
Zresztą nie wszystko można tymi wytrychami łatwo osiągnąć. Weźmy niezwykle prosty efekt wyświetlania w skali szarości, jak na czarno-białym zdjęciu. Jeżeli chodzi o realizację tego efektu na fixed pipeline, to chwilowo nie mam na to żadnego sensownego pomysłu – oczywiście poza podmianą wszystkich tekstur na ich ‘szare’ wersje.
A wystarczyłoby tylko użyć prostego pixel shadera, który jawnie implementuje wzór na obliczenie natężenia koloru:
I już, efekt gotowy. Nietrudno byłoby też połączyć go z jakimkolwiek innym. W ogólności jest jednak ‘trochę’ trudniej – ale to już temat na inną okazję ;P
I zaraz odezwa sie fanatycy “starych kart” i powiedza, ze do dupy bo nie zadziala na GF4MX :P
To byl moj pierwszy shader jaki napisalem :)
I, dzialał on na GF4MX :P :P :P
Jak Pixel Shader mógł działać na GF4MX?
Co do odcieni szarości, nie chciałbym nikogo zasmucać, ale przepisanie obrazu z tekstury render target na ekran z odpowiednim ustawieniem SetTextureStageState(…, D3DTOP_DOTPRODUCT3, …); powinno załatwić sprawę na Fixed Pipeline :)
GF4MX ma SM 1.1.
A co do rozwiązania na fixed… Konieczność tworzenia dodatkowego render targeta i jeszcze odpowiedniej dodatkowej tekstury dla tego Dot Producta (z RGB = (0.3, 0.59, 0.11) w każdym pikselu) to chyba jednak ZBYT dużo roboty :)
Rany, co za herezje… GF4MX nie ma ŻADNEJ jednostki pixel ani vertex shader. To jest praktycznie ten sam procesor co w GF2 z tym, że zawiera jeszcze jakieś gówno do sprzętowego dekodowania MPEG2.
True. Prawdopodobnie pomyliło mi się z GF4Ti :) MX to szajs porównywalny z GF2.