„Számítógépes grafika házi feladat tutorial” változatai közötti eltérés
| 1 433. sor: | 1 433. sor: | ||
Az eredménye: [http://pastebin.com/JikPBAFT Megvilágított kocka]: | Az eredménye: [http://pastebin.com/JikPBAFT Megvilágított kocka]: | ||
http://i.imgur.com/W7BpUW4.png | http://i.imgur.com/W7BpUW4.png <br/> | ||
A gyakran használt megvilágítási paraméterek a <code>glLightfv()</code> függvényhez: | |||
* <code>GL_AMBIENT</code> - a fényforráshoz tartozó környezeti megvilágítás színe. Alapértéke: (0.0, 0.0, 0.0, 1.0) | |||
* <code>GL_DIFFUSE</code> - a fényforrás színe a diffúz megvilágítás számolásakor. Alapértéke: GL_LIGHT0 - (1.0, 1.0, 1.0, 1.0), GL_LIGHT{1..7} - (0.0, 0.0, 0.0, 1.0) | |||
* <code>GL_SPECULAR</code> - a fényforrás színe a spekuláris megvilágítás számolásakor. Alapértéke: GL_LIGHT0 - (1.0, 1.0, 1.0, 1.0), GL_LIGHT{1..7} - (0.0, 0.0, 0.0, 1.0) | |||
* <code>GL_POSITION</code> - a fényforrás pozíciója / iránya. Alapértéke: (0,0,1,0) | |||
<br/> | |||
A <code>glLightf(GLenum light, GLenum pname, GLfloat param);</code> is hasznos lehet, az ehhez tartozó gyakori paraméterek a pontfényforrások erősségének távolságfüggését befolyásolják: | |||
* <code>GL_CONSTANT_ATTENUATION</code> - Alapértéke: 1 | |||
* <code>GL_LINEAR_ATTENUATION</code> - Alapértéke: 0 | |||
* <code>GL_QUADRATIC_ATTENUATION</code> - Alapértéke: 0 | |||
<br/> | |||
A fényerősséget számoló képlet: | |||
*<code> attenuated_power = power / (GL_CONSTANT_ATTENUATION + dist*GL_LINEAR_ATTENUATION + dist*dist*GL_QUADRATIC_ATTENUATION) </code> | |||
<br/> | |||
Ha valósághű távolságfüggést akarunk, akkor a konstans gyengülést vegyük le nullára, és a négyzetesre állítsuk be valami pozitív számot. Pl: | |||
<br/> <syntaxhighlight lang="c"> | |||
glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 0.0f); | |||
glLightf(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, 0.5f); | |||
</syntaxhighlight> <br/> | |||
Az eredménye: | |||
http://i.imgur.com/tM9VJDr.png | |||
* A képpel van egy elég nagy probléma: a megvilágítás nem folytonos, látszódik, hogy hogyan bontotta háromszögekre az OpenGL a quadot amit ki akartunk rajzolni. | |||
** A jelen esetben ez - bár rondán néz ki - de nem olyan nagy probléma. Ha viszont egy gömböt akarunk kirajzolni, ott már nagyon is zavaró, ha látszódik, hogy háromszögekből áll. | |||
** Ennek a jelenségnek az az oka, hogy az OpenGL csak a csúcspontokba számol megvilágítást (per vertex shading), és ezeket az értékeket interpolálja a háromszög belsejében. Ez akkor amikor az OpenGL-nek az a verziója készült, amit a tárgyból használni kell (1997-ben), még nagyon fontos volt, ezzel teljesítményben rengeteget lehetett nyerni. | |||
** Ez igazándiból nem olyan nagy probléma, csak az olyan objektumokat, aminek a méretei elég nagyok ahhoz, hogy az azon a távon már jelentős legyen a megvilágítás megváltozása, célszerű kisebb háromszögekre bontanunk. | |||
Pl ha egy oldal 2 helyett 32 db háromszögből áll, amit én így oldottam meg: | |||
<br/> <syntaxhighlight lang="c"> | |||
void glQuad(const Vector& a, const Vector& b, const Vector& c, const Vector& d) { | |||
Vector normal = cross(b-a, c-a).normalize(); | |||
glColor3f(fabs(normal.x), fabs(normal.y), fabs(normal.z)); | |||
glNormal3f(normal.x, normal.y, normal.z); | |||
int res = 4; // resolution | |||
for(int i = 0; i < res; i++) { | |||
for(int j = 0; j < res; j++) { | |||
glVertex3f(a + i*(b-a)/res + j*(d-a)/res); | |||
glVertex3f(a + (i+1)*(b-a)/res + j*(d-a)/res); | |||
glVertex3f(a + (i+1)*(b-a)/res + (j+1)*(d-a)/res); | |||
glVertex3f(a + i*(b-a)/res + (j+1)*(d-a)/res); | |||
} | |||
} | |||
// glVertex3f(a); glVertex3f(b); glVertex3f(c); glVertex3f(d); | |||
} | |||
</syntaxhighlight> <br/> | |||
Akkor a csúcspontokban számolt megvilágítás is egész hihetően néz ki: | |||
http://i.imgur.com/dzjcMuZ.png | |||
És ha a felbontást felvisszük mondjuk 1024 háromszögig: | |||
http://i.imgur.com/EyFQ9L0.png | |||
Akkor már pixel szinten pontos képet kapunk... de sokkal sokkal drágábban. Ilyenkor az OpenGL rengeteg fölösleges munkát csinál. Általánosságban nagyon rossz ötlet pixel szintű pontosságra törekedni a felbontás növelésével. A nem feltűnően zavaró megvilágítással általában már megelégszünk, egy összetett jelenetnél az úgy se tűnik fel. | |||
== Utóhang == | == Utóhang == | ||