auxInitDisplayMode(AUX_DOUBLE | AUX_RGBA); // 雙緩衝 + RGBA 模式
RGBA 模式適合光照、霧效、融合等進階效果;雙緩衝消除閃爍。
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse); 設定漫射光顏色。glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambient); 設定全域環境光。glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); 啟用。glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, mat_ambient);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mat_diffuse);
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, mat_shininess);
最終像素顏色 = 光源分量 × 材質反射率。
glOrtho:CAD 繪圖,大小不隨距離變化。gluPerspective:符合視覺習慣,近大遠小。auxInitPosition(0, 0, 400, 400);
auxInitWindow("OpenGL Demo");
auxReshapeFunc(myReshape); // 視窗大小改變
auxIdleFunc(Idledisplay); // 空閒時動畫
auxMainLoop(display); // 主繪圖迴圈
void myinit() {
glClearColor(1,1,0,0);
// ... 光源/材質設定 ...
glEnable(GL_DEPTH_TEST);
}
void display() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
auxSolidSphere(1.0);
glFlush(); auxSwapBuffers(); _sleep(100);
}
void Idledisplay() {
static float x=-0.1, y=0, step=0.01;
x += step;
if (x<=0.1 && x>=-0.1) {
y = (step>0) ? sqrt(0.01-x*x) : -sqrt(0.01-x*x);
glTranslatef(x, y, 0);
} else step = -step;
display();
}
void myReshape(GLsizei w, GLsizei h) {
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION); glLoadIdentity();
if (w<=h) glOrtho(-3.5,3.5, -3.5*h/w,3.5*h/w, -10,10);
else glOrtho(-3.5*w/h,3.5*w/h, -3.5,3.5, -10,10);
glMatrixMode(GL_MODELVIEW); glLoadIdentity();
}
連結庫:opengl32.lib glu32.lib glaux.lib。執行時需 opengl32.dll、glu32.dll 於系統目錄。