visual studio opengl 環(huán)境配置
- 打開vs2015,運(yùn)行—devenv
- 在Visual C++下新建一個(gè)win32控制臺(tái)程序
- 項(xiàng)目—管理Nuget程序包
- 瀏覽——在搜索欄輸入NupenGL,安裝這兩個(gè)文件包
程序測(cè)試
#include "stdafx.h"
#include "iostream"
int main2()
{
std::cout << "Hello world!" << std::endl;
return 0;
}
#include "stdafx.h"
#include <GL/glut.h>
void init(void)
{
glClearColor(1.0, 1.0, 1.0, 0.0);
glMatrixMode(GL_PROJECTION);
gluOrtho2D(0.0, 200.0, 0.0, 150.0);
}
void lineSegment(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0.0, 0.4, 0.2);
glBegin(GL_LINES);
glVertex2i(180, 15);
glVertex2i(10, 145);
glEnd();
glFlush();
}
int main(int argc, char** argv)
{
//初始化GLUT
glutInit(&argc, argv);
//顯示模式 單模式 RGB
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
//窗口設(shè)置
glutInitWindowPosition(50, 100);
glutInitWindowSize(400, 300);
glutCreateWindow("An Example OpenGL Program");
init();
//開始渲染
glutDisplayFunc(lineSegment);
//開始GLUT的內(nèi)部循環(huán)
glutMainLoop();
return 0;
}
OpenGL中g(shù)l,glu,glut的區(qū)別
OpenGL中的gl庫(kù)是核心庫(kù),glu是實(shí)用庫(kù),glut是實(shí)用工具庫(kù);
gl是核心,glu是對(duì)gl的部分封裝,glut是OpenGL的跨平臺(tái)工具庫(kù),gl中包含了最基本的3D函數(shù),而glu似乎對(duì)gl的輔助,如果算數(shù)好,不用glu的情況下,也是可以做出同樣的效果。glut是基本的窗口界面,是獨(dú)立于gl和glu的,如果不喜歡用glut可以用MFC和Win32窗口等代替,但是glut是跨平臺(tái)的,這就保證了我們編出的程序是跨平臺(tái)的,如果用MFC或者Win32只能在windows操作系統(tǒng)上使用。選擇OpenGL的一個(gè)很大原因就是因?yàn)樗目缙脚_(tái)性,所以我們可以盡量的使用glut庫(kù)。
glut已經(jīng)太老,現(xiàn)在代替之的是free glut,其功能齊全,但是bug太多。穩(wěn)定性也不好,GLFW應(yīng)運(yùn)而生。
測(cè)試代碼說明
-
glutInit(&argc, argue);
調(diào)用這個(gè)函數(shù)來初始化GLUT.參數(shù)可以直接引用command line的,而且有一些有用的選項(xiàng),比如:‘-sync’和‘-gldebug’,可以禁掉X窗口的異步特征并分別自動(dòng)檢查和顯示GL錯(cuò)誤。 -
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
這里配置一些GLUT的選項(xiàng)設(shè)置。GLUT_DOUBLE在多數(shù)渲染結(jié)束后開啟雙緩沖機(jī)制(維護(hù)兩個(gè)圖像緩沖數(shù)據(jù),屏幕顯示一副圖像時(shí)在后臺(tái)同時(shí)繪制另一份圖像緩沖數(shù)據(jù),交替顯示)和顏色緩沖。我們通常需要這兩個(gè)設(shè)置,還有其他的選項(xiàng)設(shè)置后面會(huì)繼續(xù)介紹。 -
窗口位置尺寸標(biāo)題
glutInitWindowSize(960, 640); // 窗口尺寸 glutInitWindowPosition(200, 200); // 窗口位置 glutCreateWindow("Tutorial 01"); // 窗口標(biāo)題 這幾個(gè)函數(shù)的調(diào)用可以設(shè)置一些窗口參數(shù)并創(chuàng)建一個(gè)窗口。也可以定義窗口的標(biāo)題。 -
glutDisplayFunc(RenderScenceCB);
由于我們是在一個(gè)窗口系統(tǒng)中工作的,與運(yùn)行的程序多數(shù)的交互是通過事件回調(diào)函數(shù)。GLUT針對(duì)與底層窗口系統(tǒng)的交互為我們提供了幾個(gè)回調(diào)函數(shù)選項(xiàng)。 -
glClearColor(0.0f, 0.0f, 0.0f, 0.0f)
這個(gè)是我們?cè)贠penGL中遇到的第一個(gè)狀態(tài)(OpenGL是一個(gè)狀態(tài)機(jī))。OpenGL使用狀態(tài)方案的原因是渲染是一個(gè)非常復(fù)雜的任務(wù),不能僅僅通過一個(gè)函數(shù)接受幾個(gè)參數(shù)來完成(一個(gè)合理設(shè)計(jì)的函數(shù)是不會(huì)接受大量的參數(shù)的)。對(duì)于渲染效果的設(shè)置我們需要定義shader著色器,buffer緩沖還有各種各樣的flag標(biāo)志變量。另外,我們也經(jīng)常想保存一些相同的配置在多個(gè)渲染操作中使用(比如:如果我們從來不需要禁掉深度檢測(cè)depth test,我們沒必要在每一個(gè)渲染回調(diào)中來明確定義它)。這也是為什么多數(shù)的渲染操作配置都是通過在OpenGL狀態(tài)機(jī)中設(shè)置flag標(biāo)志變量和值來完成,而且渲染回調(diào)本身通常也被局限于幾個(gè)參數(shù),參數(shù)解決需要繪制的定點(diǎn)數(shù)量和他們的偏移量。調(diào)用一個(gè)改變狀態(tài)的函數(shù)后,具體的配置保持不變,直到下次再調(diào)用這個(gè)相同的函數(shù)再次改變狀態(tài)和配置。上面的函數(shù)設(shè)置了當(dāng)幀緩存(幀緩存后面還會(huì)介紹)清空后要使用的顏色值。顏色值有四個(gè)通道(RGBA),使用單位化的值0.0-1.0來表示。
-
glutMainLoop();
這個(gè)函數(shù)調(diào)用傳遞指令給GLUT現(xiàn)在開始它的內(nèi)部循環(huán)。在這個(gè)循環(huán)中它監(jiān)聽窗口系統(tǒng)中的事件并通過我們配置的回調(diào)傳遞出去。在我們這個(gè)例子中,GLUT將只會(huì)調(diào)用我們注冊(cè)的那個(gè)display回調(diào)(RenderScenceCB),在這個(gè)回調(diào)函數(shù)中(RenderScenceCB)我們可以自定義代碼來渲染這一幀的圖像。 glClear(GL_COLOR_BUFFER_BIT);glutSwapBuffers();
在渲染函數(shù)中我們能做的就是清空幀緩存(使用上面定義的顏色,可以嘗試任意改變顏色看效果)。第二個(gè)函數(shù)是告訴GLUT交換雙緩沖機(jī)制中前后兩個(gè)緩存的角色位置,也就是二者換班,后臺(tái)的緩存放到前臺(tái)顯示,之前顯示的緩存繼續(xù)到后臺(tái)開始另一幀的緩存工作。這樣在下一個(gè)渲染回調(diào)循環(huán)中交換到當(dāng)前的緩存將在屏幕上顯示。-
glMatrixMode(GL_PROJECTION);
函數(shù)其實(shí)就是對(duì)接下來要做什么進(jìn)行一下聲明,也就是在要做下一步之前告訴計(jì)算機(jī)我要對(duì)“什么”進(jìn)行操作了,這個(gè)“什么”在glMatrixMode的“()”里的選項(xiàng)(參數(shù))有3種模式: GL_PROJECTION 投影, GL_MODELVIEW 模型視圖, GL_TEXTURE 紋理.
如果參數(shù)是GL_PROJECTION,這個(gè)是投影的意思,就是要對(duì)投影相關(guān)進(jìn)行操作,也就是把物體投影到一個(gè)平面上,就像我們照相一樣,把3維物體投到2維的平面上。這樣,接下來的語句可以是跟透視相關(guān)的函數(shù),比如glFrustum()或gluPerspective();
在操作投影矩陣以前,需要調(diào)用函數(shù):
glMatrixMode(GL_PROJECTION); //將當(dāng)前矩陣指定為投影矩陣
然后把矩陣設(shè)為單位矩陣:
glLoadIdentity();
然后調(diào)用glFrustum()或gluPerspective(),它們生成的矩陣會(huì)與當(dāng)前的矩陣相乘,生成透視的效果;
如果參數(shù)是GL_MODELVIEW,這個(gè)是對(duì)模型視景的操作,接下來的語句描繪一個(gè)以模型為基礎(chǔ)的適應(yīng),這樣來設(shè)置參數(shù),接下來用到的就是像gluLookAt()這樣的函數(shù);
若是GL_TEXTURE,就是對(duì)紋理相關(guān)進(jìn)行操作
順便說下,OpenGL里面的操作,很多是基于對(duì)矩陣的操作的,比如位移,旋轉(zhuǎn),縮放,所以,這里其實(shí)說的規(guī)范一點(diǎn)就是glMatrixMode是用來指定哪一個(gè)矩陣是當(dāng)前矩陣,而它的參數(shù)代表要操作的目標(biāo),GL_PROJECTION是對(duì)投影矩陣操作,GL_MODELVIEW是對(duì)模型視景矩陣操作,GL_TEXTURE是對(duì)紋理矩陣進(jìn)行隨后的操作。
-
void gluOrtho2D(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top)
gluOrtho2D定義了一個(gè)二維圖像投影矩陣,參數(shù) left,right指明平面的左邊和右邊的垂直坐標(biāo);
bottom,top 指明平面底部和頂部的水平坐標(biāo)。
建立了一個(gè)可視的二維平面區(qū)域。這個(gè)和用glOrtho函數(shù)效果是一樣的當(dāng)glOrtho的near=0,far=1時(shí) -
glColor3f(0.0, 0.4, 0.2);
從函數(shù)名字就可以看出,它的參數(shù)應(yīng)該有三個(gè),類型是float型的。另外一點(diǎn)是它的參數(shù)值的范圍是[0.0,1.0]。 參考值
glColor3f(0.0, 0.0, 0.0); --> 黑色 glColor3f(1.0, 0.0, 0.0); --> 紅色 glColor3f(0.0, 1.0, 0.0); --> 綠色 glColor3f(0.0, 0.0, 1.0); --> 藍(lán)色 glColor3f(1.0, 1.0, 0.0); --> 黃色 glColor3f(1.0, 0.0, 1.0); --> 品紅色 glColor3f(0.0, 1.0, 1.0); --> 青色 glColor3f(1.0, 1.0, 1.0); --> 白色需要注意的是,如果在glBegin()與glEnd()函數(shù)之間多次連續(xù)調(diào)用顏色函數(shù),那么,只會(huì)顯示出最后一次的顏色,
- void glBegin(GLenummode)
void glEnd(void)
glBegin是和glEnd結(jié)合起來使用的.
glBegin和glEnd函數(shù)限定了一組或多組圖元的定點(diǎn)定義。
| 類型 | 說明 |
|---|---|
| GL_POINTS | 單個(gè)頂點(diǎn)集 |
| GL_LINES | 多組雙頂點(diǎn)線段 |
| GL_POLYGON | 單個(gè)簡(jiǎn)單填充凸多邊形 |
| GL_TRAINGLES | 多組獨(dú)立填充三角形 |
| GL_QUADS | 多組獨(dú)立填充四邊形 |
| GL_LINE_STRIP | 不閉合折線 |
| GL_LINE_LOOP | 閉合折線 |
| GL_TRAINGLE_STRIP | 線型連續(xù)填充三角形串 |
| GL_TRAINGLE_FAN | 扇形連續(xù)填充三角形串 |
| GL_QUAD_STRIP | 連續(xù)填充四邊形串 |