OpenGL. Neke stvari mi nisu jasne te bih volio da pogledate primjere koda
koje ovde stavljam ne biste li bolje shvatili šta me zanima. Daću vam dva
primjera koji mi prave konfuziju, propraćena slikom koja je rezultat toga
koda. Programi su pisani uz biblioteku glut.h, te dosta koda ne morate ni
da gledate jer je standardan:
// linija.c
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
#include <stdio.h>
void reshape( int w, int h )
{
glViewport( 0, 0, w, h );
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
gluPerspective( 30.0, w/h, 0.0, 10.0 );
glMatrixMode( GL_MODELVIEW );
}
void display()
{
glClear( GL_COLOR_BUFFER_BIT );
glLoadIdentity();
gluLookAt (
0.0, 0.0, 4.0,
0.0, 0.0, 0.0,
0.0, 1.0, 0.0
);
glBegin( GL_LINES );
glColor3f( 0.0, 0.0, 1.0 );
glVertex3f( 0.0, 0.0, 5.0 );
glColor3f( 0.0, 1.0, 0.0 );
glVertex3f( 0.0, 0.0, -5.0 );
glEnd();
glutSwapBuffers();
}
void init()
{
glClearColor( 0.0, 0.0, 0.0, 0.0 );
}
int main( int argc, char ** argv )
{
glutInit( &argc, argv );
glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGB );
glutInitWindowSize( 400, 400 );
glutCreateWindow( argv[0] );
init();
glutDisplayFunc( display );
glutReshapeFunc( reshape );
glutMainLoop();
return 0;
}

Kao što se vidi, linija izvire iz donjeg lijevog ugla ekrana iako bi tre-
bala, po nekom mom viđenju, da bude u obliku tačke jer mi gledamo "kroz"
nju. Šta je u pitanju? Postavio sam glLooadAt da gledam iz tačke (0,0,4)
ka tački (0,0,0), dakle niz z-osu, a linija se pruža od tačke (0,0,5) do
(0,0,-5) dakle takođe niz z-osu. Po svakom pravilu ova linija se treba
vidjeti kao jedna tačka. Zanima me zašto imam ovakav rezultat, i kako bih
postigao ono što sam ja mislio da je rezultat (da se vidi kao jedna tačka)?
// kvadrati.c
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
#include <stdio.h>
void reshape( int w, int h )
{
glViewport( 0, 0, w, h );
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
gluPerspective( 30.0, (GLdouble)w/(GLdouble)h, 0.0, 10.0 );
glMatrixMode( GL_MODELVIEW );
}
void display()
{
GLfloat tjemena1[] = {
-0.5, -0.5, 0.0,
0.5, -0.5, 0.0,
0.5, 0.5, 0.0,
-0.5, 0.5, 0.0
};
GLfloat tjemena2[] = {
-0.3, -0.3, -0.8,
0.8, -0.3, -0.8,
0.8, 0.8, -0.8,
-0.3, 0.8, -0.8
};
glClear( GL_COLOR_BUFFER_BIT );
glLoadIdentity();
gluLookAt (
0.0, 0.0, 3.0, /* gledam iz (0 i 0) */
0.0, 0.0, 0.0, /* gledam u tacku (0 0 0) */
0.0, 1.0, 0.0
);
glEnableClientState( GL_VERTEX_ARRAY );
// Crveni je na z-koordinati: 0
glColor3f( 1, 0.0, 0.0 );
glVertexPointer( 3, GL_FLOAT, 0, tjemena1 );
glDrawArrays( GL_QUADS, 0, 4 );
// Zeleni je na z-koordinati: -0.8
glColor3f( 0.0, 1.0, 0.0 );
glVertexPointer( 3, GL_FLOAT, 0, tjemena2 );
glDrawArrays( GL_QUADS, 0, 4 );
glutSwapBuffers();
}
void init()
{
glClearColor( 0.0, 0.0, 0.0, 0.0 );
}
int main( int argc, char ** argv )
{
glutInit( &argc, argv );
glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGB );
glutInitWindowSize( 400, 400 );
glutCreateWindow( argv[0] );
init();
glutDisplayFunc( display );
glutReshapeFunc( reshape );
glutMainLoop();
return 0;
}

Ovde je nešto teži kod, pošto sam serijalizovao tjemena, ne htijući da ih
svako posebno zadajem preko vertex3f nego preko drawArrays(). Ali nadam
se da vam to neće biti potrebno. Poenta je to što sam crveni kvadrat nacr-
tao prvi, a zatim zeleni iza njega. Pošto sam zadao gluPerspective(), ze-
leni kvadrat je naravno manji od crvenog na ekranu, jer se nalazi dalje od
posmatrača. Međutim, ono što mi pravi zbrku je što se zeleni kvadrat vidi
preko crvenog! Kako je to moguće? Zar OpenGL ne vodi računa o tome nevezano
koji je objekat prvi nacrtan a koji drugi? Molim da mi neko ovo razjasni!
Kvadrati su iste orijentacije, tako da posmatrač vidi prednje strane svakog
od njih, te nije u pitanju ništa od PolygonMode i CullFace...
Hvala vam unaprijed!!!