首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

OpenGL 入門:繪製棋盤圖形顯示異常排查指南

     編輯:程式設計綜合問答

代碼審視

提供的代碼邏輯基本正確:設置正交投影、雙重循環繪製 8x8 矩形、交替顏色。但缺少幾個關鍵調用,導致窗口顯示空白。

常見缺失與修復

  1. 缺少顯示回調註冊:glutDisplayFunc(myDisplay); 已有,但需確保在 glutCreateWindow 之後調用。
  2. 缺少緩衝區交換:單緩衝模式(GLUT_SINGLE)需調用 glFlush();雙緩衝(GLUT_DOUBLE)需 glutSwapBuffers()。代碼中 checkerboard() 末尾有 glFlush(),但 myDisplay() 未調用它。
  3. 視口未設置:建議在 myInit 或 reshape 回調中調用 glViewport(0, 0, w, h)。
  4. 矩陣模式切換:繪製前應切換到 GL_MODELVIEW 並 glLoadIdentity()。

修正後完整代碼(含 ESC 退出)

#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;
}

環境配置檢查清單

  • Freeglut/GLUT 庫正確鏈接(VS2010+ 需配置 Include/Lib 目錄)。
  • 項目屬性 → Linker → System → SubSystem: Windows (/SUBSYSTEM:WINDOWS) 或 Console。
  • 運行時工作目錄包含必要的 DLL(如 freeglut.dll)。

調試技巧

  1. 在 myDisplay 開頭添加 glClearColor(1,0,0,1); 測試清屏顏色是否生效(紅屏說明渲染管線通)。
  2. 使用 glGetError() 捕獲 OpenGL 錯誤碼。
  3. 嘗試 GLUT_DOUBLE + glutSwapBuffers() 替換單緩衝。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved