五、OpenGL初探之OpenGL渲染基礎(OpenGL圖元/固定管線下的着色器)

初識OpenGL的開發者須要先要學會固定管線的渲染流程和思路,爲以後學習可編程管線以及編寫GLSL着色器程序打好基礎,固定管線和可編程管線的區別只在於着色器程序的區別,其餘的業務邏輯基本一致,好了,解釋完了,開始上乾貨概念部分編程

一、OpenGL固定管線下的多種存儲着色器介紹
二、OpenGL圖元
三、OpenGL點/線/三角形
四、OpenGL工具類GLBatch的使用
複製代碼

1、OpenGL固定管線的存儲着色器介紹


固定管線下,咱們須要使用到一個類GLShaderManager(着色器管理者),下面咱們來學習一下GLShaderManager的初始化數組

//定義全局變量
GLShaderManager shaderManager;

//在OpenGL環境配置完成後開始初始化
shaderManager.InitializeStockShaders();

複製代碼

介紹完GLShaderManager初始化以後,咱們來學習一下固定管線下的存儲着色器,使用固定管線下的存儲着色器的時候,你不須要知道哪些工做是頂點着色器來完成,哪些工做是由片元着色器完成,該使用哪一個通道進行傳值,你只須要學會使用對應的API把須要的入參傳入進去就好了,剩下的交給它,它已經封裝好了這些功能。bash

先說明一下,在OpenGL裏面咱們使用任何固定管線,都是使用這一個函數,不一樣的着色器類型,僅僅是對應着色器的參數不相同而已函數

shaderManager.UseStockShader(<#GLT_STOCK_SHADER nShaderID, ...#>)

複製代碼

接下來咱們開始着色器的學習:工具

一、單元着色器性能

使用場景:繪製默認OpenGL座標系(-1,1)下的圖形,圖形的全部片斷都會以一種顏色填充學習

API函數:ui

GLShaderManager::UserStockShader(GLT_SHADER_IDENTITY,GLfloat vColor[4]);

參數1:存儲着色器種類-單元着色器GLT_SHADER_IDENTITY
參數2:一維顏色數組,下標分別對應RGBA

複製代碼

二、平面着色器spa

使用場景:在繪製圖形時,能夠應用變換,例如仿射變換(投影/模型)變化3d

API函數:

GLShaderManager::UserStockShader(GLT_SHADER_FLAT,GLfloat mvp[16],GLfloat vColor[4]);

參數1:存儲着色器種類-平面着色器GLT_SHADER_FLAT
參數2:容許變化的4*4矩陣
參數3:一維顏色數組,下標分別對應RGBA

複製代碼

三、上色着色器

使用場景:在繪製圖形時,能夠應用變化(仿射變換,例如投影/模型變化)顏色將會平滑的插入到頂點之間稱爲平滑着色.

API函數:

GLShaderManager::UserStockShader(GLT_SHADER_SHADED,GLfloat mvp[16]);

參數1:存儲着色器種類-上色着色器GLT_SHADER_SHADED
參數2:容許變化的4*4矩陣

複製代碼

四、默認光源着色器

使用場景:在繪製圖形時,能夠應用變化(仿射變換,例如投影/模型變化)這種着色器會使繪製的圖形產生陰影和光照效果(平行光)。

API函數:

GLShaderManager::UserStockShader(GLT_SHADER_DEFAULT_LIGHT,GLfloat mvMatrix[16],GLfloat pMatrix[16],GLfloat vColor[4]);

參數1:存儲着色器種類-默認光源着色器GLT_SHADER_DEFAULT_LIGHT
參數2:模型4*4矩陣
參數3:投影4*4矩陣
參數4:顏色值(注意:繪製這個圖形的顏色,不是光的顏色)

複製代碼

五、點光源着色器

使用場景:在繪製圖形時,能夠應用變化(仿射變換,例如投影/模型變化)這種着色器會使繪製的圖形產生陰影和光照效果(平行光)。它與默認光源着色器很是相似,區別只是光源的位置多是特定的。

API函數:

GLShaderManager::UserStockShader(GLT_SHADER_POINT_LIGHT_DIEF,GLfloat mvMatrix[16],GLfloat pMatrix[16],GLfloat vLightPos[3],GLfloat vColor[4]);

參數1:存儲着色器種類-點光源着色器GLT_SHADER_POINT_LIGHT_DIEF
參數2:模型4*4矩陣
參數3:投影4*4矩陣
參數4:點光源的位置(x,y,z)由於光源不須要w(奇次座標,通俗稱縮放因子)
參數5:漫反射顏色值

複製代碼

六、紋理替換矩陣着色器

使用場景:在繪製圖形時,能夠應用變化(投影/模型變化)這種着色器經過給定的模型視圖投影矩陣.使用紋理單元來進行顏色填充,其中每個像素點的顏色值是從紋理中獲取.

API函數:

GLShaderManager::UserStockShader(GLT_SHADER_TEXTURE_REPLACE,GLfloat mvMatrix[16],GLint nTextureUnit);

參數1:存儲着色器種類-紋理替換矩陣着色器GLT_SHADER_TEXTURE_REPLACE
參數2:模型4*4矩陣
參數3:紋理單元

複製代碼

七、紋理調整着色器

使用場景:在繪製圖形時,能夠應用變化(投影/模型變化)這種着色器經過給定的模型視圖投影矩陣.着色器將一個基本色乘以一個取自紋理單元nTextureUnit的紋理,將顏色與紋理進行顏色混合後才填充到片斷中.

API函數:

GLShaderManager::UserStockShader(GLT_SHADER_TEXTURE_MODULATE,GLfloat mvMatrix[16],GLfloat vColor[4],GLint nTextureUnit);

參數1:存儲着色器種類-紋理調整着色器GLT_SHADER_TEXTURE_MODULATE
參數2:模型4*4矩陣
參數3:顏色值
參數4:紋理單元

複製代碼

八、紋理光源着色器

使用場景:在繪製圖形時,能夠應用變化(投影/模型變化)這種着色器經過給定的模型視圖投影矩陣.着色器將一個紋理經過漫反射照明計算進行調整(相乘).

API函數:

GLShaderManager::UserStockShader(GLT_SHADER_TEXTURE_POINT_LIGHT_DIEF,G Lfloat mvMatrix[16],GLfloat pMatrix[16],GLfloat vLightPos[3],GLfloat vBaseColor[4],GLint nTextureUnit);

參數1:存儲着色器種類-紋理光源着色器GLT_SHADER_TEXTURE_POINT_LIGHT_DIEF
參數2:模型4*4矩陣
參數3:投影4*4矩陣
參數4:點光源的位置
參數5:顏色值(幾何圖形的基本色)
參數6:紋理單元

複製代碼

2、OpenGL基本圖元


OpenGL經常使用的7種基本圖元及圖元描述分別以下表

OpenGL7種圖元.png

其中最受歡迎的是三角形GL_TRIANGLES,由於三角形理論上是能夠繪製任何圖形的。

下面是這6種的示例圖(備註:GL_POINTS點的就不畫了)

OpenGL圖元圖示.png

3、OpenGL點/線/三角形及三角形的環繞方式


一、最簡單也是最經常使用的方法glPointSize

glPointSize(<#GLfloat size#>);

參數1:表示點的大小

例如:
glPointSize(4.0f);

複製代碼

二、設置點的大小範圍和點與點之間的間隔,獲取點大小範圍和最小步長

GLfloat sizes[2] = {2.0f, 8.0f};
GLfloat step = 1.0f;
    
glGetFloatv(GL_POINT_SIZE_RANGE, sizes);
glGetFloatv(GL_POINT_SIZE_GRANULARITY, &step);

複製代碼

三、經過使用程序點大小模式來設置點的大小,這種模式下容許咱們經過編程在頂點着色器或者幾何着色器中設置點的大小。着色器內建變量gl_PointSize,而且能夠在着色器源碼中直接寫.

glEnable(GL_PROGRAM_POINT_SIZE);

gl_PointSize = 5.0

複製代碼

四、設置線段寬度

glLineWidth(<#GLfloat width#>)

參數1:線段寬度

例如:
glLineWidth(3.f);

複製代碼

五、對於OpenGL光柵化最受歡迎的就是三角形,3個頂點就能構成一個三角形,三角形的類型(形狀)取決於3個頂點的鏈接方式和頂點座標,例如並非全部的三角形都是正三角形,三角形的鏈接方式是GL_TRIANGLES,能夠參考圖元那張圖中的GL_TRIANGLES

六、三角形的環繞方式

參考上面OpenGL圖元那張圖中的GL_TRIANGLES

在繪製第一個三⻆角形時,線條是按照從A0->A1->A2->A0鏈接起來的,造成一個閉合三角形。 三角形A0A1A2這個是沿着頂點逆時針方向,而三角形A3A4A5這個三角形是顏色頂點順時針方向的。這種順序與方向結合來指定頂點的⽅式稱爲環繞。

默認狀況下,OpenGL認爲具備逆時針方向環繞的多邊形爲正面.這就意味着三角形A0A1A2是正面,而三角形A3A4A5這個是反面.

七、三角形帶及三角形帶的優勢

對於不少表面或者形狀而言,咱們會須要繪製幾個相連的三角形. 這時咱們可使用GL_TRIANGLE_STRIP 圖元繪製⼀串串相連的三角形,從而節省大量的時間.如上面OpenGL圖元圖片中的GL_TRIANGLE_STRIP

三角形帶的優勢:

三角形帶的優勢:

一、用前3個頂點指定第1個三角形以後,對於接下來的每個三角形,只須要再指定1個頂點。須要繪製⼤量的三角形時,採用這種⽅法能夠節省大量的程序代碼和數據存儲空間

二、提供運算性能和節省帶寬。更少的頂點意味着數據從內存傳輸到圖形卡的速度更快,而且頂點着色器須要處理的次數也更少了。

複製代碼

八、三角形扇

對於不少表⾯或者形狀而言,咱們會須要繪製幾個相連的三⻆形. 這時咱們可使⽤GL_TRIANGLE_FAN 圖元繪製⼀組圍繞⼀箇中心點相連的三角形,如上面OpenGL圖元圖片中的GL_TRIANGLE_FAN

4、OpenGL工具類GLBatch的經常使用API的使用


GLBatch 俗稱批次類,是在GLTools中包含的一個簡單的容器類.經常使用的API以下:

一、設置圖元,頂點數和紋理座標(紋理座標可選)

void GLBatch::Begain(GLeunm primitive,GLuint nVerts,GLuint nTexttureUnints = 0);

參數1:圖元
參數2:頂點數
參數3:一組或者兩組紋理座標(可選參數)

複製代碼

二、複製頂點數據(一個由3份量x,y,z頂點組成的一維數組)

void GLBatch::CopyVerterxData3f(GLfloat *vVerts);

參數1:3份量頂點數組,表明(x,y,z)

複製代碼

三、複製表面法線數據

void GLBatch::CopyNormalDataf(GLfloat *vNorms);

參數1:法線

複製代碼

四、複製顏色數據

void GLBatch::CopyColorData4f(GLfloat *vColors);

參數1:RGBA顏色值數組

複製代碼

五、複製紋理座標數據

void GLBatch::CopyTexCoordData2f(GLFloat *vTextCoords, GLuint uiTextureLayer);

複製代碼

六、結束數據複製

void GLBatch::End(void);

複製代碼

七、繪製圖形

void GLBatch::Draw(void);

複製代碼

下一節,咱們會使用固定存儲着色器作一下多種圖元組合實現,今天就到這裏啦~

相關文章
相關標籤/搜索