Szare shadery

2007-11-19 19:58

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:

  1. float3 PS(float4 cl : COLOR0, /* itd */)
  2. {
  3.    float gray = 0.3f * cl.r + 0.59f * cl.g + 0.11f * cl.b;
  4.    return float3(gray, gray, gray);
  5. }

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

Tags: , ,
Author: Xion, posted under Programming »


6 comments for post “Szare shadery”.
  1. SirMike:
    November 20th, 2007 o 23:04

    I zaraz odezwa sie fanatycy “starych kart” i powiedza, ze do dupy bo nie zadziala na GF4MX :P

  2. spaxio:
    November 21st, 2007 o 0:10

    To byl moj pierwszy shader jaki napisalem :)
    I, dzialał on na GF4MX :P :P :P

  3. Reg:
    November 25th, 2007 o 10:26

    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 :)

  4. Xion:
    November 25th, 2007 o 11:40

    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 :)

  5. Zombiak:
    December 15th, 2007 o 13:39

    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.

  6. Xion:
    December 15th, 2007 o 17:48

    True. Prawdopodobnie pomyliło mi się z GF4Ti :) MX to szajs porównywalny z GF2.

Comments are disabled.
 


© 2017 Karol Kuczmarski "Xion". Layout by Urszulka. Powered by WordPress with QuickLaTeX.com.