NeHe的OpenGL教程 lesson1-5 學習心得

這兩天學習了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);							// 退出程序
}



旋轉的3D體:

先設置全局變量

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
}

真正的挑戰還在後面!堅持下去!

發佈了24 篇原創文章 · 獲贊 31 · 訪問量 26萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章