前言
歡迎來到我的 Shader 入門系列文章,在本系列文章中我將和大家一起學習 Shader 相關知識,以便於我們閱讀和編寫 Shader。
我們將從 GLSL ES 開啓我們的學習之路,本篇文章作爲該系列的開篇,將給大家簡單介紹 GLSL ES 並學習它的基本語法。
話不多說,我們開始吧!
在本系列文章中主要針對 GLSL ES 3.0 進行講解
正文
簡介
在正式學習 GLSL ES 之前,我們先大概瞭解下以下內容:
OpenGL
OpenGL 全稱爲 Open Graphics Library(開放圖形庫)。
是用於渲染 2D 或 3D 圖像的跨語言跨平臺的應用程序編程接口。
OpenGL ES
OpenGL ES 全稱爲 OpenGL for Embedded Systems(嵌入式系統開放圖形庫)。
OpenGL ES 是 OpenGL 的子集,主要針對嵌入式系統設計,去除了 Open GL 中非必要的特性。
GLSL
GLSL 全稱爲 OpenGL Shading Language(OpenGL 着色語言),是一款在 OpenGL 着色器(Shader)中使用的編程語言。
GLSL ES
GLSL ES 全稱爲 OpenGL ES Shading Language(OpenGL ES 着色語言),就是用於 OpenGL ES 着色器的編程語言。
基本語法
GLSL(ES)作爲一款類 C 語言,其同樣也是強類型語言,基本語法和 C 語言相似。
基礎
-
大小寫敏感
-
表達式後面必須以
;
結束
註釋
單行註釋:使用 //
開頭的一行文字
// 我是單行註釋
多行註釋:使用 /*
和 */
包裹多行文字
/*
我是第一行註釋
我是第二行註釋
*/
變量
變量的命名可以使用英文 a-z
或 A-Z
、數字 0-9
和下劃線 _
,另外需注意以下幾點:
- 不能以數字開頭
- 不能以
gl_
開頭 - 不能直接使用 GLSL 保留的名稱
聲明變量時必須指定類型,允許先聲明後賦值:
int age = 18; // 聲明並賦值
float money; // 聲明不賦值
bool isMe; // 先聲明
isMe = true; // 後賦值
一條表達式可以聲明多個變量,需用 ,
分隔:
int age, balance; // 都不賦值
int a, b = 110; // 同時賦值
常量
在類型前面添加 const
關鍵字來聲明常量,常量一但創建就不能更改:
const int AGE = 18; // 聲明常量必須賦值
AGE = 20; // error! 常量不可以更改
函數
定義函數時,如果函數有返回值,就需要指定返回值的類型,如果沒有返回值,必須指定爲空 void
;
如果函數有參數,那麼也需要指定參數的類型,如果沒有參數則可以不填或者填入 void
(一般都不填)。
// 沒有返回值沒有參數的 main 函數
void main() {
// ...
}
// 接收兩個 int 類型參數並返回 int 類型的值的 sum 函數
int sum(int a, int b) {
return a + b;
}
可以先聲明後定義,可以聲明多次但是隻允許定義一次:
void foo(); // 首次聲明
void foo(); // 允許重複聲明
void foo() { ... } // 定義
重載
重載函數允許你傳入不同數量或不同類型的參數:
void foo(int value) { ... }
void foo(float value) { ... }
void foo(float value1, int value2) { ... }
作用域
使用一對花括號 {}
包裹的區域即爲一個作用域:
void foo() {
int a = 0;
{
int b = 0;
}
}
子域可以訪問父域的成員,但是反過來不行:
void foo(int a) {
{
int a = a + 1; // 第二個 a 屬於父域,不衝突
int b = a; // 訪問當前作用域的 a
}
int c = b; // Error! 當前作用域內不存在 b
int d = a; // 當前作用域的參數 a
}
同一作用域內不允許成員名稱重複:
int age; // 聲明爲整型
float age; // Error! 衝突
void age(); // Error! 衝突
在同一作用域內不允許重複聲明:
int a; // 首次聲明
int a; // Error! 不可以重複聲明
相關資料
OpenGL ES Registry(OpenGL ES 資料頁)
https://www.khronos.org/registry/OpenGL/index_es.php
OpenGL ES 3 Quick Reference Card(OpenGL ES 3 快速參考卡片)
https://www.khronos.org/files/opengles3-quick-reference-card.pdf
GLSL ES Specification 3.00(GLSL ES 規範 3.0)
https://www.khronos.org/registry/OpenGL/specs/es/3.0/GLSL_ES_Specification_3.00.pdf
OpenGL ES 3.0 Online Reference Pages(OpenGL ES 3.0 在線參考頁)
https://www.khronos.org/registry/OpenGL-Refpages/es3.0/
傳送門
更多分享
公衆號
菜鳥小棧
我是陳皮皮,這是我的個人公衆號,專注但不僅限於遊戲開發、前端和後端技術記錄與分享。
每一篇原創都非常用心,你的關注就是我原創的動力!
Input and output.