Sam zrobiłem ten trójkąt!

2008-01-17 20:53

Software’owo rasteryzowany trójkątGdyby zorganizować konkurs na jak największą ilość kodu napisaną celem osiągnięcia jak najprostszego efektu, to pewnie obrazek po lewej (i kod, który za nim stoi) mógłby zająć w nim całkiem dobrą lokatę. Na pierwszy rzut oka to tylko niebieski trójkąt na żółtym tle; na drugi, trzeci i każdy następny zresztą też :) Na tym arcyprostym obrazku nie widać całego, dość skomplikowanego mechanizmu, dzięki któremu możemy go oglądać.

Rzeczony trójkąt jest bowiem efektem pracy programowego renderera, którego to od jakiegoś czasu – z konieczności, acz nie bez pewnej przyjemności – staram się popełnić. Taki kawałek oprogramowania ma za zadanie robić mniej więcej to, co potrafią zaawansowane biblioteki graficzne w rodzaju DirectX i OpenGL. Są oczywiście istotne różnice, wśród których największą jest brak wykorzystania typowych możliwości współczesnych kart graficznych – czyli właśnie przetwarzania trójkątów. Wręcz przeciwnie: wszystkie obliczenia pracowicie wykonuje główny procesor, zajmując się po kolei nie tylko każdym wielokątem, ale także każdym pikselem. Ma więc wyjątkowo dużo roboty, z którą jednak potrafi sobie poradzić.
O czym świadczy więc pokazany tutaj trójkąt? Ano o tym, że podstawowy potok renderowana ma się całkiem dobrze. W jego skład wchodzi transformowanie trójkątów przekształceniami macierzowymi, oświetlenie per-vertex, sprawdzanie widoczności pikseli przy pomocy bufora Z oraz rzutowanie perspektywiczne i rasteryzacja wynikowej płaskiej geometrii. Zgadza się, to zupełne podstawy podstaw, nieobejmujące chociażby teksturowania, lecz i tak realizujący je kod nie wiadomo kiedy rozrósł się do ponad dwóch tysięcy linijek. Faktycznie więc to był dosyć pracochłonny trójkąt :)

Zabłysnę jeszcze przykładowym kodem wykorzystującym renderer, który to wyglądać może mniej więcej tak:

  1. Device dev = new Device(/* ... */);
  2. // ...
  3. dev.clear (new Color(1.0f, 1.0f, 0.0f));
  4. dev.begin();
  5.    dev.setRenderState (RenderStates.FillMode, FillModes.Solid);
  6.    dev.setRenderState (RenderStates.ShadeModes, ShadeModes.Flat);
  7.  
  8.    // światło punktowe z pozycją i kolorem
  9.    dev.addLight (new PointLight(new Vector3(0f, 0f, -10f), new Color(1f, 1f, 1f)));
  10.  
  11.    // wierzchołek zawiera pozycję, normalną i kolor rozproszenia
  12.    Vertex[] vertices = new Vertex[]
  13.    {
  14.       new Vertex(new Vector3(-10f, 0f, -1f),
  15.          new Vector3(0f, 0f, -1f),
  16.          new Color(0f, 0f, 1f)),
  17.       new Vertex(new Vector3(0f, 2f, -1f),
  18.          new Vector3(0f, 0f, -1f),
  19.          new Color(0f, 0f, 1f)),
  20.       new Vertex(new Vector3(10f, -3f, -1f),
  21.          new Vector3(0f, 0f, -1f),
  22.          new Color(0f, 0f, 1f))
  23.    };
  24.    dev.drawTriangle (vertices);
  25. dev.end();

Inspiracje pewną popularną biblioteką w zakresie interfejsu są, jak sądzę, doskonale widoczne :)

Tags: ,
Author: Xion, posted under Programming »


13 comments for post “Sam zrobiłem ten trójkąt!”.
  1. nameczanin:
    January 17th, 2008 o 21:12

    To prawie jakbyś pisał jedną z pierwszych gier w 3D za czasów DOS-a :) Nie ma to jak “samemu”.

  2. SirMike:
    January 17th, 2008 o 21:25

    Jesli moge miec male, dziwne pytanie – po co? ;)

  3. Siemien:
    January 17th, 2008 o 21:31

    Pieprzony geniusz :D twoj IQ pewnie duzo ponad 200 wykracza (o ja pyrtole ) :O właśnie próbuje własnych sił z twoim Tutrialem o C++ aż nie chce mi się wierzyć że jesteś tylko o dwa lata starszy odemnie

  4. puchaty/I:
    January 17th, 2008 o 21:41

    Nie ma AA… brzydkie ;)

  5. TeMPOraL:
    January 18th, 2008 o 0:10

    Java… bleeeee…. bardzo brzydkie ;)

  6. RedHot:
    January 18th, 2008 o 10:26

    Ale przenośne ^.^

  7. Netrick:
    January 18th, 2008 o 11:26

    Jakich ty funkcji używasz do softwarowego putpixel? Nigdy o nich nie słyszałem ;p (bo siedzę w oglu)

  8. TeMPOraL:
    January 18th, 2008 o 11:28

    RedHot: Jak koder się postara, to C++ też jest przenośny :).

  9. Xion:
    January 18th, 2008 o 12:32

    SirMike: Z powodu posiadania na studiach takiego przedmiotu jak Grafika komputerowa, gdzie “Wizualizacja sceny 3D” jest jednym z projektów do wykonania :)

    TeMPOraL: Tak, to Java, więc brzydkie – ale dzięki temu załatwiam również inny przedmiot o nazwie Java 2 :)

    Netrick: Ano właśnie to OGL jest :) Mówiąc ściślej, używam JOGLa do rysowania point-sprite’ów, co działa jak stawianie pikseli. Wiem, że to nie najlepsze rozwiązanie (zapewne lepiej byłoby dobrać się do tekstury, a potem wyświetlić ją na quadzie), ale najprostsze (z tych szybkich, pomijam użycie java.awt.Graphics).

  10. Riddlemaster:
    January 18th, 2008 o 16:48

    O jak ja się cieszę, że u mnie na uczelni byłem z grafiki zwolniony :)

    Siemien: a co ja mam powiedzieć? On jest w moim wieku ;) I jeszcze kilku innych wymiataczy też.

  11. SirMike:
    January 18th, 2008 o 17:41

    @Xion – no tak, zapomnialem – takie rzeczy to tylko w szkole ;)

  12. Reg:
    January 20th, 2008 o 12:35

    Odnośnie tego projektu wymyśliłem dowcip-zagadkę:
    – Jakie jest przeciwieństwo grafiki czasu rzeczywistego?
    – Software renderer w Javie.

    Co do optymalizacji, to jedną rzecz mógłbyś przyspieszyć – przekazywać float x, float y, float z zamiast new Vector3(x, y, z).

  13. Kurak:
    January 20th, 2008 o 12:51

    Reg: wystarczy w Javie, nie musi być nawet software ;)

Comments are disabled.
 


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