Opengl概述

shader網(wǎng)站:

http://glslsandbox.com/

http://glslb.in/

https://shaderfrog.com/

https://www.shadertoy.com/

特效:https://www.shadertoy.com/view/MscGWX

https://www.shadertoy.com/view/XsdGWj


OpenGL概述:

OpenGL是一個行業(yè)標(biāo)準(zhǔn)的跨平臺應(yīng)用程序編程接口(API),這個API的規(guī)范是在1992年定稿的赚抡,他的第一個實(shí)現(xiàn)在1993年吹缔,GL(Graphics Library,圖形庫)

OpenGL版本歷史:

OpenGL1.0:

發(fā)布時間:1992年1月

OpenGL的最早版本OpenGL1.0由MarkSegal和KurtAkeley發(fā)布于1992年1月烈和。從這之后伍绳,OpenGL每隔一段時間都會發(fā)布一個新版本的規(guī)范,這些規(guī)范定義了一些顯卡必須支持的新擴(kuò)展尿瞭。這就決定了OpenGL的每個版本其實(shí)就是由各個擴(kuò)展組成的祖乳,當(dāng)硬件的驅(qū)動全部支持相應(yīng)的擴(kuò)展的時候砸西,相應(yīng)的OpenGL版本就被支持了。

時隔5年OpenGL才發(fā)布新的版本OpenGL1.1力奋,而Direct3D的出現(xiàn)(尤其是紅色警戒的大賣)使得OpenGL感覺到了壓力榜旦。頂點(diǎn)數(shù)組(Vertexarrays)的出現(xiàn)取代了glVertex*這類立即模式繪圖函數(shù),多個數(shù)據(jù)可以被一個函數(shù)調(diào)用繪制了景殷,降低了調(diào)用函數(shù)帶來的CPU循環(huán)開銷溅呢;polygonoffset解決了z-fighting和stitching的問題猿挚;在pre-fragmentoperation開始支持邏輯操作(logic operation)咐旧;紋理方面開始支持紋理代理(textureproxy)和紋理環(huán)境映射(textureenvironment),以及從幀緩沖(frameuffer)復(fù)制像素至texture或者subtexture绩蜻;紋理對象(textureobject)的出現(xiàn)改變了過去只能使用顯示表(display list)來靜態(tài)地使用紋理的方法铣墨,現(xiàn)在紋理和參數(shù)(textureparameter)能被改變了。

OpenGL1.2

發(fā)布時間:1998年3月16日

這個版本的OpenGL開始支持可以用于體渲染(volumerendering)和體紋理(solid texture)的texture3D办绝;BGRA和BGA的出現(xiàn)主要是為了兼容某些平臺和硬件伊约;包裝像素(packpixel)的出現(xiàn)使得像素可以在不同的對象之間進(jìn)行像素傳輸(pixeltransfer),這也就是像素緩沖對象(pixel bufferobject)的前身孕蝉;GL_SGIS_texture_edge_clamp擴(kuò)展的出現(xiàn)將texturecoordinate規(guī)范在[0,1]這個區(qū)間屡律;GL_SGIS_Texture_lod擴(kuò)展則帶來了重要的MipMap技術(shù),可以通過對紋理參數(shù)(textureparameter)的控制來完成對MipMap的控制降淮。

OpenGL1.3

發(fā)布時間:2001年8月14日

這個版本開始支持壓縮紋理(compressedtexture)超埋,可以有效地減少存儲和帶寬的壓力,現(xiàn)在廣泛的應(yīng)用于各種對存儲大小和帶寬敏感的手持設(shè)備上;立方體紋理(texturecube)的出現(xiàn)主要用于在天空盒(skybox)霍殴、動態(tài)反射(dynamicreflection)等技術(shù)上媒惕;而multisample的出現(xiàn)讓OpenGL可以支持紋理和Framebuffer的MSAA抗鋸齒技術(shù),代替了過去在光柵化狀態(tài)(rasterizerstate)中趨近無用的抗鋸齒設(shè)置来庭。

OpenGL1.4

發(fā)布版本:2002年7月24日

這個版本開始支持紋理自動生成Mipmap妒蔚;以及關(guān)于point光柵化的parameter。

OpenGL1.5

發(fā)布時間:2003年7月29日

這個版本出現(xiàn)了緩沖對象(bufferobject)巾腕,徹底取代了過去的頂點(diǎn)數(shù)組(vertex array)和立即模式面睛,頂點(diǎn)數(shù)據(jù)可以從客戶端內(nèi)存(client'smemory)上傳到服務(wù)端內(nèi)存(server's memory)了絮蒿;同時添加了非常重要的遮擋查詢(occlusionquery)尊搬。

OpenGL2.0

發(fā)布時間:2004年9月7日

OpenGL終于有了自己的著色語言(shadinglanguage),ARB選擇了3Dlabs的Dave設(shè)計(jì)的著色語言成為OpenGL原生的著色語言土涝,同時OpenGL也開始有了頂點(diǎn)著色器(vertexshader)和片元著色器(fragmentshader)佛寿,導(dǎo)致這個階段的OpenGL出現(xiàn)了固定管線和可編程管線并存的情況;OpenGL的片元著色器輸出(fragmentshader output)現(xiàn)在也可以輸出到幀緩沖(framebuffer)的多個渲染目標(biāo)(rendertarget)上去了但壮;同時OpenGL的紋理也不再有2^n大小的限制冀泻。

OpenGL2.1

發(fā)布時間:2006年7月2日

這個版本增加了像素緩沖對象(pxielbuffer object),用來更快地像素傳輸(pixel tansfer)的工作蜡饵,支持將像素從紋理對象(textureobject)和幀緩沖對象(framebuffer object)包裝到(pack)像素緩沖對象(pixel bufferobject)弹渔,或者從像素緩沖對象解包裝到紋理對象和幀緩沖對象,另外像素緩沖對象也可以像普通的緩沖對象(bufferobject)一樣被映射(map)更新數(shù)據(jù)溯祸,通過DMA的方式更加快地傳輸紋理肢专;同時支持sRGB格式的紋理對象。

OpenGL3.0

發(fā)布日期:2008年8月11日

這個版本正式把幀緩沖對象(framebufferobject)劃入core profile焦辅,現(xiàn)在OpenGL也具有離線的幀緩沖了博杖,就像Direct3D的output-mergerstage專門管理render target和接收fragmentshader的輸出;增加了許多GLSL的函數(shù)筷登,尤其是texture方面的剃根;幀緩沖對象之間可以互相拷貝像素到持有的不同的rendertarget,是性能上的提升前方;增加了浮點(diǎn)型和整型的texture和depth的imageformat狈醉;另外也增加了RGTC這個自帶的紋理壓縮模式;最為重要的增加就是transformfeedback惠险,數(shù)據(jù)可以經(jīng)過vertex shader和geometryshader之后苗傅,又輸出回buffer而不經(jīng)過rasterization以及之后的階段,在物理和粒子的計(jì)算上面非常的有用莺匠;增加的vertexarray object方便管理buffer object以及vertex attribpointer和其開啟/關(guān)閉狀態(tài)金吗,不必每次在渲染前都要設(shè)置一遍了;增加了重要的條件渲染

OpenGL3.1

發(fā)布日期:2009年3月24日

有了Instancedrendering,減輕了同類物體繪制所占有的帶寬壓力摇庙;Copybuffer的出現(xiàn)旱物,是讓數(shù)據(jù)在client端進(jìn)行拷貝,也是一種性能的優(yōu)化卫袒;Buffer texture其實(shí)是讓bufferobject像texture那樣被訪問宵呛,在某些特殊的場合有意想不到的用途;不得不談的就是uniform bufferobject夕凝,過去OpenGL上傳uniform數(shù)據(jù)需要靠glUniform*的函數(shù)進(jìn)行上傳宝穗,而OpenGL每個函數(shù)的調(diào)用所消耗的CPU循環(huán)都非常的大,頻繁地調(diào)用glUniform*會帶來很大的性能問題码秉,而且到后期這些單個的uniform也會被保存至OpenGL管理的defaultuniform buffer中逮矛,現(xiàn)在開放了uniform bufferobject,通過map/unmap更新數(shù)據(jù)转砖,函數(shù)調(diào)用開銷明顯地減少须鼎。

OpenGL3.2

發(fā)布日期:2009年8月3日

這個版本最重磅的支持就是幾何著色器(geometryshader),可以用來生成新的圖元類型(點(diǎn)府蔗、線和三角形)晋控,后期重要的tessellation等技術(shù)都會使用到它;還有一個就是Texture正式支持multisample姓赤,可以作為rendertarget來進(jìn)行framebufferobject上的抗鋸齒赡译,而不是經(jīng)過的WGL_ARB_multisample和GLX_ARB_multisample進(jìn)行窗口的抗鋸齒。

OpenGL3.3

發(fā)布日期:2010年3月11日

這個版本是shader model4.0的OpenGL的最終版本不铆,這個版本改變了程序需要查詢輸入變量(attribute)的location的方式蝌焚,可以像HLSL指定semantic一樣在shader里指定layout,減少了相應(yīng)API的調(diào)用狂男;同時將textureobject和sampler state解耦综看,增加了sampler object,samplerobject也可以綁定到ACTIVE_TEXTURE上了岖食。?

红碑。。泡垃。析珊。。

OpenGL ES 各版本

OpenGL ES 1.x 針對固定管線硬件

OpenGL ES 2.x 針對可編程管線硬件

OpenGL ES 1.0 以 OpenGL 1.3 規(guī)范為基礎(chǔ)

OpenGL ES 1.1 以 OpenGL 1.5 規(guī)范為基礎(chǔ)

OpenGL ES 2.0 以 OpenGL 2.0 規(guī)范為基礎(chǔ)

OpenGL ES 3.0 于2012年公布蔑穴,在OpenGL 3.x 和 4.x的基礎(chǔ)上增加了許多新的功能忠寻。


1


2

OpenGL的接口實(shí)現(xiàn)是顯卡商實(shí)現(xiàn)的(相關(guān)庫函數(shù)由gl開頭),是一種應(yīng)用程序編程接口存和,本身不具有創(chuàng)建窗口奕剃、接收外設(shè)事件等功能衷旅,所以需要第三方軟件庫

GLFW是現(xiàn)在較流行、使用廣泛的OpenGL的界面庫纵朋,而glut庫已經(jīng)比較老了柿顶。

GLEW是和管理OpenGL函數(shù)指針有關(guān)的庫,因?yàn)镺penGL只是一個標(biāo)準(zhǔn)/規(guī)范操软,具體的實(shí)現(xiàn)是由驅(qū)動開發(fā)商針對特定顯卡實(shí)現(xiàn)的嘁锯。由于OpenGL驅(qū)動版本眾多,它大多數(shù)函數(shù)的位置都無法在編譯時確定下來聂薪,需要在運(yùn)行時查詢家乘,而GLEW可以解決這些問題。


Opengl命名采用了以下方式:<庫前綴><根命令><可選的參數(shù)個數(shù)><可選的參數(shù)類型> (glVertex3fv())

我目前見過的前綴有:gl藏澳,glut

gl:opengl核心庫?

glut:和窗口交互

glew:上面的文字有說

glef:代替glut

mac搭建glfw+glew環(huán)境:

新建一個工程

1

刪除相關(guān)文件如圖所示

新建一個c++ main.cpp 程序 如圖




source ~/.bash_profile :使環(huán)境變量生效

shift+command+. : 顯示隱藏文件夾

1.安裝glew和glfw:

brew install glew

brew install glfw3

2.如果有個警告就是告訴你glew還沒有l(wèi)ink

brew link glew

brew命令安裝的軟件包都會在:/usr/local/Cellar

3.接下來就是在Xcode中的配置仁锯,在Xcode中找到Peference菜單項(xiàng),這個一般在File菜單項(xiàng)左邊的那個Xcode項(xiàng)目中笆载,然后在里面找到Locations項(xiàng)扑馁,再點(diǎn)擊Custom Paths,添加四項(xiàng)凉驻,依次為:

Name Display Name Path

glew_header? ? ? ? glew_header? ? ? ? /usr/local/Cellar/glew/2.0.0/include

glew_lib? ? ? ? glew_lib? ? ? ? /usr/local/Cellar/glew/2.0.0/lib

glfw_header? ? ? ? glfw_header? ? ? ? /usr/local/Cellar/glfw3/3.2.1/include

glfw_lib? ? ? ? glfw_lib? ? ? ? /usr/local/Cellar/glfw3/3.2.1/lib

在這里需要修改的只有一項(xiàng),就是要根據(jù)你自己安裝的glew的版本和glfw3的版本修改2.0.0和3.2.1這兩個版本號复罐,其他的都是一樣的涝登。

4.然后創(chuàng)建一個新的Xcode項(xiàng)目(command line tool),語言選擇C++效诅。接著胀滚,在項(xiàng)目的Bulid Settings里面找到Header Search Paths和Library Search Paths兩項(xiàng),在Header?

Search Paths中加入:$(glew_header) $(glfw_header)

同理也在Library Search Paths中加入:$(glew_lib) $(glfw_lib)

5.完成了上述過程之后乱投,還有最后一步咽笼,就是導(dǎo)入framework。在項(xiàng)目的General中找到Linked Frameworks and Libraries戚炫,點(diǎn)擊‘+’號剑刑,添加如下三個文件

OpenGL.framework libGLEW.2.0.0.dylib libglfw3.3.2.dylib

添加兩個dylib文件的方法是,在你沒有在framework中搜索到這兩個文件時双肤,點(diǎn)擊add other施掏,然后點(diǎn)擊shift+command+G進(jìn)入/usr/local文件夾,然后根據(jù)我們之前說的安裝glew和glfw3的路徑找到這兩個文件夾茅糜,在這兩個文件夾中找到這兩個文件七芭,當(dāng)然這兩個文件可能和我圖中給出的文件名不同還是因?yàn)榘惭b的版本號不同,這個需要注意一下

6.環(huán)境配置好之后我們可以測試一下蔑赘,測試如下代碼:

#include <iostream>

#include <GL/glew.h>

#include <GLFW/glfw3.h>

void Render(void)

{

? ? glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

? ? glClear(GL_COLOR_BUFFER_BIT);

? ? glBegin(GL_TRIANGLES);?//開始畫

? ? {

? ? ? ? glColor3f(1.0,0.0,0.0);?//第一個點(diǎn)顏色

? ? ? ? glVertex2f(0, .5);?//第一個點(diǎn)坐標(biāo)

? ? ? ? glColor3f(0.0,1.0,0.0);?//第二個點(diǎn)顏色

? ? ? ? glVertex2f(-.5,-.5);?//第二個點(diǎn)坐標(biāo)

? ? ? ? glColor3f(0.0, 0.0, 1.0);?//第三個點(diǎn)顏色

? ? ? ? glVertex2f(.5, -.5);?//第三個點(diǎn)坐標(biāo)

? ? }

? ? glEnd();?//結(jié)束了一次畫

}

void?error_callback(int?error,const?char* description){

? ? std::cout<<"error:"<

}

static?void?key_callback(GLFW window* window,int?key,int?scancode,int?action,int?mods)

{

? ? if(key ==GLFW_KEY_ESCAPE&& action ==GLFW_PRESS)

? ? ? ? glfwSetWindowShouldClose(window, GL_TRUE);

}

int main(int argc, const char * argv[]) {

? ? GLFWwindow* win;

? ? if(!glfwInit()){

? ? ? ? return -1;

? ? }

????glfwSetErrorCallback(error_callback);

? ? win = glfwCreateWindow(640, 480, "OpenGL Base Project", NULL, NULL);

? ? if(!win)

? ? {

? ? ? ? glfwTerminate();?//Terminates the GLFW library.

? ? ? ?exit(0);

? ? }

? ? if(!glewInit())

? ? {

? ? ? ? return -1;

? ? }

glfwSetKeyCallback(win, key_callback);

? ? glfwMakeContextCurrent(win);??//Makes the context of the specified window current for the calling thread. 使指定窗口的上下文成為調(diào)用線程的當(dāng)前上下文狸驳。

? ? while(!glfwWindowShouldClose(win)){?//Checks the close flag of the specified window 檢查是否關(guān)閉

? ? ? ? Render();

? ? ? ? glfwSwapBuffers(win);?//Swaps the front and back buffers of the specified window. 交換指定窗口的前后幀緩存

? ? ? ? glfwPollEvents();?//Processes all pending events. 激活掛起的事,glfwWaitEvents() 前者會立即處理已經(jīng)到位的事件预明,后者等待

? ? }

? ? glfwTerminate();?//Terminates the GLFW library.

? ? exit(0);

? ? return 0;

}

使用GLUT的更加簡單的配置方法

首先創(chuàng)建MacOS Command Line Tool,語言C++耙箍,這里不需要下載任何東西贮庞,只要添加OpenGL.framework和GLUT。framework就可以了究西,如下圖:

1

接下來可以直接添加代碼:

#include <iostream>

#include <GLUT/GLUT.h>

void display()

{

? ? glClear(GL_COLOR_BUFFER_BIT);

? ? glBegin(GL_POLYGON);

? ? glVertex2f(-0.5, -0.5);

? ? glVertex2f(-0.5, 0.5);

? ? glVertex2f(0.5, 0.5);

? ? glVertex2f(0.5, -0.5);

? ? glEnd();

? ? glFlush();

}

int main(int argc, char ** argv)

{

? ? glutInit(&argc, argv);

? ? glutCreateWindow("Xcode Glut Demo");

? ? glutDisplayFunc(display);

? ? glutMainLoop();

}

? 運(yùn)行結(jié)果如下


2
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末窗慎,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子卤材,更是在濱河造成了極大的恐慌遮斥,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,640評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扇丛,死亡現(xiàn)場離奇詭異术吗,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)帆精,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評論 3 395
  • 文/潘曉璐 我一進(jìn)店門较屿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人卓练,你說我怎么就攤上這事隘蝎。” “怎么了襟企?”我有些...
    開封第一講書人閱讀 165,011評論 0 355
  • 文/不壞的土叔 我叫張陵嘱么,是天一觀的道長。 經(jīng)常有香客問我顽悼,道長曼振,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,755評論 1 294
  • 正文 為了忘掉前任蔚龙,我火速辦了婚禮冰评,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘木羹。我一直安慰自己甲雅,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,774評論 6 392
  • 文/花漫 我一把揭開白布汇跨。 她就那樣靜靜地躺著务荆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪穷遂。 梳的紋絲不亂的頭發(fā)上函匕,一...
    開封第一講書人閱讀 51,610評論 1 305
  • 那天,我揣著相機(jī)與錄音蚪黑,去河邊找鬼盅惜。 笑死中剩,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的抒寂。 我是一名探鬼主播结啼,決...
    沈念sama閱讀 40,352評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼屈芜!你這毒婦竟也來了郊愧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,257評論 0 276
  • 序言:老撾萬榮一對情侶失蹤井佑,失蹤者是張志新(化名)和其女友劉穎属铁,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體躬翁,經(jīng)...
    沈念sama閱讀 45,717評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡焦蘑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,894評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了盒发。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片例嘱。...
    茶點(diǎn)故事閱讀 40,021評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖宁舰,靈堂內(nèi)的尸體忽然破棺而出拼卵,到底是詐尸還是另有隱情,我是刑警寧澤明吩,帶...
    沈念sama閱讀 35,735評論 5 346
  • 正文 年R本政府宣布间学,位于F島的核電站,受9級特大地震影響印荔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜详羡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,354評論 3 330
  • 文/蒙蒙 一仍律、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧实柠,春花似錦水泉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蟹漓,卻和暖如春炕横,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背葡粒。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評論 1 270
  • 我被黑心中介騙來泰國打工份殿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留膜钓,地道東北人。 一個月前我還...
    沈念sama閱讀 48,224評論 3 371
  • 正文 我出身青樓卿嘲,卻偏偏與公主長得像颂斜,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子拾枣,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,974評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 開發(fā)基于 OpenGL 的應(yīng)用程序沃疮,必須先了解 OpenGL 的庫函數(shù)。它采用 C 語言風(fēng)格梅肤,提供大量的函數(shù)來進(jìn)行...
    sillen閱讀 3,072評論 0 4
  • 1 前言 一直想沿著圖像處理這條線建立一套完整的理論知識體系司蔬,同時積累實(shí)際應(yīng)用經(jīng)驗(yàn)。因此有了從使用AVFounda...
    RichardJieChen閱讀 5,669評論 5 12
  • 1 紋理基礎(chǔ) 紋理是一種結(jié)構(gòu)化的存儲形式(Textures are a structured form of st...
    RichardJieChen閱讀 15,841評論 0 9
  • 那么多夜晚凭语, 無法入眠葱她; 隔著千里, 是2017冬季的連宵夜語似扔。 陰晴圓缺擋不住思念吨些, 眉宇,臉龐…… 甜蜜的笑容...
    TheRainbowMe閱讀 119評論 0 1
  • 還有十一天 我不想高考 不是因?yàn)槌煽?而是因?yàn)槲蚁矚g這里 喜歡每天早八點(diǎn)晚十點(diǎn)的課程 喜歡班級里熱熱鬧鬧或者是安靜...
    難歌啊閱讀 223評論 0 0