前言
最近在Android上發(fā)現(xiàn)一個開源軟件,叫做ShaderEditor(著色編輯器),可以用它編寫GLSL程序并且預(yù)覽,還能與Android內(nèi)置變量聯(lián)系(電量,陀螺儀,磁力,觸摸,等等),還可以將效果作用于桌面壁紙,非??犰?,在深入了解之后認(rèn)識了OpenGL和GLSL(Graphics Library Shader Language)。
開源地址:https://github.com/markusfisch/ShaderEditor
這里我展示了用這個編輯器編寫的3D河豚,3D海浪,火焰,生命游戲(元胞自動機(jī))




什么是OpenGL?
OpenGL(全寫Open Graphics Library)是指定義了一個跨編程語言、跨平臺的編程接口規(guī)格的專業(yè)的圖形程序接口。它用于三維圖像(二維的亦可),是一個功能強(qiáng)大,調(diào)用方便的底層圖形庫。
OpenGL? 是行業(yè)領(lǐng)域中最為廣泛接納的 2D/3D 圖形 API,其自誕生至今已催生了各種計(jì)算機(jī)平臺及設(shè)備上的數(shù)千優(yōu)秀應(yīng)用程序。OpenGL? 是獨(dú)立于視窗操作系統(tǒng)或其它操作系統(tǒng)的,亦是網(wǎng)絡(luò)透明的。在包含CAD、內(nèi)容創(chuàng)作、能源、娛樂、游戲開發(fā)、制造業(yè)、制藥業(yè)及虛擬現(xiàn)實(shí)等行業(yè)領(lǐng)域中,OpenGL? 幫助程序員實(shí)現(xiàn)在 PC、工作站、超級計(jì)算機(jī)等硬件設(shè)備上的高性能、極具沖擊力的高視覺表現(xiàn)力圖形處理軟件的開發(fā)?!俣劝倏?/p>
什么是Shader?
著色器(Shader)是用來實(shí)現(xiàn)圖像渲染的,用來替代固定渲染管線的可編輯程序。其中Vertex Shader主要負(fù)責(zé)頂點(diǎn)的幾何關(guān)系等的運(yùn)算,Pixel Shader主要負(fù)責(zé)片源顏色等的計(jì)算。
著色器替代了傳統(tǒng)的固定渲染管線,可以實(shí)現(xiàn)3D圖形學(xué)計(jì)算中的相關(guān)計(jì)算,由于其可編輯性,可以實(shí)現(xiàn)各種各樣的圖像效果而不用受顯卡的固定渲染管線限制。
什么是GLSL?
OpenGL著色語言(OpenGL Shading Language)是用來在OpenGL中著色編程的語言,也即開發(fā)人員寫的短小的自定義程序,他們是在圖形卡的GPU (Graphic Processor Unit圖形處理單元)上執(zhí)行的,代替了固定的渲染管線的一部分,使渲染管線中不同層次具有可編程性。比如:視圖轉(zhuǎn)換、投影轉(zhuǎn)換等。GLSL(GL Shading Language)的著色器代碼分成2個部分:Vertex Shader(頂點(diǎn)著色器)和Fragment(片斷著色器),有時還會有Geometry Shader(幾何著色器)。負(fù)責(zé)運(yùn)行頂點(diǎn)著色的是頂點(diǎn)著色器。它可以得到當(dāng)前OpenGL 中的狀態(tài),GLSL內(nèi)置變量進(jìn)行傳遞。GLSL其使用C語言作為基礎(chǔ)高階著色語言,避免了使用匯編語言或硬件規(guī)格語言的復(fù)雜性。
GLSL簡單實(shí)例分析
#ifdef GL_FRAGMENT_PRECISION_HIGH
precision highp float;
#else
precision mediump float;
#endif
//上面是預(yù)編譯,如果設(shè)備支持就使用高精度模式(更高精度的浮點(diǎn)運(yùn)算),否則使用低精度模式
uniform vec2 resolution;
//只讀的全局變量,是一個二維浮點(diǎn)向量,表示當(dāng)前設(shè)備的分辨率
void main(void)
//用于著色的主函數(shù)
{
vec2 uv = gl_FragCoord.xy / resolutionCoord.xy
//當(dāng)前著色像素坐標(biāo)與設(shè)備分辨率的比值
vec4 wave_color = vec4(uv, 1.0, 1.0);
//uv設(shè)置了當(dāng)前像素的紅綠(RG)程度,藍(lán)色(B)程度固定為1.0,透明度(A)固定為1.0
gl_FragColor = wave_color;
//將顏色(一個四維向量)賦值給gl_FragColor,這是設(shè)置當(dāng)前像素顏色的固定寫法
}
我們可以看到GLSL語言風(fēng)格與C語言非常相似,上手比較容易。
二維浮點(diǎn)向量vec2 vec相當(dāng)于C語言中的數(shù)組float vec[2]。
事實(shí)上GLSL也支持?jǐn)?shù)組,如vec2 vec[2]相當(dāng)于C語言中的二維數(shù)組float vec[2][2]
OpenGL學(xué)習(xí)網(wǎng)站
OpenGL學(xué)習(xí)網(wǎng)站——https://learnopengl-cn.github.io/
OpenGL深度介紹博客
OpenGL深度介紹博客——http://www.twinklingstar.cn/category/opengl/
GLSL中文手冊
GLSL中文手冊——https://blog.csdn.net/hk_shao/article/details/82084274
GLSL程序展示
效果參見本文開頭圖片
- 3D河豚魚——https://blog.csdn.net/hk_shao/article/details/82084361
- 火焰效果——https://blog.csdn.net/hk_shao/article/details/82084411
- 3D海洋——https://blog.csdn.net/hk_shao/article/details/82084448
- 生命游戲(元胞自動機(jī))——https://blog.csdn.net/hk_shao/article/details/82084481
國外著色器(Shader)源碼分享網(wǎng)站
Shadertoy——https://www.shadertoy.com/