//Left face
...
//Right face
glNormal3f(1.0, 0.0f, 0.0f);
glColor3f(1.0f, 0.0f, 0.0f);
glVertex3f(BOX_SIZE / 2, -BOX_SIZE / 2, -BOX_SIZE / 2);
glVertex3f(BOX_SIZE / 2, BOX_SIZE / 2, -BOX_SIZE / 2);
glColor3f(0.0f, 1.0f, 0.0f);
glVertex3f(BOX_SIZE / 2, BOX_SIZE / 2, BOX_SIZE / 2);
glVertex3f(BOX_SIZE / 2, -BOX_SIZE / 2, BOX_SIZE / 2);
绘制左边和右边面。对于每个面,我们先指定法向量。然后将当前颜色指定为渐变色的第一种颜色,通过调用glVertex3f两次将前两个顶点设为这种颜色。然后换一种颜色并将此时的颜色作为第二种颜色,并将其他两个顶点设为这种颜色。
glEnd();
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, _textureId);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glColor3f(1.0f, 1.0f, 1.0f);
现在我们想运用我们的纹理。因为有些纹理函数不能在一个glBegin-glEnd块中调用,因此先调用glEnd停止绘画四边形。调用 glEnable(GL_TEXTURE_2D)让OpenGL在以后的多边形中运用纹理。调用 glBindTexture(GL_TEXTURE_2D,_textureId)告诉OpenGL我们想将纹理绑定序号为_textureId。调用 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR)和 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAX_FILTER,GL_LINEAR)让OpenGL使用模 糊的而不是陡峭的纹理映射。然后调用glColor3f(1.0f,1.0f,1.0f)这样OpenGL不用担心改变我们纹理的颜色。
glBegin(GL_QUADS);
//Front face
glNormal3f(0.0, 0.0f, 1.0f);
glTexCoord2f(0.0f, 0.0f);
glVertex3f(-BOX_SIZE / 2, -BOX_SIZE / 2, BOX_SIZE / 2);
glTexCoord2f(1.0f, 0.0f);
glVertex3f(BOX_SIZE / 2, -BOX_SIZE / 2, BOX_SIZE / 2);
glTexCoord2f(1.0f, 1.0f);
glVertex3f(BOX_SIZE / 2, BOX_SIZE / 2, BOX_SIZE / 2);
glTexCoord2f(0.0f, 1.0f);
glVertex3f(-BOX_SIZE / 2, BOX_SIZE / 2, BOX_SIZE / 2);
//Back face
glNormal3f(0.0, 0.0f, -1.0f);
glTexCoord2f(0.0f, 0.0f);
glVertex3f(-BOX_SIZE / 2, -BOX_SIZE / 2, -BOX_SIZE / 2);
glTexCoord2f(1.0f, 0.0f);
glVertex3f(-BOX_SIZE / 2, BOX_SIZE / 2, -BOX_SIZE / 2);
glTexCoord2f(1.0f, 1.0f);
glVertex3f(BOX_SIZE / 2, BOX_SIZE / 2, -BOX_SIZE / 2);
glTexCoord2f(0.0f, 1.0f);
glVertex3f(BOX_SIZE / 2, -BOX_SIZE / 2, -BOX_SIZE / 2);
glEnd();
我们绘制最后两个面。每个面,我们先指定法向量,然后指定每个顶点的纹理坐标或者真是的坐标。
glDisable(GL_TEXTURE_2D);
现在我们已经绘制完毕纹理了,因此禁用纹理。这样下次我们绘画什么东西的时候,OpenGL不会自动应用我们纹理。
glutSwapBuffers();
}
将场景送至窗口。
//Called every 25 milliseconds
void update(int value) {
_angle += 1.0f;
if (_angle > 360) {
_angle -= 360;
}
这是更新函数,GLUT每25毫秒调用一次。首先将角度增加1度,为了使_angle值小,当大于360度时就减去360。
glutPostRedisplay();
告诉GLUT我们的场景有改变,需要重绘。
glutTimerFunc(25, update, 0);
}
告诉GLUT每25毫秒调用更新函数。
int main(int argc, char** argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(400, 400);
初始化GLUT
glutCreateWindow("Putting it All Together - videotutorialsrock.com");
告诉GLUT创建窗口。
initRendering();
调用initRendering初始化一些OpenGL的绘制设置。
glutDisplayFunc(drawScene);
glutKeyboardFunc(handleKeypress);
glutReshapeFunc(handleResize);
告诉GLUT使用什么函数绘制我们的场景,处理键盘事件,窗口大小变化事件。
glutTimerFunc(25, update, 0);
告诉GLUT没25毫秒调用update函数。
glutMainLoop();
return 0;
}
告诉GLUT开始处理所有事情。
练习:
- 除了将立方体旋转,将光源围绕立方体旋转,使这两个物体旋转速度不同。
- 紧挨大的立方体再显示两个小的,每个和原来的立方体有相同的外表。让它们围绕大的连续旋转,但是以不同的速度和角度。
- 将立方体改为你最喜欢的3D实体。至少让一个面进行纹理旋绕,一个面上色。如果你需要可以关闭光源,这样你就不用担心得到正确的法向量。