User:Igabriel85/Computer graphics/2014-2015/Laborator 3

JOGL (Partea 2)
NOTĂ: Codul pentru crearae unei ferestre de randare se poate găsii la: Grafica -- 2014-2015 -- info.uvt.ro/JOGL-Template

Antialising
Aliasing este un efect introdus din cauza discretizării imaginilor care provoacă semnalele continue să devină imperceptibile.

Există mai multe tehnici de antialiasing în cadru JOGL:


 * Color blending -- două culori pot fi amestecate folosind diferite criterii. Următorul exemplu arată cum putem obtine un efect de tipul antialising:

Încercati să activați/deactivavți GL_BLEND și/sau GL_LINE_SMOOTH și observați diferențele.


 * Handling the accumulation buffer -- este cel mai simplu buffer din OpenGL, acesta are o singură funcție (metodă) numită glAccum. Este un extended-range color buffer care permite stocarea imaginilor/scenelor după randare. Este folosit pentru a crearea effectelor de tip antialiasing, motion blur, depth of field etc. Acestă metodă va fi detaliată în laboratoare ulterioare despre bufferele din OpenGL.


 * multisampling -- mai eficient decât prima tehnică dar nu poate să fie restricționată la nivel de subelemente dintr-o șcenă.

Link-uri Utile:
 * Aliasing

Poligoane
Sunt alcătuite dintr-o singur line loop.

Validitate
In JOGL doar poligoanele convexe sunt valide. Dacă dorim să desenăm poligoane concave trebuie să fie desenate linie cu linie folosind GL_LINE_LOOP. O altă posibilitate este de a împărții poligonul concav în mai multe poligoane convexe (tessallation, triangualtion).

Link-uri Utile:
 * Convex and Concave Polygons
 * Valid Polygons

Construirea poligoanelor
Poligoanele sunt compse din poligoane mai mici. Acestea pot fi triunghiuri (triangulation) sau poligoane mai mici (tessellation). Cel mai simplu poligon este triunghiul.

Dimensionalitatea
Poligoanele se pot afla pe același plan sau pe planuri diferite. Acest lucru depinde de definire nodurior care definesc poligonul.

Primitive
În JOGL putem crea poligoane prin interpretarea nodurilor:


 * polygons -- by using GL.GL_POLYGON
 * quads -- by using GL.GL_QUADS
 * quad strip -- by using GL.GL_QUAD_STRIP
 * triangles -- by using GL.GL_TRIANGLES
 * triangle strip -- by using GL.GL_TRIANGLE_STRIP
 * triangle fan -- by using GL.GL_TRIANGLE_FAN

Dreptunghiul (rectangle) se definește cu ajutorul funcției (metodei) glRect.

Link-uri Utile:
 * Polygon Primitives

Umplerea și orientarea Poligoanelor
Poligoane JOGL pot fi umplute cu o culoare sau, sunt reprezentate doar de conturul definit de noduri. Funcția (metoda) care permite acest lucru este glPolygonMode(face, mode), unde faces poate avea valorile GL_FRONT, GL_BACK, GL_FRONT_AND_BACK și mode poate avea valorile GL_POINT, GL_LINE sau GL_FILL. Poligoanele se pot randa diferit pentru fiecare față definită.

O trăsătură importantă a poligoanelor este cea de a desena doar fața sau spatele acestora. Această acțiune este controlată prin glCullFace(face) unde face poate avea valorile GL_FRONT, GL_BACK, GL_FRONT_AND_BACK. Această prooprietate este numită culling și ajută la optimizarea aplicațiilor OpenGL.

Poligoanele pot avea nodurile specificate în ordine trigonometrică sunt considerate front-faced iar cele specificate în ordine inversă și sunt considerate back-faced. Aceast comportament poate fii schimbat folosind funcția (metoda) glFrontFace. Acesta permite doi parametrii: GL_CW (ClockWise) și GL_CCW (CounterClockWise - Trigonometric).

Următorul fragment de cod demonstrează umplerea și orientarea poligoanelor în JOGL:

while the next one will not:

Poligon stipple
Poligoanele pot fi umplute cu un pattern numitul sipple pattern (hașurat) folosind funcția (metoda) glPolygonStipple :

Normala
Normala este reprezentată de linii perpendiculare pe o suprafață. Acestea sunt importante pentru a reprezenta surse de lumină și efectele acestora asupra obiectele dintr-o scenă. Mai multe detalii în laboratorul care vorbim despre sursele de lumină dntr-o scenă.

O normală este specificată folosind funcțiile (metodele) din familia glNormal*. Valorile argumentelor sun între [-1,1].

Introducere Bump mapping
Bump mapping este folosit pentru a crea iluzia de suprafață 3D pe o textură plată. Aceasta folosește definiția normalei în OpenGL.

Două tipuri de maps sunt folosite pentru bump mapping: bump și normal map. Ambele tipuri de map (texturi) pot crea iluzia umprelor pe o suprafață. Pentru a realiza această iluzie bump maps stochează și înălțimea fiecărui punct de pe o suprafață pe când normal maps stochează normalele unei suprafeței. Rezultatele obținute cu normal maps sunt mai netede decât cu bump maps.

Ideia este perturbarea normalelor astfel încât nodurile nu sunt iluminate uniform. Gradul de perturbație este dat de valoare bump pixel-ului (pentru bump map) sau valoarea normalei (pentru normal map).

Link-uri Utile:


 * Tutorial on vectors, normals and lighting
 * About OGL normals
 * Bump mapping

Construirea unei liste de display -- Display Lists
 Display lists  pot fi văzute ca și funcții C care odată definite pot fi folosite de câte ori este nevoie. Acestea stochează o serie de comenzi OpenGL. Sunt utile din cauza performanței sporite. Comenzile OpenGL în aceste liste sunt precompilate astfel ele sunt stochate în memoria GPU.

ID-urile pentru display list sunt generate folosind glGenLists. Fiecare comandă pe care dorim să o stochăm într-un Display List trebuie inclusă într-un bloc de cod începând cu glNewList(int id, int mode) (unde mode poate avea valorile GL_COMPILE - crearea listei, sau GL_COMPILE_AND_EXECUTE - crearea listei compilarea și executarea listei). La final trebuie să fie glEndList.

Link-uri Utile:


 * 

API

 * java.media.opengl;
 * GL;
 * glPolygonMode(int, int);
 * glRect(double, double, double, double);
 * glPolygonStipple(ByteBuffer);
 * glCullFace(int);
 * glFrontFace(int);
 * glNormal3f(float, float, float);
 * glGenLists(int);
 * glNewList(int, int);
 * glEndList;

Exerciții

 * Desenați o casă folosind GL_TRIANGLES, GL_POLYGON. Adăugați un cerc galben care (Opțional) se mișcă prin scenă de la dreapta la stânga. Umpleți fiecare secțiune a casei cu culori diferite. Folosiți Display Lists
 * Desenați o tablă de șah. NU este permisă umlerea poligoanelor cu culoarea neagră. Folosiți backface culling.
 * Opțional:Desenați fractalul Mandelbrot set. Puteți găsii algoritmul aici: http://en.wikipedia.org/wiki/Mandelbrot_set#For_programmers