第二課
     
  在第一課中我已經教你如何建立一個 OpenGL 視窗程式. 在這一課中, 我將會教你如何建立三角形和四方形. 我們會用 GL_TRIANGLES 來建立三角形, 而用 GL_QUADS 來建立正方形.

使用第一課的程式碼, 我們再加入 DrawGLScene() 程序中. 我會在下面重新改寫整個程序. 如果你計畫修改上一課, 你可以用下列的程式碼來取代 DrawGLScene() 程序, 或是只要把下列的程式碼的部分, 是上一課所沒有的, 加入就可以了.
 
     
int DrawGLScene(GLvoid)							// Here's Where We Do All The Drawing
{
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);		// Clear The Screen And The Depth Buffer
	glLoadIdentity();						// Reset The View
     
  當你做 glLoadIdentity() 時, 你將會回到畫面的中央, 左右方向的是 X 軸, 上下方向的是 Y 軸, 而 Z 軸則是進入移出畫面. OpenGL 畫面的中心點 X 軸 和 Y 軸為 0.0f. 中心點的左邊為負值, 右邊為正值. 畫面的上方為正值, 往下方為負值. 深入畫面是負值, 移往觀察者則是正值.

glTranslatef(x, y, z) 會按照順序延著 X, Y, Z 軸移動. 這一行程式碼往 X 軸的左方移動 1.5 個單位. 它沒有往 Y 軸的位置移動, 所以是 (0.0). 它移往深入畫面 6.0 個單位. 當你在轉移時, 你並不是去移動畫面中心點的位置, 而是移往目前在這個畫面是這一組座標的位置上.
 
     
	glTranslatef(-1.5f,0.0f,-6.0f);					// Move Left 1.5 Units And Into The Screen 6.0
     
  現在我們已經移往畫面的左半部, 我們已經設定足夠深度觀點的畫面處 (6.0), 這樣我們就可以看到我們所要畫的三角形的整個場景. glBegin(GL_TRIANGLES) 是指我們要開始畫三角形, 而 glEnd() 則是告訴 OpenGL 說我們已經畫完三角形了. 原則上如果你要有三個點, 那就用 GL_TRIANGLES. 畫三角形在多數的顯示卡上都是相當快的. 如果你要有四個點, 用 GL_QUADS 會容易些. 據我所聽說的, 大多數的顯示卡不管怎樣都是畫三角形. 最後, 如果你要有超過四個點, 那就用 GL_POLYGON.

在我們的範例程式中, 我們只畫一個三角形. 如果我們要畫第二個三角形, 我們可以加另外三行 (三個點) 在前面三行的後面. 這六行程式碼會在 glBegin(GL_TRIANGLES) 和 glEnd() 之間. 如果我們畫的全是三角形, 那就每三個點為一組的放在 glBegin(GL_TRIANGLES) 和 glEnd() 之間. 這同樣適用於四邊形. 如果你知道所要畫的都是四邊形, 你就可以把第二個四行程式碼加在第一個四行碼的後面. 另外, 一個多邊形 (GL_POLYGON) 可以建立在任意數量的點上面, 所以它不會管到底有多少行程式碼在 glBegin(GL_TRIANGLES) 和 glEnd() 之間.

glBegin 後的第一行設定多邊形的第一個點. glVertex 的第一個值是 X 軸值, 第二個值是 Y 軸值, 第三個值是 Z 軸值. 所以第一行我們不移動 X 軸. 我們向 Y 軸上移一個單位, 並且不移動 Z 軸. 這給我們三角形上面的點. 第二個 glVertex 左移 X 軸一個單位, 下移 Y 軸一個單位. 這得到我們三角形左下的點. 第三個 glVertex 右移一個單位, 下移一個單位. 這得到我們三角形右下的點. glEnd() 告訴 OpenGL 沒有其他點了. 填滿的三角形就會被顯示出來.
 
     
	glBegin(GL_TRIANGLES);						// Drawing Using Triangles
		glVertex3f( 0.0f, 1.0f, 0.0f);				// Top
		glVertex3f(-1.0f,-1.0f, 0.0f);				// Bottom Left
		glVertex3f( 1.0f,-1.0f, 0.0f);				// Bottom Right
	glEnd();							// Finished Drawing The Triangle
     
  現在我們顯示了三角形在畫面的左半部, 我們需要移到畫面的右半部來顯示正方形. 為了這麼做, 我們再次使用 glTranslate. 這一次我們必須向右移, 所以 X 值必須為正值. 因為我們已經向左移了 1.5 個單位, 要移到中間要先向右移 1.5 個單位. 到了中心點後, 我們另外再移往中心點右邊 1.5 個單位. 所以我們總共需要向右移動三個單位.  
     
	glTranslatef(3.0f,0.0f,0.0f);					// Move Right 3 Units
     
  現在我們建立正方形. 我們將使用 GL_QUADS. 一個四方形基本上是個有四個邊的多邊形. 完美的四方形就是正方形. 建立正方形的程式碼很類似我們用在建三角形的. 唯一的不同就是用 GL_QUADS 而不是 GL_TRIANGLES, 以及多了一個 glVertex3f 作為正方形的第四個點. 我們將畫方形的左上, 右上, 右下, 左下.  
     
	glBegin(GL_QUADS);						// Draw A Quad
		glVertex3f(-1.0f, 1.0f, 0.0f);				// Top Left
		glVertex3f( 1.0f, 1.0f, 0.0f);				// Top Right
		glVertex3f( 1.0f,-1.0f, 0.0f);				// Bottom Right
		glVertex3f(-1.0f,-1.0f, 0.0f);				// Bottom Left
	glEnd();							// Done Drawing The Quad
	return TRUE;							// Keep Going
}
     
  最後改變切換視窗 / 全螢幕模式的程式碼, 如此一來視窗上面的標題就會正確顯示了.  
     
			if (keys[VK_F1])				// Is F1 Being Pressed?
			{
				keys[VK_F1]=FALSE;			// If So Make Key FALSE
				KillGLWindow();				// Kill Our Current Window
				fullscreen=!fullscreen;			// Toggle Fullscreen / Windowed Mode
				// Recreate Our OpenGL Window ( Modified )
				if (!CreateGLWindow("NeHe's First Polygon Tutorial",640,480,16,fullscreen))
				{
					return 0;			// Quit If Window Was Not Created
				}
			}
     
  Markus Knauer Adds:在這本書 ("OpenGL Programming Guide: The Official Guide to Learning OpenGL, Release 1", J. Neider, T. Davis, M. Woo, Addison-Wesley, 1993) 的幾個章節將很清楚的解釋何謂 NeHe 所指 OpenGL 中的移動單位:

"[我所提過的] 英吋和公釐 - 這些在 OpenGL 中有什麼意義嗎? 答案是, 一句話, 沒有意義. 投射和其他的轉換是沒有實際單位的. 如果你想要把近的和遠的切割面定在 1.0 和 20.0 公尺, 英吋, 公里, 或其他的實質單位, 這都隨你便. 唯一的規則就是你必須使用一致的測量單位."


在這個課程中, 我已經試著很仔細的解釋了, 每一個步驟包含使用 OpenGL 來畫多邊形, 四方形在畫面上. 如果你有意見或是問題, 請寄電子郵件告訴我. 如果你認為我的註解不正確, 或者某些段落的程式可以再更好, 請讓我知道. 我想盡我最大努力作最好的 OpenGL 教學課程, 我很有興趣聽聽你們的反應.

Jeff Molofee (NeHe)

* 下載 Visual C++ 程式碼給本課程的.
* 下載 Delphi 程式碼給本課程的. ( Conversion by Peter De Jaegher )
* 下載 ASM 程式碼給本課程的. ( Conversion by Foolman )
* 下載 Visual Fortran 程式碼給本課程的. ( Conversion by Jean-Philippe Perois )
* 下載 Linux 程式碼給本課程的. ( Conversion by Richard Campbell )
* 下載 Irix 程式碼給本課程的. ( Conversion by Lakmal Gunasekara )
* 下載 Solaris 程式碼給本課程的. ( Conversion by Lakmal Gunasekara )
* 下載 Mac OS 程式碼給本課程的. ( Conversion by Anthony Parker )
* 下載 Power Basic 程式碼給本課程的. ( Conversion by Angus Law )
* 下載 BeOS 程式碼給本課程的. ( Conversion by Chris Herborth )
* 下載 Java 程式碼給本課程的. ( Conversion by Darren Hodges )
* 下載 Borland C++ Builder 4.0 程式碼給本課程的. ( Conversion by Patrick Salmons )
* 下載 MingW32 & Allegro 程式碼給本課程的. ( Conversion by Peter Puck )
* 下載 Python 程式碼給本課程的. ( Conversion by John )
 
     
 
Back To NeHe Productions!
回到 OpenGL 教學索引
中文版由 Macbear 翻譯