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ǔ)上增加了許多新的功能忠寻。
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)境:
新建一個工程
刪除相關(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就可以了究西,如下圖:
接下來可以直接添加代碼:
#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é)果如下