1. 程式人生 > >OpenGLES2.0著色器語言glsl

OpenGLES2.0著色器語言glsl

OpenGLES2.0中是強制使用可程式設計的渲染管線的,使用的是glsl著色器語言,因為著色器語言是使用的GPU,即圖形處理單元,而不是CPU,這樣可以使CPU從繁重的幾何計算和畫素的處理中解脫出來了。這就加大了處理的速度。

下面的這篇教程是轉載的。原文地址如下,感謝作者manyou

http://www.apkbus.com/blog-99192-39382.html

一、著色語言基礎

資料型別概述

1. 標量

標量也被稱為“無向量”其值只有大小,並不具有方向。標量之間的運算遵循簡單的代數法則,如質量、密度、體積、時間以及溫度等都屬於標量。OpenGL ES著色語言支援的標量型別有布林型(bool)、整形(int)和浮點型(float)。

2. 向量

OpenGL ES著色語言中,向量可以看做是用同樣型別的標量組成,其基本型別也分為bool、int和float三種。每個向量可以由2個、3個、4個相同的標量組成,具體情況如下:

向量型別

說明

向量型別

說明

vec2

包含了2個浮點數的向量

ivec4

包含了4個整數的向量

vec3

包含了3個浮點數的向量

bvec2

包含了2個布林數的向量

vec4

包含了4個浮點數的向量

bvec3

包含了3個布林數的向量

ivec2

包含了2個整數的向量

bvec4

包含了4個布林數的向量

ivec3

包含了3個整數的向量

向量在著色器程式碼的開發中有著十分重要的作用,可以很方面的儲存以及儲存顏色、位置、紋理座標等不僅包含一個組成部分的量。開發中,有時可能需奧單獨訪問向量中的某個分量,基本的語法為“<向量名>.<分量名>”,根據目的的不同,主要有以下幾種用法:

將一個向量看做顏色時,可以使用r,g,b,a四個分量名,分別代表紅、綠、藍、透明度4個色彩通道。具體用法如下:

[程式碼]xml程式碼:

12//給向量aColor的紅色通道賦值aColor.r = 0.6;

將一個向量看做位置時,可以使用x,y,z,w等4個分量名,分別代表X軸,Y軸,Z軸和向量的模四個分量,具體用法和顏色類似。

將一個向量看做紋理座標時,可以使用s,t,p,q四個分量名,期分別代表紋理座標的不同分量,具體用法同顏色。(對紋理座標中的s,t等分量巴友可能不是很明白,不用擔心,在後面介紹紋理貼圖的教程會進行詳細的介紹)

訪問向量中的各個不同的分量不但可以採用“.”加上不同的分量名,還可以將向量看做一個數組,用下標來進行訪問,具體用法如下:

[程式碼]xml程式碼:

12//給向量aColor的紅色通道賦值aColor[0] = 0.6;

3. 矩陣

有一些基礎的開發人員都知道,3D場景中的移位、旋轉、縮放等變換都是由矩陣的運算來實現的。因此3D場景的開發中會非常多的使用矩陣,矩陣按尺寸分為2x2矩陣、3x3矩陣、4x4矩陣,具體情況如下表所示:

矩陣型別

說明

mat2

2x2浮點數矩陣

mat3

3x3浮點數矩陣

mat4

4x4浮點數矩陣

對於矩陣的訪問,可以講矩陣作為列向量的陣列來訪問。如matrix為一個mat4,可以使用matrix[2]取到該矩陣的第三列,其為一個vec4;也可以使用matix[2][2]取得第三列向量的第3個分量。

4. 取樣器

取樣器是著色語言中不同於C語言的一種特殊的基本資料型別,其專門用來進行紋理取樣的相關操作。一般情況下,一個取樣器變數代表一幅或一套紋理貼圖,其具體情況如下:

取樣器

說明

sampler2D

用於訪問二維紋理

smapler3D

用於訪問三維紋理

samplerCube

用於訪問立方貼圖紋理

需要注意的是,與前面介紹的幾種變數不同,取樣器變數不能再著色器中初始化。一般情況下采樣器變數都用uniform限定符來修飾,從宿主語言(如java)接受傳遞進著色器的值。

5. 結構體

OpenGL ES著色語言還提供了類似C語言中的使用者自定義結構體,同樣也是使用struct關鍵字進行宣告。其基本用法如下:

[程式碼]xml程式碼:

12345struct info{vec3 color;vec3 position;vec2 textureCoor;}

6. 陣列

宣告陣列的方式主要有兩種,

在宣告陣列的同時,指定陣列的大小:

[程式碼]xml程式碼:

1vec3 position[20];

在宣告陣列時,也可以不指定陣列的大小,但是必須符合下列兩種情況之一。

u 引用陣列之前,要再次使用第一種宣告方式來生命該陣列:

[程式碼]xml程式碼:

1234//聲明瞭一個大小不定的vec3陣列vec3 position[];

相關推薦

OpenGLES2.0著色語言glsl

OpenGLES2.0中是強制使用可程式設計的渲染管線的,使用的是glsl著色器語言,因為著色器語言是使用的GPU,即圖形處理單元,而不是CPU,這樣可以使CPU從繁重的幾何計算和畫素的處理中解脫出來了。這就加大了處理的速度。下面的這篇教程是轉載的。原文地址如下,感謝作者ma

OpenGL ES 2.0 著色語言

OpenGL 著色器中使用的是著色語言GLSL。著色語言源自C語言,提供了豐富的原生型別,如向量、矩陣等,還有大量的內建函式,這在處理3D圖形時可以更加高效、易用。下面是整理的是OpenGL ES2.0的GLSL語言。 基本資料型別 標量 GLSL中的

GLSL著色語言)中的內建函式

x*y: 如果x和y都是向量,那麼該運算子進行的是逐分量的相乘計算;如果是矩陣相乘,那麼該運算子會返回一個線性相乘(線性代數中正常的矩陣乘法)的矩陣,而不是一個逐分量的相乘結果(如果想得到的是逐分量的相乘結果,那就需要使用matrixCompMult函式)。 dot(x,y

怎麼在Android Studio 編輯OpenGL著色語言GLSL)時關鍵字高亮智慧提示

    前言:      最近在學習OpenGL開發,OpenGL著色器語言(以下使用GLSL代替)開發,但是Android Studio中不支援關鍵字高亮和智慧提示,所以就想有沒有一款類似IDE的編輯器來寫GLSL程式碼。一通的百度,發現大部分都是在VS中對其提供外掛支援

OpenGL ES著色語言----------------儲存修飾符

可執行程序 函數參數 匹配 技術分享 預處理 但是 不變 基本 打包 一、存儲修飾符   本地變量只能使用存儲修飾符const。   函數參數只能用const。函數返回值類型和結構體字段不要使用const。 從一個運行時著色器到下一個運行時著色器之間進行數據

OpenGL 著色語言基礎

資料型別概述: 標量 :也被稱為“無向量”其值只有大小,並不具有方向。 向量:有方向的量叫做向量。OpenGLES著色語言中,向量可以看做是用同樣型別的標量組成,其基本型別也分為bool、int和float三種。 每個 向量可以由2個、3個、4個相同的標量組成。 1.其

可程式設計渲染管線與著色語言

轉自:http://www.cppblog.com/Leaf/archive/2013/02/22/198015.aspx Programming pipeline & shading language 大家好,今天想給大家介紹一下可程式設計渲染管線和著

DirectX11 高階著色語言HLSL入門

高階著色器語言HLSL入門 1. 資料型別簡介 與CPU不同,在顯示卡晶片中,最小的資料吞吐單元是一個由32位浮點陣列成的四元組。這一點很有道理不是,想想你在渲染過程中所有涉及到的資料,最複雜的不外乎四維座標(x,y,z,w)或顏色(r,g,b,a

【OpenGL4.0GLSL-使用Uniform Block實現著色的資料共享

一、在GLSL中使用Uniform Block 在GLSL渲染語言中,我們經常採用緩衝區來儲存Uniform型的Block。 比如我們需要繪製下面這樣的效果: 在這裡我們繪製了一個圓,圓內部顏色和外部顏色不同,而且邊緣部分,顏色是平滑過渡的。 我們這樣來實現這一效果: 首

06 WebGL 著色程式語言GLSL ES的陣列

GLSL ES支援陣列型別。與JavaScript中的陣列不同的是,GLSL ES只支援一維陣列,而且陣列物件不支援pop()和push()等操作,建立陣列時也不需要使用new運算子。宣告陣列很簡單,值需要在變數名後加上中括號([])和陣列的長度。比如: float

14 WebGL 著色程式語言GLSL ES的預處理指令

GLSL ES支援預處理指令。預處理指令用來在真正編譯之前對程式碼進行預處理,都以井號(#)開始。下面就是我們曾使用的預處理指令。 #ifdef GL_ES precision mediump float; #endif這段程式碼檢查了是否已經定義了GL_ES巨集,

OpenGLES3.0創建著色步驟

進行 通知 obj com compile 著色器 鏈接 chsh 編譯 需要創建著色器對象和程序對象。著色器對象相當於c語言的編譯器(為源代碼生成目標代碼,例如.obj或.o文件)程序對象相當於c語言的鏈接程序(將對象文件鏈接為最後的程序)創建步驟:1 創建頂點著色器對象

OpenGLES3.0創建和編譯著色相關語法

false 程序 日誌信息 保存 get 如果 b- ade fragment // 創建著色器,返回句柄GLuint glCreateShader(GLenum type)type: GL_VERTEX_SHADER GL_FRAGMENT_SHADER // 刪除著色器

android平臺下OpenGL ES 3.0著色語言基礎知識(下)

OpenGL ES 3.0學習實踐 android平臺下OpenGL ES 3.0從零開始 android平臺下OpenGL ES 3.0繪製純色背景 android平臺下OpenGL ES 3.0繪製圓點、直線和三角形 android平臺下OpenGL E

Shader2.0-頂點著色應用:波浪的實現

Shader中波浪的實現主要在於根據時間改變頂點著色器的頂點資訊,根據三角函式t=asin(bx+c)即可實現,具體見程式碼: Shader "Hidden/TestStruct" { Properties { _MainTex ("Texture", 2D) = "white" {

GLSL著色實現多重紋理與幀緩衝物件(FBO)

還記得我前面幾篇部落格上寫的東西都是將紋理直接渲染到螢幕上,就是產生一個和紋理尺寸大小相同的視窗進行渲染,那麼渲染完了就正好完整的顯示了紋理圖案。但是在做數值計算的時候,一般是不需要輸出到螢幕上的,這就是今天我們要用到的幀快取。有了幀快取,我們的輸出不需要是螢幕了,而是直

OpenGL ES 2.0——頂點著色Vertex Shader

        在上篇文章中,我們提到了OpenGL ES 2.0中的兩個非常重要的著色器,它們分別是頂點著色器和片元著色器,那麼我們接下來的學習內容就從這兩個著色器開始。在此之前,我們可以先來看一下

WebGL glsl fragment 著色實現的紋理動畫: 神祕海洋

glsl程式碼:this.vshdCode = "precision mediump float;" +"attribute vec3 a_vtx_pos;" +"attribute vec2 a_vtx_uv;"

最簡單的幾何著色(Geometry Shader)【OpenGL】【GLSL

以繪製模型的法線的為例,效果如圖:Torus:Dragon:關鍵程式碼如下:1.頂點著色器 static const char * vs_source[] = { "#version 410 core

OpenGL ES 3.0 簡單的頂點和片段著色

char fShaderStr[] = 1、 "#version 300 es \n" 2、 "precision mediump float; \n" 3、 "out vec4 fragColor;