天天看點

OpenGL學習(二)畫線段

(切記)使用OpenGL畫圖時首先要建立并顯示一個視窗,然後再繪制,這一點新手常常會忘記。

#include "pch.h"
#include<windows.h> //包含了WGL函數
#include<GL/GL.h> //OpenGL庫
#include<GL/GLU.h> //OpenGL庫
#include<GL/glut.h> //處理視窗管理操作
#include <iostream>
#include<stdio.h> //标準輸入輸出函數
#include<stdlib.h> //最常用的系統函數
#include<math.h> //數學函數



//初始化操作
void init()
{
	glClearColor(1.0, 1.0, 1.0, 0.0);//清除視窗背景色為白色(red,green,blue,alpha透明度),該背景顔色不顯示
	//接下來告訴OpenGL如何将圖形投影到顯示器中,二維線在OpenGL中被視為三維線的特例進行處理
	glMatrixMode(GL_PROJECTION);//設定投影矩陣,說明接下來要對投影進行一系列操作。
	                            /*glMatrixMode()函數就是對接下來要做什麼進行一下說明,
								也就是在要做下一步之前告訴計算機我要對“什麼”進行操作,
								GL_PROJECTION(投影),GL_MODELVIEW(模型視圖),GL_TEXTURE(紋理)。
								如果參數是GL_PROJECTION,就是要對投影進行相關操作,
								也就是要把一個物體投影到一個平面上。*/
	gluOrtho2D(0.0, 200.0, 0.0, 150.0);//gluOrtho2D(lift,right,bottom,top)是指螢幕區域對應的模型坐标範圍,
	                                   //本次投影操作橫向範圍是0到200,縱向是0到150
     //隻要是在該矩陣内定義的對象,都會顯示在視窗上
}

//顯示直線
void lineSegment(void)
{
	glClear(GL_COLOR_BUFFER_BIT);//把視窗顯示為目前緩沖區的顔色(背景色未顯示出來),
							  //GL_COLOR_BUFFER_BIT為顔色緩沖區,用來指定顔色緩存中的位值,
							//是glClearColor函數中指定的值
	glColor3f(0.0, 1.0, 0.0);         //設定顯示對象顔色,此時為綠色。glColor3f(R,G,B),
								 //對視窗顯示的對象進行顔色設定,三元素值最小是0(不顯示),最大是1

	glBegin(GL_LINES);            //對元素類型進行操作 glBegin(GLenum mode),mode為元素類型
	                              //GL_LINES繪制一組直線。使用此常量可連接配接每一組相鄰端點而得到一組直線段,
	                              //在glBegin/glEnd中如果隻指定一個點,則什麼也不顯示,如果指定的是奇數個點,則最後一個點忽略。
	                             /*OpenGL空間使用的是右手系的定義,與螢幕水準方向一緻,并方向向右的是x軸;
								 與螢幕垂直方向一緻,并方向向上的是y軸;與螢幕垂直方向,并方向向外的是z軸
								 */
	glVertex2i(10, 145);
	glVertex2i(180,15);          //指定頂點坐标,2表示二維,有兩個參數;i表示32位整數(GLint、GLsizei)
	glColor3f(1.0, 0.0, 0.0);     //下一條線為紅色
	glVertex2i(10, 25);
	glVertex2i(180,145);
	glEnd();

	glFlush();                  //強制清空緩沖區,并将指令送往緩硬體立即執行,将指令傳送完畢之後會立即傳回。
	                            //而glFinish将緩沖區的指令立即送往硬體執行,但是要一直等到硬體執行完這些指令之後才傳回。
}

int main(int argc, char *argv[]) {
	glutInit(&argc,argv);//初始化GLUT
	/*這個函數用來初始化GLUT庫.這個函數從main函數擷取其兩個參數.對應main函數的形式應是 : int main(int argc, char* argv[]);
	在這個部分我們将在我們的程式裡建立一個main函數,這個main函數将完成必須的初始化和開啟事件處理循環。
	所有的GLUT函數都有glut字首并且那些完成一些初始化的函數有glutInit字首。你首先要做的是調用函數glutInit()。*/
	/*GLUT(OpenGL Utility Toolkit)OpenGL的程式工具庫,負責處理和底層作業系統的呼叫以及I/O*/
	glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);//設定視窗的緩存和顔色模式,預設單緩沖和RGB顔色
	glutInitWindowPosition(50, 100);//設定視窗出現在螢幕上的位置
	glutInitWindowSize(400,300);//設定視窗大小
	glutCreateWindow("An Example OpenGL Program");//建立視窗并顯示視窗标題
	init();
	glutDisplayFunc(lineSegment);//将圖指派給顯示視窗。glutDisplayFunc用于視窗變化時重新整理視窗内容
	//glutDisplayFunc(&display)在程式運作時是自動調用的,即程式會自動調用display函數重繪視窗
	glutMainLoop();//進入GLUT事件處理循環,讓所有的與“事件”有關的函數調用無限循環。一旦調用,永不傳回
}

/*GLUT的基本功能:

包括視窗初始化功能、事件處理、視窗和菜單管理、回調函數注冊和幾何模組化功能。

視窗初始化功能,它有4個函數。主要用于處理初始化并以及指令行參數,初始化顯示模式,指定視窗左上角在螢幕上的位置和視窗大小,以像素為機關。

事件處理隻有一個函數,它用于顯示建立的視窗、處理輸入的事件、觸發回調函數、進入循環直到程式退出。

視窗管理包含18個函數,用于建立、銷毀視窗及可能的子視窗,管理和設定視窗的屬性。

在GLUT中有20個回調函數,用于響應使用者事件。最重要的回調函數是glutDisplayFunc,當GLUT認為需要重新顯示視窗内容時,
都将執行這一函數注冊的回調函數。另外一些重要的回調函數注冊函數有:函數glutRe-shapeFunc用于注冊視窗大小改變這一事件發生時GLUT将調用的函數。
glutKeyboardFunc和glutMouseFunc用于注冊鍵盤和滑鼠事件發生時的回調函數。函數glutMotionFunc注冊滑鼠移動事件的回調函數。
這3個函數用于人機互動處理。在沒有其他事件處理時,GLUT将調用函數glutldleFunc注冊的函數,而函數glutTimerFunc則注冊處理定時器事件的函數。

OpenGL繪圖函數隻能生成點、直線、多邊形等簡單的幾何圖元,GLUT提供了18個建立三維物體的函數。
利用它們可以建立9種三維物體,如圓錐體、立方體、球體等,每一物體有線框和實體2種方式。

我們看到的以glut 開頭的函數都是 glut 庫的一部分,如處理參數的,和設定視窗的,我們在這裡主要讨論glut 支援的各種消息處理*/




// 運作程式: Ctrl + F5 或調試 >“開始執行(不調試)”菜單
// 調試程式: F5 或調試 >“開始調試”菜單

// 入門提示: 
//   1. 使用解決方案資料總管視窗添加/管理檔案
//   2. 使用團隊資料總管視窗連接配接到源代碼管理
//   3. 使用輸出視窗檢視生成輸出和其他消息
//   4. 使用錯誤清單視窗檢視錯誤
//   5. 轉到“項目”>“添加新項”以建立新的代碼檔案,或轉到“項目”>“添加現有項”以将現有代碼檔案添加到項目
//   6. 将來,若要再次打開此項目,請轉到“檔案”>“打開”>“項目”并選擇 .sln 檔案
           

繼續閱讀