基礎(chǔ)圖形管線
OpenGL 中的圖元只是頂點(diǎn)的?何以及預(yù)定義的?式結(jié)合在?起。
管線分為2個(gè)部分,上半部分是客戶端,下半部分為服務(wù)器端。
服務(wù)器端和客戶端是功能和運(yùn)?上都是異步,它們是各?獨(dú)?的軟件塊和硬件塊恕汇。
- 三種向OpenGL 著?器傳遞渲染數(shù)據(jù)的?法
Texture Data :紋理數(shù)據(jù)
Uniforms:通過設(shè)置Uniform 變量就緊接著發(fā)送?個(gè)圖元批次處理命令
Attributes:屬性,對(duì)?個(gè)頂點(diǎn)都要作出改變的數(shù)據(jù)元素 - 渲染過程,必備2個(gè)著?器
Vertex Shader: 頂點(diǎn)著色器
Fragment Shader: 片元著色器
投影
-
正投影
視景體外的?何圖形,就會(huì)被裁減掉
所有在這個(gè)空間范圍內(nèi)的所有東?都將被呈現(xiàn)在屏幕上布讹。?
不存在照相機(jī)或視點(diǎn)坐標(biāo)系的概念。
image.png -
透視投影
透視投影會(huì)進(jìn)?透視除法對(duì)距離觀察者很遠(yuǎn)的對(duì)象進(jìn)?縮短和收縮载佳。在投影到屏幕之后炒事,視景體背?與視景體正?的寬度測(cè)量標(biāo)準(zhǔn)不同。
GLFrusmstum::setPerspective(float fFov , float fAspect , float fNear , float fFar)
參數(shù):
fFov:垂直?向上的視場(chǎng)?度
fAspect:窗?的寬度與?度的縱橫?
fNear:近裁剪?距離
fFar:遠(yuǎn)裁剪?距離
縱橫? = 寬(w)/?(h)
image.png
使用著色器
在OpenGL 核?框架中蔫慧,并沒有提供任何內(nèi)建渲染管線挠乳,在提交?個(gè)?何圖形進(jìn)?渲染之前,必須實(shí)現(xiàn)?個(gè)著?器姑躲。
可以使?存儲(chǔ)著?器睡扬。這些存儲(chǔ)著?器由GLTools的C++類GLShaderManager管理。它們能夠滿?進(jìn)?基本渲染的要求黍析。
存儲(chǔ)著?器分類
- 單位著?器(Identity 著?器)
GLShaderManager::UserStockShader(GLT_ATTRIBUTE_VERTEX,GLfloat vColor[4]);
只是簡(jiǎn)單地使?默認(rèn)笛卡爾坐標(biāo)系(坐標(biāo)范圍(-1.0卖怜,1.0)),所有的?段都應(yīng)?同?種顏?,?何圖形為 實(shí)?和未渲染的阐枣。
需要設(shè)置存儲(chǔ)著?器?個(gè)屬性GLT_ATTRIBUTE_VERTEX(頂點(diǎn)分量)
參數(shù)2:vColor[4],你需要的顏?
- 平?著?器
GLShaderManager::UserStockShader(GLT_SHADER_FLAT,GLfloat mvp[1 6],GLfloat vColor[4]);
參數(shù)1:平?著?器
參數(shù)2:允許變化的4*4矩陣
參數(shù)3:顏?
它將統(tǒng)?著?器進(jìn)?了拓展马靠。允許為?何圖形變換指定?個(gè) 4 * 4 變換矩陣。經(jīng)常被稱為“模型視圖投影矩陣”
- 上?著?器
GLShaderManager::UserStockShader(GLT_SHADER_SHADED,GLflot mvp[16]);
在?何圖形中應(yīng)?的變換矩陣蔼两。
需要設(shè)置存儲(chǔ)著?器的 GLT_ATTRIBUTE_VERTEX(頂點(diǎn)分量)和GLT_ATTRIBUTE_COLOR(顏?分量) 2個(gè)屬性甩鳄。顏?值將被平滑插?頂點(diǎn)之間(平滑著?)
- 默認(rèn)光源著?器
GLShaderManager::UserStockShader(GLT_SHADER_DEFAULT_LIGHT,GLfloat mvMatrix[16],GLfloat pMatrix[16],GLfloat vColor[4]);
參數(shù)1:默認(rèn)光源著?器
參數(shù)2:模型視圖矩陣
參數(shù)3:投影矩陣
參數(shù)4:顏?值
這種著?器,是對(duì)象產(chǎn)?陰影和光照的效果额划。需要設(shè)置存儲(chǔ)著?器的 GLT_ATTRIBUTE_VERTEX(頂點(diǎn)分量) 和GLT_ATTRIBUTE_NORMAL(表?法線)
- 點(diǎn)光源著?器
GLShaderManager::UserStockShader(GLT_SHADER_DEFAULT_LIGHT_DIEF,GLfloat mvMatrix[16],GLfloat pMatrix[16],GLfloat vLightPos[3],GLfloat vColor[4]);
參數(shù)1:點(diǎn)光源著?器
參數(shù)2:模型視圖矩陣
參數(shù)3:投影矩陣
參數(shù)4:視點(diǎn)坐標(biāo)光源位置
參數(shù)5:顏?值
點(diǎn)光源著?器和默認(rèn)光源著?器很相似妙啃,區(qū)別在于:光源位置是特定的。同樣需要設(shè)置存儲(chǔ)著?器的 GLT_ATTRIBUTE_VERTEX(頂點(diǎn)分量) 和GLT_ATTRIBUTE_NORMAL(表?法線)。
- 紋理替換矩陣
GLShaderManager::UserStockShader(GLT_SHADER_TEXTURE_REPLACE,GLfloat mvMatrix[16],GLint nTextureUnit);
參數(shù)2:模型視圖投影矩陣
參數(shù)3:紋理單元
著?器通過給定的模型視圖投影矩陣揖赴,使?綁定到 nTextureUnit (紋理單元) 指定紋理單元的紋理對(duì)?何圖形進(jìn)?變化馆匿。?段顏?:是直接從紋理樣本中直接獲取的。需要設(shè)置存儲(chǔ)著?器的GLT_ATTRIBUTE_VERTEX(頂點(diǎn)分量) 和GLT_ATTRIBUTE_NORMAL(表?法線)
- 紋理調(diào)整著?器
GLShaderManager::UserStockShader(GLT_SHADER_TEXTURE_MODULATE,GLfloat mvMatrix[16],GLfloat vColor[4],GLint nTextureUnit);
參數(shù)2:模型視圖投影矩陣
參數(shù)3:基本?
參數(shù)4: 紋理單元
將?個(gè)基本? 乘以 ?個(gè)取?紋理單元 nTextureUnit 的紋理燥滑。需要設(shè)置存儲(chǔ)著?器的 GLT_ATTRIBUTE_VERTEX(頂點(diǎn)分量) 和GLT_ATTRIBUTE_TEXTURE0(紋理坐標(biāo))
- 紋理光源著?器
GLShaderManager::UserStockShader(GLT_SHADER_TEXTURE_POINT_LIGHT_DIEF,GLfloat mvMatrix[16],GLfloat pMatrix[16],GLfloat vLight Pos[3],GLfloat vBaseColor[4],GLint nTextureUnit);
參數(shù)1:紋理光源著?器
參數(shù)2:模型視圖矩陣
參數(shù)3:投影矩陣
參數(shù)4:視覺空間中的光源位置
參數(shù)5:?何圖形的基本?
參數(shù)6:將要使?的紋理單元
將?個(gè)紋理通過漫反射照明計(jì)算機(jī)進(jìn)?調(diào)整(相乘)渐北。光線在視覺空間中的位置是給定的。需要設(shè)置存儲(chǔ)著?器的GLT_ATTRIBUTE_VERTEX(頂點(diǎn)分量) 和GLT_ATTRIBUTE_TEXTURE0(紋理坐標(biāo))突倍、GLT_ATTRIBUTE_NORMAL(表?法線)
- 常用代碼
定義著?器GLShaderMananger shaderMananger;
初始化著?器shaderMananger.initalizeStockShaders();
使?shaderMananger.userStockMananger(參數(shù)列表)
圖元
使用OpenGL在屏幕進(jìn)行繪圖腔稀,我們不關(guān)注物理屏幕坐標(biāo)和像素,關(guān)注的是視景體中位置坐標(biāo)羽历,將這些點(diǎn)焊虏、線、三角形從3D空間投影到屏幕上的2D圖像是由著色器程序和光柵化硬件完成的秕磷。
- 點(diǎn) GL_POINTS
最簡(jiǎn)單的圖形诵闭,一般是占一個(gè)像素大小
//1.修改點(diǎn)的像素大小
glPointSize(4.0f);
// 設(shè)置點(diǎn)的大小范圍,
GLfloat sizes[2] = {2.0f,4.0f};
glSetFloatv(GL_POINT_SIZE_RANGE,sizes);
// 獲取點(diǎn)大小范圍
glGetFloatv(GL_POINT_SIZE_RANGE,sizes);
// 設(shè)置點(diǎn)與點(diǎn)間距
GLfloat step = 1.0f;
glSetFloatv(GL_POINT_GRAULARITY,&step);
// 獲取最小步長(zhǎng)
glGetFloatv(GL_POINT_GRAULARITY,&step);
// 通過程序點(diǎn)大小模式來設(shè)置點(diǎn)大小
glEnable(GL_PROGRAM_POINT_SIZE);
// 這種模式允許我們?cè)陧旤c(diǎn)著色器幾何著色器中通過著色器內(nèi)建變量直接修改
gl_PointSize = 5.0;
- 線 GL_LINES
兩個(gè)頂點(diǎn)繪制成一條線段澎嚣,默認(rèn)1個(gè)像素
// 設(shè)置線段的寬度
glLineWidth(2.5f);
線帶 GL_LINE_STRIP
將頂點(diǎn)依次連接起來形成線帶線環(huán) GL_LINE_LOOP
額外增加一條疏尿,將線帶閉合成環(huán)三角形 GL_TRIANGLES
最簡(jiǎn)單的實(shí)體多邊形,OpenGL中支持的唯一一種多邊形易桃,光柵化硬件最歡迎三角形褥琐。-
環(huán)繞
image.png
OpenGL 默認(rèn)逆時(shí)針環(huán)繞為正面,順時(shí)針環(huán)繞為反面
// 定義前向和背向
glFrontFace(GL_CCW)
// GL_CCW:逆時(shí)針為前向
// GL_CW : 順時(shí)針為前向
三角帶 GL_TRIANGLE_STRIP
三個(gè)頂點(diǎn)繪制成一個(gè)三角形晤郑,然后每增加一個(gè)頂點(diǎn)可以再繪制一個(gè)三角形敌呈,形成三角帶,使用GL_TRIANGLE_STRIP圖元三角形扇 GL_TRIANGLE_FAN
第一個(gè)頂點(diǎn)V0構(gòu)建三角形扇的原點(diǎn)造寝,用前三個(gè)頂點(diǎn)指定最初的三角形磕洪,之后的每個(gè)頂點(diǎn)都和原點(diǎn)以及Vn-1的頂點(diǎn)構(gòu)成一個(gè)三角形,使用GL_TRIANGLE_FAN
(本文為學(xué)習(xí)筆記诫龙,相關(guān)資料來自CC老師)