這兩天學習了NeHe的OpenGL教程的前5個課程,瞭解並掌握了OpenGL較爲基礎的知識:多邊形的繪製,上色,旋轉等。
1. X座標軸從左至右,Y座標軸從下至上,Z座標軸從裏至外。OpenGL屏幕中心的座標值是X和Y軸上的0.0f點。中心左面的座標值是負值,右面是正值。移向屏幕頂端是正值,移向屏幕底端是負值。移入屏幕深處是負值,移出屏幕則是正值。
2. GL_TRIANGLES 三角形
GL_QUADS 正方形
GL_POLYGON 多邊形
3. 我們使用順時針次序來畫正方形-左上-右上-右下-左下。採用順時針繪製的是對象的後表面。這就是說我們所看見的是正方形的背面。逆時針畫出來的正方形纔是正面朝着我們的。
4. 使用Flat coloring(單調着色)給四邊形塗上固定的一種顏色。使用Smooth coloring(平滑着色)將三角形的三個頂點的不同顏色混合在一起,創建漂亮的色彩混合。
glShadeModel(GL_FLAT)採取最後一點的顏色作爲剛繪製的多邊形的整體顏色。
glShadeModel(GL_SMOOTH)則採取漸變色繪製多邊形。(默認爲此模式)
彩色的多邊形:
int DrawGLScene(GLvoid) // 從這裏開始進行所有的繪製
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清除屏幕和深度緩存
glLoadIdentity(); // 重置當前的模型觀察矩陣
glTranslatef(-1.5f,0.0f,-6.0f); // 左移 1.5 單位,並移入屏幕 6.0
glBegin(GL_TRIANGLES); // 繪製三角形
glColor3f(1.0f,0.0f,0.0f); // 設置當前色爲紅色
glVertex3f( 0.0f, 1.0f, 0.0f); // 上頂點
glColor3f(0.0f,1.0f,0.0f); // 設置當前色爲綠色
glVertex3f(-1.0f,-1.0f, 0.0f); // 左下
glColor3f(0.0f,0.0f,1.0f); // 設置當前色爲藍色
glVertex3f( 1.0f,-1.0f, 0.0f); // 右下
glEnd(); // 三角形繪製結束
glTranslatef(3.0f,0.0f,0.0f); // 右移3單位
glColor3f(0.5f,0.5f,1.0f); // 一次性將當前色設置爲藍色
glBegin(GL_QUADS); // 繪製正方形
glVertex3f(-1.0f, 1.0f, 0.0f); // 左上
glVertex3f( 1.0f, 1.0f, 0.0f); // 右上
glVertex3f( 1.0f,-1.0f, 0.0f); // 左下
glVertex3f(-1.0f,-1.0f, 0.0f); // 右下
glEnd(); // 正方形繪製結束
return TRUE; // 一切 OK
}
在windows消息循環機制中添加改變着色方式的代碼(F2單調着色,F3平滑着色,默認爲平滑着色模式)
int WINAPI WinMain( HINSTANCE hInstance, // 當前窗口實例
HINSTANCE hPrevInstance, // 前一個窗口實例
LPSTR lpCmdLine, // 命令行參數
int nCmdShow) // 窗口顯示狀態
{
MSG msg; // Windowsx消息結構
BOOL done=FALSE; // 用來退出循環的Bool 變量
// 提示用戶選擇運行模式
if (MessageBox(NULL,"你想在全屏模式下運行麼?", "設置全屏模式",MB_YESNO|MB_ICONQUESTION)==IDNO)
{
fullscreen=FALSE; // FALSE爲窗口模式
}
// 創建OpenGL窗口
if (!CreateGLWindow("cc's 顏色實例",640,480,16,fullscreen))
{
return 0; // 失敗退出
}
while(!done) // 保持循環直到 done=TRUE
{
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE)) // 有消息在等待嗎?
{
if (msg.message==WM_QUIT) // 收到退出消息?
{
done=TRUE; // 是,則done=TRUE
}
else // 不是,處理窗口消息
{
TranslateMessage(&msg); // 翻譯消息
DispatchMessage(&msg); // 發送消息
}
}
else // 如果沒有消息
{
// 繪製場景。監視ESC鍵和來自DrawGLScene()的退出消息
if (active) // 程序激活的麼?
{
if (keys[VK_ESCAPE]) // ESC 按下了麼?
{
done=TRUE; // ESC 發出退出信號
}
else // 不是退出的時候,刷新屏幕
{
DrawGLScene(); // 繪製場景
SwapBuffers(hDC); // 交換緩存 (雙緩存)
}
}
if (keys[VK_F1]) // F1鍵按下了麼?
{
keys[VK_F1]=FALSE; // 若是,使對應的Key數組中的值爲 FALSE
KillGLWindow(); // 銷燬當前的窗口
fullscreen=!fullscreen; // 切換 全屏 / 窗口 模式
// 重建 OpenGL 窗口
if (!CreateGLWindow("cc's 顏色實例",640,480,16,fullscreen))
{
return 0; // 如果窗口未能創建,程序退出
}
}
if (keys[VK_F2])
{
glShadeModel(GL_FLAT);
}
if (keys[VK_F3])
{
glShadeModel(GL_SMOOTH);
}
}
}
// 關閉程序
KillGLWindow(); // 銷燬窗口
return (msg.wParam); // 退出程序
}
先設置全局變量
GLfloat rtri; // 用於三角形的角度
GLfloat rquad; // 用於四邊形的角度
更新DrawGLScene函數
int DrawGLScene(GLvoid) // 從這裏開始進行所有的繪製
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清除屏幕和深度緩存
glLoadIdentity(); // 重置當前的模型觀察矩陣
glTranslatef(-1.5f,0.0f,-6.0f); // 左移 1.5 單位,並移入屏幕 6.0
glRotatef(rtri,0.0f,1.0f,0.0f); // 繞Y軸旋轉三角形
glBegin(GL_TRIANGLES); // 繪製三角形
glColor3f(1.0f,0.0f,0.0f); // 設置當前色爲紅色
glVertex3f( 0.0f, 1.0f, 0.0f); // 上頂點
glColor3f(0.0f,1.0f,0.0f); // 設置當前色爲綠色
glVertex3f(-1.0f,-1.0f, 1.0f); // 左下頂點
glColor3f(0.0f,0.0f,1.0f); // 設置當前色爲藍色
glVertex3f( 1.0f,-1.0f, 1.0f); // 右下頂點
glColor3f(1.0f,0.0f,0.0f); // 紅色
glVertex3f( 0.0f, 1.0f, 0.0f); // 三角形的上頂點 (右側面)
glColor3f(0.0f,0.0f,1.0f); // 藍色
glVertex3f( 1.0f,-1.0f, 1.0f); // 三角形的左下頂點 (右側面)
glColor3f(0.0f,1.0f,0.0f); // 綠色
glVertex3f( 1.0f,-1.0f, -1.0f); // 三角形的右下頂點 (右側面)
glColor3f(1.0f,0.0f,0.0f); // 紅色
glVertex3f( 0.0f, 1.0f, 0.0f); // 三角形的上頂點 (後側面)
glColor3f(0.0f,1.0f,0.0f); // 綠色
glVertex3f( 1.0f,-1.0f, -1.0f); // 三角形的左下頂點 (後側面)
glColor3f(0.0f,0.0f,1.0f); // 藍色
glVertex3f(-1.0f,-1.0f, -1.0f); // 三角形的右下頂點 (後側面)
glColor3f(1.0f,0.0f,0.0f); // 紅色
glVertex3f( 0.0f, 1.0f, 0.0f); // 三角形的上頂點 (左側面)
glColor3f(0.0f,0.0f,1.0f); // 藍色
glVertex3f(-1.0f,-1.0f,-1.0f); // 三角形的左下頂點 (左側面)
glColor3f(0.0f,1.0f,0.0f); // 綠色
glVertex3f(-1.0f,-1.0f, 1.0f); // 三角形的右下頂點 (左側面)
glEnd(); // 三角形繪製結束
glLoadIdentity(); // 重置模型觀察矩陣
glTranslatef(1.5f,0.0f,-7.0f); // 右移1.5單位,並移入屏幕 6.0
glRotatef(rquad,1.0f,1.0f,1.0f); // 繞在XYZ軸上旋轉立方體
glBegin(GL_QUADS); // 繪製正方形
glColor3f(0.0f,1.0f,0.0f); // 一次性將當前色設置爲藍色
glVertex3f( 1.0f, 1.0f, -1.0f); // 左上
glVertex3f(-1.0f, 1.0f,-1.0f); // 右上
glVertex3f(-1.0f, 1.0f, 1.0f); // 左下
glVertex3f( 1.0f, 1.0f, 1.0f); // 右下
glColor3f(1.0f,0.5f,0.0f); // 顏色改成橙色
glVertex3f( 1.0f,-1.0f, 1.0f); // 四邊形的右上頂點(底面)
glVertex3f(-1.0f,-1.0f, 1.0f); // 四邊形的左上頂點(底面)
glVertex3f(-1.0f,-1.0f,-1.0f); // 四邊形的左下頂點(底面)
glVertex3f( 1.0f,-1.0f,-1.0f); // 四邊形的右下頂點(底面)
glColor3f(1.0f,0.0f,0.0f); // 顏色改成紅色
glVertex3f( 1.0f, 1.0f, 1.0f); // 四邊形的右上頂點(前面)
glVertex3f(-1.0f, 1.0f, 1.0f); // 四邊形的左上頂點(前面)
glVertex3f(-1.0f,-1.0f, 1.0f); // 四邊形的左下頂點(前面)
glVertex3f( 1.0f,-1.0f, 1.0f); // 四邊形的右下頂點(前面)
glColor3f(1.0f,1.0f,0.0f); // 顏色改成黃色
glVertex3f( 1.0f,-1.0f,-1.0f); // 四邊形的右上頂點(後面)
glVertex3f(-1.0f,-1.0f,-1.0f); // 四邊形的左上頂點(後面)
glVertex3f(-1.0f, 1.0f,-1.0f); // 四邊形的左下頂點(後面)
glVertex3f( 1.0f, 1.0f,-1.0f); // 四邊形的右下頂點(後面)
glColor3f(0.0f,0.0f,1.0f); // 顏色改成藍色
glVertex3f(-1.0f, 1.0f, 1.0f); // 四邊形的右上頂點(左面)
glVertex3f(-1.0f, 1.0f,-1.0f); // 四邊形的左上頂點(左面)
glVertex3f(-1.0f,-1.0f,-1.0f); // 四邊形的左下頂點(左面)
glVertex3f(-1.0f,-1.0f, 1.0f); // 四邊形的右下頂點(左面)
glColor3f(1.0f,0.0f,1.0f); // 顏色改成紫羅蘭色
glVertex3f( 1.0f, 1.0f,-1.0f); // 四邊形的右上頂點(右面)
glVertex3f( 1.0f, 1.0f, 1.0f); // 四邊形的左上頂點(右面)
glVertex3f( 1.0f,-1.0f, 1.0f); // 四邊形的左下頂點(右面)
glVertex3f( 1.0f,-1.0f,-1.0f); // 四邊形的右下頂點(右面)
glEnd(); // 正方形繪製結束
rtri+=0.2f; // 增加三角形的旋轉變量
rquad-=0.15f; // 減少四邊形的旋轉變量
return TRUE; // 一切 OK
}
真正的挑戰還在後面!堅持下去!