了不起的 Creator Shader 修仙之路—GLSL ES(簡介和基本語法)


前言

歡迎來到我的 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-zA-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.

掃描二維碼

獲取更多精彩

菜鳥小棧

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章