摘要:在很久很久以前,使用的時候,只能在默認(rèn)的繪制的緩沖區(qū)上面使用,而不能在幀緩沖區(qū)上面實現(xiàn),更加形象的說就是不能用于離屏渲染。下面是該函數(shù)的簽名該函數(shù)的作用就是,把一個幀緩沖區(qū)上的指定區(qū)域像素轉(zhuǎn)移給另外一個幀緩沖區(qū)上的指定區(qū)域。
在很久很久以前,盤古開辟了天地,他的頭頂著天,腳踩著地,最后他掛了。他的毛發(fā)變成了森林,他的血液變成了河流,他的肌肉變成了大地。。。。。。
卡!
哦,不對,在很久很久以前,你屬于我,我擁有你。
你還有沒有程序員的自我修養(yǎng)啦。
不好意思,串戲了,下面進(jìn)入。。。主題
本文適合對webgl、計算機(jī)圖形學(xué)、前端可視化感興趣的讀者。
在很久很久以前,使用WebGL1的時候,只能在默認(rèn)的繪制的緩沖區(qū)上面使用MSAA,而不能在幀緩沖區(qū)上面實現(xiàn),更加形象的說就是:MSAA不能用于離屏渲染。
如果需要在幀緩沖區(qū)(離屏渲染)上面實現(xiàn)去鋸齒效果,需要在貼圖內(nèi)容上使用自己實現(xiàn)的post -process的AA,比如:
FXAA: https://github.com/mattdesl/g...
SMAA http://threejs.org/examples/#...
而且在WebGL1中,不能通過上下文來改變MSAA的采樣數(shù)量,這對于WebGL1下的去鋸齒效果有很大影響。
多采樣渲染緩沖對象在WebGL2中,有了一個新的特性,叫做Multisampled Renderbuffer,恩,中文呢就叫做: 多采樣渲染緩沖對象吧;通過多采樣渲染緩沖對象,可以在幀緩沖區(qū)的渲染緩沖對象上實現(xiàn)MSAA(multisampled antialiasing), 然后通過下面的流程實現(xiàn)最終實現(xiàn)渲染的去鋸齒:
?`
pre-z pass –> rendering pass to FBO –> postprocessing pass –> render to window
##renderbufferStorageMultisample 和多采樣渲染緩沖對象相關(guān)的一個重要的函數(shù)就是gl.renderbufferStorageMultisample,下面是函數(shù)的簽名:
gl.renderbufferStorageMultisample(target, samples, internalFormat, width, height);
該函數(shù)的第一個target是渲染緩沖對象的“目標(biāo)”,samples表示采樣數(shù),internalFormat表示數(shù)據(jù)格式,width、height表示渲染緩沖對象的寬高。 下面是使用該函數(shù)的簡單代碼片段:
var frameBuffer = gl.createFrameBuffer();
var colorRenderbuffer = gl.createRenderbuffer();
gl.bindRenderbuffer(gl.RENDERBUFFER, colorRenderbuffer);
gl.renderbufferStorageMultisample(gl.RENDERBUFFER, 4, gl.RGBA8, FRAMEBUFFER_SIZE.x, FRAMEBUFFER_SIZE.y);
gl.bindFramebuffer(gl.FRAMEBUFFER, frameBuffer);
gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, colorRenderbuffer);
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
這和webgl1 中創(chuàng)建幀緩沖區(qū)的代碼類似,并沒有太大差別,不同的是如下一行:
gl.renderbufferStorageMultisample(gl.RENDERBUFFER, 4, gl.RGBA8, FRAMEBUFFER_SIZE.x, FRAMEBUFFER_SIZE.y);
通過gl.renderbufferStorageMultisample方法指定了渲染緩沖對象的多重采樣,采樣數(shù)是4。 #多采樣紋理附件 多采樣紋理附件又是什么東西呢,好吧,其實在WebGL2中,沒有這個多采樣紋理附件,在OPENGL才有,為什么提到這個多采樣紋理附件,大部分時間,我們的離屏渲染都需要渲染到一個紋理對象上面,才能進(jìn)一步使用。 在沒有多采樣紋理附件,只有多采樣渲染緩沖對象的情況下,要實現(xiàn)MSAA,只能渲染到渲染緩沖對象上,但是渲染緩沖對象的內(nèi)容不能直接傳遞給紋理對象。 那么應(yīng)該怎么做呢? 需要使用另外一個重要的函數(shù): ##gl.blitFramebuffer函數(shù) 通過gl.blitFramebuffer函數(shù),可以把多采樣渲染緩沖對象的內(nèi)容傳遞給紋理對象。下面是該函數(shù)的簽名:
gl.blitFramebuffer(srcX0, srcY0, srcX1, srcY1,
dstX0, dstY0, dstX1, dstY1, mask, filter);
該函數(shù)的作用就是,把一個幀緩沖區(qū)(read framebuffer)上的指定區(qū)域像素轉(zhuǎn)移給另外一個幀緩沖區(qū)(draw framebuffer)上的指定區(qū)域。 其中參數(shù)srcX0, srcY0, srcX1, srcY1指定read framebuffer上的區(qū)域; dstX0, dstY0, dstX1, dstY1 指定draw framebuffer上的區(qū)域; mask指定那個buffer的內(nèi)容會被copy,可選值: * gl.COLOR_BUFFER_BIT * gl.DEPTH_BUFFER_BIT * gl.STENCIL_BUFFER_BIT filter 表示當(dāng)兩個區(qū)域大小不同的時候,插值的方式,可以是以下值: * gl.NEAREST * gl.LINEAR 下面是代碼片段:
var renderableFramebuffer = gl.createFramebuffer();
......
var colorFramebuffer = gl.createFramebuffer();
var texture = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, texture);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, FRAMEBUFFER_SIZE.x, FRAMEBUFFER_SIZE.y, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
gl.bindTexture(gl.TEXTURE_2D, null);
gl.bindFramebuffer(gl.FRAMEBUFFER, colorFramebuffer);
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
// ...
// After drawing to the multisampled renderbuffers
gl.bindFramebuffer(gl.READ_FRAMEBUFFER, renderableFramebuffer);
gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, colorFramebuffer);
gl.clearBufferfv(gl.COLOR, 0, [0.0, 0.0, 0.0, 1.0]);
gl.blitFramebuffer(
0, 0, FRAMEBUFFER_SIZE.x, FRAMEBUFFER_SIZE.y, 0, 0, FRAMEBUFFER_SIZE.x, FRAMEBUFFER_SIZE.y, gl.COLOR_BUFFER_BIT, gl.NEAREST
);
代碼中,首先把場景渲染到renderableFramebuffer中,然后把renderableFramebuffer綁定到目標(biāo)gl.READ_FRAMEBUFFER,把colorFramebuffer綁定到目標(biāo)gl.DRAW_FRAMEBUFFER,之后清空DRAW_FRAMEBUFFER上面的顏色關(guān)聯(lián)對象,然后調(diào)用gl.blitFramebuffer方法把renderableFramebuffer的顏色關(guān)聯(lián)對象上的數(shù)據(jù)復(fù)制到colorFramebuffer的顏色管理對象,colorFramebuffer的顏色關(guān)聯(lián)對象是一個紋理對象,這樣就把數(shù)據(jù)從渲染緩沖對象復(fù)制到紋理對象上面了。 ##READ_FRAMEBUFFER和DRAW_FRAMEBUFFER 在webgl1中,幀緩沖區(qū)的對象的目標(biāo)只能是gl.FRAMEBUFFER,而在WebGL2中,增加兩種目標(biāo): * gl.READ_FRAMEBUFFER * gl.DRAW_FRAMEBUFFER 以上兩種目標(biāo)分別表示FBO可以分別進(jìn)行讀操作和寫操作;這在FBO復(fù)制到FBO的時候很有用,就像前文中所敘述的,可以把READ_FRAMEBUFFER上的數(shù)據(jù)復(fù)制到DRAW_FRAMEBUFFER上。 #參考 https://github.com/mrdoob/three.js/pull/8120 https://developer.mozilla.org/en-US/docs/Web/API/WebGL2RenderingContext/blitFramebuffer https://developer.mozilla.org/en-US/docs/Web/API/WebGL2RenderingContext/blitFramebuffer http://www.realtimerendering.com/blog/webgl-2-new-features/ https://www.khronos.org/registry/webgl/specs/latest/2.0/#2.2 歡迎關(guān)注公眾號“ITman彪叔”。彪叔,擁有10多年開發(fā)經(jīng)驗,現(xiàn)任公司系統(tǒng)架構(gòu)師、技術(shù)總監(jiān)、技術(shù)培訓(xùn)師、職業(yè)規(guī)劃師。熟悉Java、JavaScript、Python語言,熟悉數(shù)據(jù)庫。熟悉java、nodejs應(yīng)用系統(tǒng)架構(gòu),大數(shù)據(jù)高并發(fā)、高可用、分布式架構(gòu)。在計算機(jī)圖形學(xué)、WebGL、前端可視化方面有深入研究。對程序員思維能力訓(xùn)練和培訓(xùn)、程序員職業(yè)規(guī)劃有濃厚興趣。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/105668.html
摘要:實例化數(shù)組實例化是一種只調(diào)用一次渲染函數(shù)卻能繪制出很多物體的技術(shù),它節(jié)省渲染一個物體時從到的通信時間。實例化如果能夠講數(shù)據(jù)一次性發(fā)送給,然后告訴使用一個繪制函數(shù),繪制多個物體,就會更方便。因此可以看出減少了繪制的遍歷。 實例化數(shù)組 實例化是一種只調(diào)用一次渲染函數(shù)卻能繪制出很多物體的技術(shù),它節(jié)省渲染一個物體時從CPU到GPU的通信時間。實例數(shù)組是這樣的一個對象,使用它,可以把原來的的un...
摘要:管線優(yōu)化管線優(yōu)化曲面細(xì)分期間消除子像素。然而,高級別的曲面細(xì)分可以產(chǎn)生子像素三角形,這導(dǎo)致光柵化利用率降低。另外,如果合并或批處理之后的物體包圍盒過大,反而會造成性能下降,因為無法有效使用遮擋剔除等技術(shù)進(jìn)行剔除。? 目錄 12.6 移動端渲染優(yōu)化 12.6.1 渲染管線優(yōu)化 12.6.1.1 使用新特性 12.6.1.2 管線優(yōu)化 ...
閱讀 2997·2021-10-19 11:46
閱讀 989·2021-08-03 14:03
閱讀 2949·2021-06-11 18:08
閱讀 2921·2019-08-29 13:52
閱讀 2774·2019-08-29 12:49
閱讀 493·2019-08-26 13:56
閱讀 934·2019-08-26 13:41
閱讀 857·2019-08-26 13:35