提供的代碼邏輯基本正確:設置正交投影、雙重循環繪製 8x8 矩形、交替顏色。但缺少幾個關鍵調用,導致窗口顯示空白。
glutDisplayFunc(myDisplay); 已有,但需確保在 glutCreateWindow 之後調用。GLUT_SINGLE)需調用 glFlush();雙緩衝(GLUT_DOUBLE)需 glutSwapBuffers()。代碼中 checkerboard() 末尾有 glFlush(),但 myDisplay() 未調用它。myInit 或 reshape 回調中調用 glViewport(0, 0, w, h)。GL_MODELVIEW 並 glLoadIdentity()。#define GLUT_DISABLE_ATEXIT_HACK
#include <GL/glut.h>
const GLint screenWidth = 640, screenHeight = 480;
void myInit() {
glClearColor(1.0, 1.0, 1.0, 0.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0, screenWidth, 0.0, screenHeight);
}
void checkerboard() {
for (GLint i = 0; i < 8; i++) {
for (GLint j = 0; j < 8; j++) {
if ((i + j) % 2 == 0) glColor3f(0.0f, 0.0f, 0.0f);
else glColor3f(1.0f, 1.0f, 1.0f);
glRecti(30*j, 30*i, 30*(j+1), 30*(i+1));
}
}
}
void myDisplay() {
glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
checkerboard();
glFlush(); // 單緩衝必須
}
void keyboard(unsigned char key, int x, int y) {
if (key == 27) exit(0); // ESC 退出
}
int main(int argc, char** argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(screenWidth, screenHeight);
glutInitWindowPosition(100, 100);
glutCreateWindow("Chessboard");
glutDisplayFunc(myDisplay);
glutKeyboardFunc(keyboard);
myInit();
glutMainLoop();
return 0;
}
myDisplay 開頭添加 glClearColor(1,0,0,1); 測試清屏顏色是否生效(紅屏說明渲染管線通)。glGetError() 捕獲 OpenGL 錯誤碼。GLUT_DOUBLE + glutSwapBuffers() 替換單緩衝。