代码
#include <GL/freeglut.h>
#include <iostream>
#include <vector>
#include <ctime>
std::vector<int> subWindows;
clock_t last;
void display();
void idle();
void lighting();
void keyboard(unsigned char key, int x, int y);
int main(int argc, char* argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
glutInitWindowSize(500, 500);
glutCreateWindow("GLUT");
glutDisplayFunc(display);
glutIdleFunc(idle);
glutKeyboardFunc(keyboard);
glutFullScreen();
int width = GetSystemMetrics(SM_CXFULLSCREEN);
int height = GetSystemMetrics(SM_CYFULLSCREEN);
int w_num = 16;
int h_num = 16;
int sw_w = width / w_num;
int sw_h = height / h_num;
int mw = glutGetWindow();
for (int i = 0; i < h_num; i++)
{
for (int j = 0; j < w_num; j++)
{
int sw = glutCreateSubWindow(mw, j * sw_w, i * sw_h, sw_w, sw_h);
glutDisplayFunc(display);
glutKeyboardFunc(keyboard);
subWindows.push_back(sw);
}
}
last = clock();
glutMainLoop();
return 0;
}
float angle = 0;
int nw = -1;
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(120, 1, 0.1, 100);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0, 0, 1, 0, 0, 0, 0, 1, 0);
lighting();
glRotatef(angle + nw, 1, 1, 0);
glutSolidCube(1);
glutSolidOctahedron();
angle += 0.01f;
glutSwapBuffers();
}
void idle()
{
nw = -1;
display();
for (int i = 0; i < subWindows.size(); i++)
{
nw = i;
glutPostWindowRedisplay(subWindows.at(i));
}
clock_t now = clock();
clock_t delta = now - last;
last = now;
std::cout << "FPS:" << float(CLOCKS_PER_SEC) / float(delta) << std::endl;
}
void lighting()
{
float la[] = {0.1f, 0.1f, 0.1f, 1.0f};
float ld[] = {1.0f, 1.0f, 1.0f, 1.0f};
float ls[] = {1.0f, 1.0f, 1.0f, 1.0f};
float lp[] = {0.0f, 0.0f, 2.0f, 1.0f};
float ma[] = {0.0f, 0.0f, 0.1f, 1.0f};
float md[] = {0.0f, 0.0f, 0.6f, 1.0f};
float ms[] = {0.0f, 0.0f, 1.0f, 1.0f};
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_DEPTH_TEST);
glLightfv(GL_LIGHT0, GL_AMBIENT, la);
glLightfv(GL_LIGHT0, GL_DIFFUSE, ld);
glLightfv(GL_LIGHT0, GL_SPECULAR, ls);
glLightfv(GL_LIGHT0, GL_POSITION, lp);
glMaterialfv(GL_FRONT, GL_AMBIENT, ma);
glMaterialfv(GL_FRONT, GL_DIFFUSE, md);
glMaterialfv(GL_FRONT, GL_SPECULAR, ms);
glMaterialf(GL_FRONT, GL_SHININESS, 1);
}
void keyboard(unsigned char key, int x, int y)
{
switch (key)
{
case 27:
exit(0);
break;
}
}
运行结果