国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

OpenGL的渲染流程梳理

2019-11-09 18:30:22
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

渲染可以拆分為多個(gè)步驟(stage),拆分之后,就可以使用管道(pipeline)來(lái)優(yōu)化執(zhí)行效率。打個(gè)比方,過安檢的時(shí)候,至少有三個(gè)步驟,把包放在傳送帶上,然后走過去,取回傳送帶上的包。在排隊(duì)過安檢的過程中,排在后面的旅客并不需要等前面的旅客完成,只要前面的旅客把包放上傳送帶(完成第一個(gè)步驟),后面的旅客就可以接著把包放在傳送帶,這就是管道原理。

Step1 準(zhǔn)備頂點(diǎn)數(shù)據(jù)(vertex specification)。對(duì)于現(xiàn)在使用硬件加速的渲染技術(shù),這個(gè)步驟是在CPU上完成的。如果要渲染一個(gè)三角形,這一步需要幾個(gè)信息:三個(gè)點(diǎn)的位置和頂點(diǎn)顏色、以及繪制對(duì)象:“三角形”。

以下這段代碼是個(gè)人隨手而寫,并非真的OpenGL代碼,只是用來(lái)描述Step1。

var glState = OpenGLState.getInstance();var arrbuf = new ArrayBuffer();//new a array buffer to store the data//vertex positionarrbuf.push({0, 1});arrbuf.push({-0.5, 0});arrbuf.push({0.5, 1});//vertex colorarrbuf.push({255, 0, 0});arrbuf.push({0, 255, 0});arrbuf.push({0, 0, 255});var vertextArr = new VertexArray(arrbuf);vertextArr.setAttr1(0, 2);//attr1 for positionvertextArr.setAttr1(3, 5);//attr2 for colorglState.vertextArr = vertextArr;var vertextShader = new Shader("your vertex shader code");glState.vertextShader = vertextShader;var fragShader = new Shader("your fragShader");glState.fragShader = fragShader;// other Operation to configure glStateglState.run();// the run call will trigger the gl render stages blow

Step2 處理頂點(diǎn)(vertex PRocessing),根據(jù)每個(gè)頂點(diǎn)的數(shù)據(jù)(在前一步指定了),以及一些常量(uniform)(在前一步指定了),進(jìn)行一次分析處理,例如,是否需要對(duì)每個(gè)頂點(diǎn)的位置做一次位置的變換(transform)(在3D渲染中,變換非常重要)。在可編程(programmable)的渲染管道中,頂點(diǎn)處理可以細(xì)分為三個(gè)可編程的步驟,第一個(gè)小步驟的指令可以vertext shader來(lái)指定,第二個(gè)小步驟叫tessellation,又可以再細(xì)化3個(gè)步驟,由2個(gè)shader加上一個(gè)內(nèi)置的程序(fixed-function)來(lái)控制,第三個(gè)步驟由geometry shader來(lái)控制,第一個(gè)步驟是必須的,后兩個(gè)步驟是可選的。

Step3 頂點(diǎn)的后續(xù)處理(vertex post-processing),上一個(gè)步驟產(chǎn)生的所有頂點(diǎn)信息,會(huì)在這里進(jìn)一步處理。這個(gè)步驟是不可以編程的,所以沒有相應(yīng)的shader,但是可以配置。通過配置,可以實(shí)現(xiàn)transform feedback,前一個(gè)步驟處理完產(chǎn)生的數(shù)據(jù),可以在這一步反饋回CPU。如果不需要繪制到屏幕上,這個(gè)步驟可以中斷。如果不中斷,則會(huì)進(jìn)行裁剪(clipping),打個(gè)比方,原先的三角形,如果有個(gè)點(diǎn)不再可視范圍內(nèi),那么這個(gè)三角形會(huì)被處理成2個(gè)三角形,增加2個(gè)在可視邊界上的頂點(diǎn)。根據(jù)可配置的viewport提供的信息,對(duì)頂點(diǎn)的位置投影(projection)到一個(gè)平面(window space)上,要么做透視處理(perspective),要么做正交處理(orthographic)。

Step4 對(duì)繪制對(duì)象的整合(primitive assembly),將前面產(chǎn)生的頂點(diǎn),根據(jù)第一個(gè)步驟指定的繪制對(duì)象信息,打包成一個(gè)個(gè)的assembly,然后交給下一個(gè)步驟處理。如果第二個(gè)步驟中需要進(jìn)行tessellating,或者需要執(zhí)行g(shù)eometry shader,那么在vertex shader之后,也會(huì)緊接著完成一個(gè)簡(jiǎn)單的”繪制對(duì)象整合”。

Step5 進(jìn)行光柵化處理(rasterization),管道里會(huì)有一個(gè)不可編程的程序稱為rasterizer。所謂光柵化,就是根據(jù)頂點(diǎn)的位置信息,加上分辨率信息,對(duì)渲染對(duì)象所在的一個(gè)包圍盒里(包含繪制對(duì)象的最小的一個(gè)像素矩陣表),凡是判斷到像素格子受到影響,就會(huì)生成一個(gè)fragment信息。這個(gè)fragment信息不一定是整個(gè)像素格子。

Step6 可編程的并且可選的(optional)步驟,交由fragment shader來(lái)處理。這個(gè)步驟的結(jié)果是將顏色、深度等信息輸出,也可以輸出自定義信息。當(dāng)涉及的多重采樣(MSAA),一般情況,shader只會(huì)針對(duì)每個(gè)fragment執(zhí)行一次。但如果在shader中,使用了gl_SampleID,則shader會(huì)針對(duì)每個(gè)采樣執(zhí)行一次。

Step7 對(duì)fragment shader的輸出進(jìn)行最后的處理(per-sample processing)。這一步會(huì)判斷fragment shader的輸出是否有效,如果無(wú)效則忽略,最后會(huì)將最終的顏色寫入framebuffer,或者跟framebuffer相應(yīng)位置的顏色進(jìn)行混合(blend)。其中,判斷輸出是否有效那些子步驟,在新的OpenGL版本中,可以提前到fragment shader處理之前,這種情況的輸入是來(lái)自rasterizer。

參考 [1] Rendering Pipeline Overview


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 宕昌县| 孝感市| 吉安县| 英山县| 永川市| 镇远县| 克东县| 犍为县| 天峻县| 南投县| 富阳市| 易门县| 邳州市| 海原县| 谢通门县| 灵川县| 吕梁市| 井研县| 鹿泉市| 乐昌市| 芒康县| 阿勒泰市| 田林县| 柳州市| 仙桃市| 奉贤区| 手游| 确山县| 鄂州市| 绥中县| 涡阳县| 龙游县| 阳东县| 如东县| 庆云县| 南宁市| 凌源市| 哈密市| 英山县| 北辰区| 河西区|