一、OpenGL渲染架構(gòu)
只有頂點著色器和片元著色器的代碼才在gpu上運行的规个,像main函數(shù)這些opengl的框架等代碼都是cpu上運行的
openGL渲染流程(轉(zhuǎn)載自收納箱:http://www.reibang.com/p/dc65d6e7ef04)
1凤薛、設(shè)置頂點數(shù)據(jù)和其他參數(shù)姓建。
2、在頂點著色器中進行運算得到裁剪坐標缤苫。
3速兔、細分著色器、幾何著色器活玲,不可自定義涣狗,跳過。
4翼虫、圖元設(shè)置屑柔,根據(jù)設(shè)置構(gòu)成點、線珍剑、三角形掸宛。
5、裁剪招拙,裁剪掉超出顯示區(qū)域的部分唧瘾。
6、光柵化, 將圖源柵格化為一個個的像素點别凤。
7饰序、片元著色器,將對應(yīng)的柵格(像素)填充為具體的顏色规哪。
8求豫、渲染圖像。
參數(shù)傳遞
1诉稍、Attributes:
只能傳遞到vsh(頂點著色器),再通過頂點著色器 - > 片元著色器
頂點數(shù)據(jù)x,y,z,w
光照坐標蝠嘉、投影矩陣、紋理坐標
2杯巨、統(tǒng)一變量Uniforms:
可在任意著色器訪問蚤告,可以理解為全局常量
盡量少改動,頻繁改動的建議使用 Attributes 傳遞
變換矩陣服爷、通道杜恰、顏色值
3、texturedata:紋理數(shù)據(jù)
可以傳向頂點著色器仍源、片元著色器
但是傳遞給頂點著色器沒有意義
3. 參數(shù)的使用
頂點著色器
我們可以通過attrubutes獲取到頂點數(shù)據(jù)心褐,通過uniforms獲取到mvp矩陣,再進行運算得到最終的頂點坐標笼踩。
gl_Position = M_pro * M_view * M_model * V_local
片元著色器
比如在處理視頻幀時檬寂,一般會使用YUV格式。要渲染到屏幕上需要將YUV格式轉(zhuǎn)換為RGB格式戳表。在片元著色器中桶至,通過YUV數(shù)據(jù)進行矩陣運算就可以得到具體的RBG顏色值了昼伴。Alpha通道直接賦值為1.0。
RGB = YUV * 轉(zhuǎn)換矩陣
紋理
像素數(shù)據(jù)镣屹。片元著色器中圃郊,可以通過紋理坐標獲取到對應(yīng)的顏色值。如果對得到的顏色值進行處理女蜈,就可以得到“濾鏡”效果持舆。
二、投影
正投影:在2d坐標系中顯示2d圖形
透視投影:在2d坐標系中顯示3d圖形(遠小近大)
問題圖:
答案c伪窖,正投影和透視投影都可以作為2d/3d圖形的投影
三逸寓、著色器
1、固定著色器
// GLShaderManager 著色器管理類的初始化
?GLShaderManager shaderManager;
shaderManager.InitializeStockShaders();
調(diào)用固定著色器方法
-UserStockShader(...)
2覆山、 各種著色器
紋理替換矩陣著色器:前面將的都是單色的竹伸,這里就有圖案的
紋理光源著色器:有光源、紋理簇宽、顏色混合
四勋篓、openGL圖元連接方式
五、OpenGL 三角形帶
三角形帶:更少的頂點魏割,節(jié)省大量的程序代碼和數(shù)據(jù)空間譬嚣,且速度更快。
三角形扇:需要繪制相連的三角形