001計(jì)算機(jī)圖形學(xué)vs2015配置openGL及第一個(gè)opengl程序

visual studio opengl 環(huán)境配置

  1. 打開vs2015,運(yùn)行—devenv
  2. 在Visual C++下新建一個(gè)win32控制臺(tái)程序
  3. 項(xiàng)目—管理Nuget程序包
  4. 瀏覽——在搜索欄輸入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è)試代碼說明

  1. glutInit(&argc, argue);

     調(diào)用這個(gè)函數(shù)來初始化GLUT.參數(shù)可以直接引用command line的,而且有一些有用的選項(xiàng),比如:‘-sync’和‘-gldebug’,可以禁掉X窗口的異步特征并分別自動(dòng)檢查和顯示GL錯(cuò)誤。
    
  2. 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ù)介紹。
    
  3. 窗口位置尺寸標(biāo)題

     glutInitWindowSize(960, 640); // 窗口尺寸
     glutInitWindowPosition(200, 200); // 窗口位置
     glutCreateWindow("Tutorial 01"); // 窗口標(biāo)題
     這幾個(gè)函數(shù)的調(diào)用可以設(shè)置一些窗口參數(shù)并創(chuàng)建一個(gè)窗口。也可以定義窗口的標(biāo)題。
    
  4. glutDisplayFunc(RenderScenceCB);

     由于我們是在一個(gè)窗口系統(tǒng)中工作的,與運(yùn)行的程序多數(shù)的交互是通過事件回調(diào)函數(shù)。GLUT針對(duì)與底層窗口系統(tǒng)的交互為我們提供了幾個(gè)回調(diào)函數(shù)選項(xiàng)。
    
  5. 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來表示。

  6. 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)我們可以自定義代碼來渲染這一幀的圖像。
    
  7. 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)前的緩存將在屏幕上顯示。

  8. 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)行隨后的操作。
  1. 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í)

  2. 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ì)顯示出最后一次的顏色,

  1. 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ù)填充四邊形串

參考鏈接

  1. 一步步學(xué)OpenGL(1)-《打開一個(gè)窗口》
  2. glBegin()使用小結(jié)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1 前言 一直想沿著圖像處理這條線建立一套完整的理論知識(shí)體系,同時(shí)積累實(shí)際應(yīng)用經(jīng)驗(yàn)。因此有了從使用AVFounda...
    RichardJieChen閱讀 5,944評(píng)論 5 12
  • OpenGL學(xué)習(xí)大致的理解 OpenGL為什么會(huì)涉及這么多操作順序。這是因?yàn)?,和我們現(xiàn)在使用的C++、JAVA這種...
    wo不懂閱讀 5,540評(píng)論 10 8
  • 本篇主要講解GPUImage底層是如何渲染的,GPUImage底層使用的是OPENGL,操控GPU來實(shí)現(xiàn)屏幕展示 ...
    wo不懂閱讀 2,368評(píng)論 4 4
  • 開發(fā)基于 OpenGL 的應(yīng)用程序,必須先了解 OpenGL 的庫(kù)函數(shù)。它采用 C 語言風(fēng)格,提供大量的函數(shù)來進(jìn)行...
    sillen閱讀 3,260評(píng)論 0 4
  • 國(guó)家的領(lǐng)導(dǎo)人說,創(chuàng)新是民族振興、國(guó)家富強(qiáng)的動(dòng)力,開啟智慧之燈,讓創(chuàng)新為生活增添色彩。 記得小時(shí)侯,父母都會(huì)教我們...
    秋翊邦閱讀 433評(píng)論 0 0

友情鏈接更多精彩內(nèi)容