mercredi 15 février 2012

setupView: Réécriture de la partie IV

J'ai écrit le Partie 4 de l'OpenGL ES From the Ground Up série en utilisant des tableaux plaine de GLfloats. C'est la façon la plus courante de le faire que vous allez voir dans la nature car c'est la plus portable, car il n'utilise pas les structures de données n'est pas définie dans OpenGL lui-même.

J'ai eu l'occasion de réécrire l'setupView: la méthode à utiliser les structs Vertex3D, Vector3D, et nous avons défini Color3D de retour dans Partie 1. Aucune de ces approches est «meilleure», mais j'ai pensé qu'il pourrait être intéressant de voir qu'il fait un peu différent. Quand j'étais premier apprentissage d'OpenGL, j'ai trouvé plus facile de penser en termes de sommets, de couleurs, et des triangles, plutôt que tous les tableaux différents de longueur des flotteurs. Si vous êtes comme moi, alors vous pouvez trouver cette version facile à lire et à comprendre.

En plus d'utiliser nos structures de données personnalisées, j'ai également réduit le montant de la composante de lumière ambiante et la lumière déplacé vers la droite. J'ai ensuite utilisé la Vector3DMakeWithStartAndEndPoints () au point la lumière déplacé à l'icosaèdre. En déplaçant la lumière sur la grève et l'avoir de l'objet à un angle, l'effet est un peu plus dramatique.

-(void)setupView:(GLView*)view
{
const GLfloat zNear = 0.01, zFar = 1000.0, fieldOfView = 45.0;
GLfloat size;
glEnable(GL_DEPTH_TEST);
glMatrixMode(GL_PROJECTION);
size = zNear * tanf(DEGREES_TO_RADIANS(fieldOfView) / 2.0);
CGRect rect = view.bounds;
glFrustumf(-size, size, -size / (rect.size.width / rect.size.height), size /
(rect.size.width / rect.size.height), zNear, zFar);
glViewport(0, 0, rect.size.width, rect.size.height);
glMatrixMode(GL_MODELVIEW);

// Enable lighting
glEnable(GL_LIGHTING);

// Turn the first light on
glEnable(GL_LIGHT0);

// Define the ambient component of the first light
static const Color3D light0Ambient[] = {{0.05, 0.05, 0.05, 1.0}};
glLightfv(GL_LIGHT0, GL_AMBIENT, (const GLfloat *)light0Ambient);

// Define the diffuse component of the first light
static const Color3D light0Diffuse[] = {{0.4, 0.4, 0.4, 1.0}};
glLightfv(GL_LIGHT0, GL_DIFFUSE, (const GLfloat *)light0Diffuse);

// Define the specular component and shininess of the first light
static const Color3D light0Specular[] = {{0.7, 0.7, 0.7, 1.0}};
glLightfv(GL_LIGHT0, GL_SPECULAR, (const GLfloat *)light0Specular);
glLightf(GL_LIGHT0, GL_SHININESS, 0.4);

// Define the position of the first light
// const GLfloat light0Position[] = {10.0, 10.0, 10.0};
static const Vertex3D light0Position[] = {{10.0, 10.0, 10.0}};
glLightfv(GL_LIGHT0, GL_POSITION, (const GLfloat *)light0Position);

// Calculate light vector so it points at the object
static const Vertex3D objectPoint[] = {{0.0, 0.0, -3.0}};
const Vertex3D lightVector = Vector3DMakeWithStartAndEndPoints(light0Position[0], objectPoint[0]);
glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, (GLfloat *)&lightVector);

// Define a cutoff angle. This defines a 50^0 field of vision, since the cutoff
// is number of degrees to each side of an imaginary line drawn from the light's
// position along the vector supplied in GL_SPOT_DIRECTION above
glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, 25.0);

glLoadIdentity();
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
}


Vous devriez vous sentir libre de jouer avec les attributs de lumière, ajouter des lumières supplémentaires ou icosaèdres, et généralement juste jouer pour obtenir une idée de comment les changements affecteront votre scène. Ce truc est conceptuellement difficile à Grok, donc ne vous attendez pas à venir pendant la nuit (et si c'est le cas, considérez-vous chanceux).

Aucun commentaire: