„Számítógépes grafika házi feladat tutorial” változatai közötti eltérés

Rohamcsiga (vitalap | szerkesztései)
Rohamcsiga (vitalap | szerkesztései)
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 ==