OpenGL著色器(Shader)和GLSL語言的簡單介紹

前言

最近在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程序展示

效果參見本文開頭圖片

國外著色器(Shader)源碼分享網(wǎng)站

Shadertoy——https://www.shadertoy.com/

以上,本文結(jié)束

本文章大部分內(nèi)容來自網(wǎng)絡(luò),本人只是整理和簡要說明,方便大家。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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