课本例子:
彩色立方体
#include<gl/glut.h>
#include<math.h>
#include<stdlib.h>
//窗口大小
int width = 600;
int height = 600;
//a point data type
typedef GLfloat point4[4];
typedef GLfloat color4[4];
/*
point4 vertices[8] = {{-1.0, -1.0, -1.0, 1.0}, {1.0, -1.0, -1.0, 1.0}, {1.0, 1.0, -1.0, 1.0}, {-1.0, 1.0, -1.0, 1.0},
{-1.0, -1.0, 1.0, 1.0}, {1.0, -1.0, 1.0, 1.0}, {1.0, 1.0, 1.0, 1.0}, {-1.0, 1.0, 1.0, 1.0}};
*/
/*point4 vertices[8] = {{-1.0, -1.0, 1.0, 1.0}, {-1.0, 1.0, 1.0, 1.0}, {1.0, 1.0, 1.0, 1.0}, {1.0, -1.0, 1.0, 1.0},
{-1.0, -1.0, -1.0, 1.0}, {-1.0, 1.0, -1.0, 1.0}, {1.0, 1.0, -1.0, 1.0}, {1.0, -1.0, -1.0, 1.0}};
*/
//0.5
point4 vertices[8] = {{-0.5, -0.5, 0.5, 1.0}, {-0.5, 0.5, 0.5, 1.0}, {0.5, 0.5, 0.5, 1.0}, {0.5, -0.5, 0.5, 1.0},
{-0.5, -0.5, -0.5, 1.0}, {-0.5, 0.5, -0.5, 1.0}, {0.5, 0.5, -0.5, 1.0}, {0.5, -0.5, -0.5, 1.0}};
color4 colors[8] = {{1.0, 0.0, 0.0, 1.0}, {1.0, 0.0, 0.0, 1.0}, {1.0, 1.0, 0.0, 1.0}, {0.0, 1.0, 0.0, 1.0},
{0.0, 0.0, 1.0, 1.0}, {1.0, 0.0, 1.0, 1.0}, {0.0, 1.0, 1.0, 1.0}, {1.0, 1.0, 1.0, 1.0}};
color4 quad_color[36];
point4 points[36];
int i = 0;
void quad(int a, int b, int c, int d)
{
for (int j=0; j<4; j++) {
quad_color[i][j] = colors[a][j];
points[i][j] = vertices[a][j];
}
glVertex4fv(points[i]);
i++;
for (int j=0; j<4; j++) {
quad_color[i][j] = colors[b][j];
points[i][j] = vertices[b][j];
}
glVertex4fv(points[i]);
i++;
for (int j=0; j<4; j++) {
quad_color[i][j] = colors[c][j];
points[i][j] = vertices[c][j];
}
glVertex4fv(points[i]);
i++;
for (int j=0; j<4; j++) {
quad_color[i][j] = colors[a][j];
points[i][j] = vertices[a][j];
}
glVertex4fv(points[i]);
i++;
for (int j=0; j<4; j++) {
quad_color[i][j] = colors[c][j];
points[i][j] = vertices[c][j];
}
glVertex4fv(points[i]);
i++;
for (int j=0; j<4; j++) {
quad_color[i][j] = colors[d][j];
points[i][j] = vertices[d][j];
}
glVertex4fv(points[i]);
i++;
}
void colorcube()
{
quad(0, 3, 2, 1);
quad(2, 3, 7, 6);
quad(3, 0, 4, 7);
quad(1, 2, 6, 5);
quad(4, 5, 6, 7);
quad(5, 4, 0, 1);
}
void renderScene(void)
{
glClearColor(1.0, 1.0, 1.0, 0.0);//注意事项:要在glClear之前设置color!
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);// 清除屏幕及深度缓存
glViewport(0,0,(GLsizei)width,(GLsizei)height);
glMatrixMode(GL_PROJECTION);//投影矩阵
glLoadIdentity();
gluPerspective(45, width/height, 1, 1000);
glMatrixMode(GL_MODELVIEW);//模型矩阵
glLoadIdentity();
gluLookAt(0, 0, 3, 0, 0, 0, 0, 1, 0);
glRotatef(30, 1, 0, 0);//绕x轴旋转
glEnable(GL_DEPTH_TEST);
glEnableClientState(GL_VERTEX_ARRAY);
colorcube();
glVertexPointer(4, GL_FLOAT, 0, points);
glEnableClientState(GL_COLOR_ARRAY);//启用颜色数组
glColorPointer(4, GL_FLOAT, 0, quad_color);
glDrawArrays(GL_TRIANGLES, 0, 36);
glutSwapBuffers();//当窗口模式为双缓存时,此函数的功能就是把后台缓存的内容交换到前台显示。当然,只有单缓存时,使用它的功能跟用glFlush()一样。而使用双缓存是为了把完整图画一次性显示在窗口上,或者是为了实现动画。
}
void myReshape(int w, int h)
{
if (h == 0) h = 1;
glViewport(0,0,(GLsizei)w,(GLsizei)h);
glMatrixMode(GL_PROJECTION);//投影矩阵
glLoadIdentity();
gluPerspective(45, width/height, 1, 1000);
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv);//初始化GLUT
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);//设置图形显示模式。GLUT_DEPTH:使用深度缓存;GLUT_DOUBLE:使用双缓存;
glutInitWindowPosition(100, 100);//设置窗口显示位置
glutInitWindowSize(600,600);//设置窗口大小
glutCreateWindow("Colored Cube");//创建带标题的窗口
glutDisplayFunc(renderScene);//为当前窗口设置显示回调函数
glutMainLoop();//进入GLUT事件处理循环
return 0;
}