OpenGL基礎(chǔ)渲染

基礎(chǔ)圖形管線

OpenGL 中的圖元只是頂點(diǎn)的?何以及預(yù)定義的?式結(jié)合在?起。
管線分為2個(gè)部分,上半部分是客戶端,下半部分為服務(wù)器端。
服務(wù)器端和客戶端是功能和運(yùn)?上都是異步,它們是各?獨(dú)?的軟件塊和硬件塊恕汇。


image.png
  • 三種向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老師)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末析显,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子签赃,更是在濱河造成了極大的恐慌谷异,老刑警劉巖,帶你破解...
    沈念sama閱讀 223,207評(píng)論 6 521
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锦聊,死亡現(xiàn)場(chǎng)離奇詭異歹嘹,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)括丁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,455評(píng)論 3 400
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來伶选,“玉大人史飞,你說我怎么就攤上這事尖昏。” “怎么了构资?”我有些...
    開封第一講書人閱讀 170,031評(píng)論 0 366
  • 文/不壞的土叔 我叫張陵抽诉,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我吐绵,道長(zhǎng)迹淌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,334評(píng)論 1 300
  • 正文 為了忘掉前任己单,我火速辦了婚禮唉窃,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘纹笼。我一直安慰自己纹份,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,322評(píng)論 6 398
  • 文/花漫 我一把揭開白布廷痘。 她就那樣靜靜地躺著蔓涧,像睡著了一般。 火紅的嫁衣襯著肌膚如雪笋额。 梳的紋絲不亂的頭發(fā)上元暴,一...
    開封第一講書人閱讀 52,895評(píng)論 1 314
  • 那天,我揣著相機(jī)與錄音兄猩,去河邊找鬼茉盏。 笑死,一個(gè)胖子當(dāng)著我的面吹牛厦滤,可吹牛的內(nèi)容都是我干的援岩。 我是一名探鬼主播,決...
    沈念sama閱讀 41,300評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼掏导,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼享怀!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起趟咆,我...
    開封第一講書人閱讀 40,264評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤添瓷,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后值纱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鳞贷,經(jīng)...
    沈念sama閱讀 46,784評(píng)論 1 321
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,870評(píng)論 3 343
  • 正文 我和宋清朗相戀三年虐唠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了搀愧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,989評(píng)論 1 354
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖咱筛,靈堂內(nèi)的尸體忽然破棺而出搓幌,到底是詐尸還是另有隱情,我是刑警寧澤迅箩,帶...
    沈念sama閱讀 36,649評(píng)論 5 351
  • 正文 年R本政府宣布溉愁,位于F島的核電站,受9級(jí)特大地震影響饲趋,放射性物質(zhì)發(fā)生泄漏拐揭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,331評(píng)論 3 336
  • 文/蒙蒙 一奕塑、第九天 我趴在偏房一處隱蔽的房頂上張望堂污。 院中可真熱鬧,春花似錦爵川、人聲如沸敷鸦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,814評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽扒披。三九已至,卻和暖如春圃泡,著一層夾襖步出監(jiān)牢的瞬間碟案,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,940評(píng)論 1 275
  • 我被黑心中介騙來泰國(guó)打工颇蜡, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留价说,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,452評(píng)論 3 379
  • 正文 我出身青樓风秤,卻偏偏與公主長(zhǎng)得像鳖目,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子缤弦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,995評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • 學(xué)習(xí)目標(biāo): OpenGL 渲染結(jié)構(gòu) 如何使用7種OpenGL基礎(chǔ)圖元 如何使用儲(chǔ)存著色器 如何使用Uniform屬...
    velue閱讀 1,874評(píng)論 0 0
  • 一领迈、基礎(chǔ)圖形管線 渲染管線(rendering pipeline),它是一系列數(shù)據(jù)處理過程碍沐,并且將應(yīng)用程序的數(shù)據(jù)轉(zhuǎn)...
    凡幾多閱讀 3,493評(píng)論 6 18
  • 目錄 OpenGL渲染架構(gòu) 投影方式設(shè)置 固定管線解析 OpenGL基本圖元解析 圖元繪制 GLBatch Ope...
    Tobesky閱讀 409評(píng)論 1 0
  • 1狸捅、OpenGL的渲染架構(gòu) OpenGL渲染管線簡(jiǎn)化流程圖 1、 客戶端-服務(wù)器 管線上半部分是客戶端累提,下半部分是...
    小溜子閱讀 353評(píng)論 0 0
  • OpenGL基礎(chǔ)渲染 一尘喝、OpenGL 與 著色器 在OpenGL 3.0之前,OpenGL包含一個(gè)固定功能的管線...
    wjl7004閱讀 424評(píng)論 0 2