最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

threejs中使用drawbufferss示例詳解

 更新時(shí)間:2022年09月05日 16:31:27   作者:莫石  
這篇文章主要為大家介紹了threejs中使用drawbufferss示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

原因

深度剝離實(shí)現(xiàn)之后,似乎會(huì)使得走樣嚴(yán)重起來(lái)。 我意識(shí)到,這是因?yàn)?剝離這個(gè)過(guò)程,并沒(méi)有什么講究,只要是深度小于等于就剔除了,這樣很可能就導(dǎo)致了,原本平滑的差值過(guò)渡出現(xiàn)了斷層,突變。 簡(jiǎn)單的解決辦法就是增頂點(diǎn)數(shù)。

一番搜尋weight oit算法的demo,但是只找到了用原生webgl寫(xiě)的,傳送門(mén)。在費(fèi)了幾個(gè)日夜之后,終于看懂了,但是,還要把它用three實(shí)現(xiàn)。一般來(lái)說(shuō),沒(méi)有使用編譯的框架,應(yīng)該可以直接使用原生,但是業(yè)務(wù)場(chǎng)景不允許。

我當(dāng)然為此goole了一番,但是只找到一個(gè)教我如何在three里使用原生Texture的方法, 算是解決了一個(gè)困境。

遇到的下一個(gè)困境就是,直接用原生的上下文進(jìn)行一系列緩沖區(qū)和紋理的綁定操作是徒勞的, 因?yàn)閠hree的renderer.render里面會(huì)有他的一套處理。 到這里我就意識(shí)到了,沒(méi)法混用。

比如說(shuō),我要修改融合算法參數(shù),使用gl.blendFunc ,但是只要我使用three的renderer.render ,它就會(huì)以材質(zhì)上的相關(guān)屬性重設(shè)blend,渲染目標(biāo)也是如此。

至于為什么不能不用它的渲染器,直接使用gl.draw方法族,那當(dāng)然是因?yàn)?,拿不到全部的著色器?shù)據(jù)。

所以,結(jié)論就是,必須完全使用threejs的方式實(shí)現(xiàn)。

歷程

原生的使用

先來(lái)看原生的使用 , 用的是webgl2,glsl 3.0。 幸好, three用的也是,為此我還納悶了一番。因?yàn)槲野l(fā)現(xiàn)three 仍然使用的是glsl 1.0的語(yǔ)法。

要知道,glsl 3.0 里面移除了 gl_FragColor 這個(gè)內(nèi)置輸出變量,移除了 attribute varrying 關(guān)鍵字, 直接使用當(dāng)然會(huì)報(bào)錯(cuò)。

因?yàn)?,加?quán)深度算法用的也是glsl3.0 ,我之前學(xué)的是1.0的語(yǔ)法和api,看的時(shí)候就有些云里霧里,后來(lái)發(fā)覺(jué)原來(lái)版本不對(duì),立即去研究3.0的語(yǔ)法,然后很多問(wèn)題就迎刃而解了。 可見(jiàn),搞清楚自己用的api的版本的重要性

three的處理就是起別名, 對(duì)于fragment的輸出,glsl 3.0,要求至少定義一個(gè) out 修飾的 四維向量, 如果有多個(gè),最好是用layout指定索引。 直接看代碼,以片元著色器為例,頂點(diǎn)著色器不用輸出顏色 。

#version 300 es
out highp vec4 Ocolor; 
#define gl_FragColor Ocolor 
#define varying in

第一行指定版本

第二行定義輸出變量

第三行定義Ocolor的 別名為gl_FragColor

第四行 定義修飾符 in的別名為 varying

知道了3.0的語(yǔ)法特點(diǎn),再來(lái)看oit的代碼。

基本流程

在初次繪制的著色器里 ,聲明輸出變量 顏色和透明度

 layout(location=0) out vec4 accumColor;   
 layout(location=1) out float accumAlpha;

聲明兩個(gè)紋理,并且和顏色緩沖區(qū)綁定,這樣在繪制幀緩沖區(qū)時(shí),會(huì)把顏色緩沖區(qū)的像素繪制到紋理。 color_attachmentN就是對(duì)應(yīng)在片元著色器里聲明的layout (loaction = N) out ve4

 accumBuffer = gl.createFramebuffer();// 幀緩沖區(qū)唯一      
  gl.bindFramebuffer(gl.FRAMEBUFFER, accumBuffer);
 ......
 var accumTarget = gl.createTexture();
 ......
 gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, accumTarget, 0); 
var accumAlphaTarget = gl.createTexture();
......
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT1, gl.TEXTURE_2D, accumAlphaTarget, 0); 

在js里使用drawbuffer 將這兩個(gè)輸出變量和對(duì)應(yīng)的緩沖區(qū)關(guān)聯(lián)起來(lái)。沒(méi)錯(cuò)這個(gè)方法只是關(guān)聯(lián)而已,沒(méi)有真的繪制。

gl.drawBuffers([ gl.COLOR_ATTACHMENT0, gl.COLOR_ATTACHMENT1 ]);
還原
gl.bindFramebuffer(gl.FRAMEBUFFER, null); 

原生就是這樣實(shí)現(xiàn),繪制之后顏色和透明度就繪制到對(duì)應(yīng)的紋理了。 透明度是float 類(lèi)型,可直接理解為一維向量。

然后再次繪制的時(shí)候就可以用這兩個(gè)紋理的數(shù)據(jù)去修改alpha 使得最終的合成符合他那個(gè)公式,我也不理解這個(gè)公式,就這樣吧。

靈光乍現(xiàn)

我理解了這個(gè)算法的一套流程,之后就發(fā)現(xiàn)文章開(kāi)頭的問(wèn)題。我發(fā)現(xiàn)blend和 bindframeBuffer的失靈之后,就去搜了一下對(duì)應(yīng)的api ,然后斷點(diǎn)看執(zhí)行時(shí)機(jī)。

不知過(guò)了多久,也許一瞬,也許半天,我突然意識(shí)到,如果threejs實(shí)現(xiàn)了drawBuffers的封裝,那么它必然使用了這個(gè)api,我直接搜 drawBuffers不就行了 。

于是我就發(fā)現(xiàn)了,rendertarget必須設(shè)置為 multipleRendertarget。 所以我轉(zhuǎn)而搜這個(gè),于是乎就發(fā)現(xiàn)了,有現(xiàn)成的example.

使用WebGLMultipleRenderTargets

首先當(dāng)然是實(shí)例化,需要傳入紋理的尺寸和輸出變量的數(shù)目。

renderTarget = new THREE.WebGLMultipleRenderTargets(
		window.innerWidth * window.devicePixelRatio,
		window.innerHeight * window.devicePixelRatio,
	2
	);

然后在繪制之前設(shè)置渲染目標(biāo)。

	renderer.setRenderTarget( renderTarget );

沒(méi)了,就這么多。 至于紋理參數(shù)的設(shè)置,小細(xì)節(jié)不拘。

繪制后,就可以把 renderTarget.texture[ N ] 用three的方式傳給著色器。 這里有一個(gè)小點(diǎn)要注意。

renderTarget.texture 沒(méi)有復(fù)數(shù)。

以上就是threejs中使用drawbufferss示例詳解的詳細(xì)內(nèi)容,更多關(guān)于threejs使用drawbufferss的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 微信小程序 出現(xiàn)錯(cuò)誤:{

    微信小程序 出現(xiàn)錯(cuò)誤:{"baseresponse":{"errcode":-80002,"errmsg":""}}解決

    這篇文章主要介紹了微信小程序 出現(xiàn)錯(cuò)誤:{"baseresponse":{"errcode":-80002,"errmsg":""}}解決辦法的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • 使用Sonarqube掃描Javascript代碼的示例

    使用Sonarqube掃描Javascript代碼的示例

    今天小編就為大家分享一篇關(guān)于使用Sonarqube掃描Javascript代碼的示例,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-12-12
  • JavaScript文檔對(duì)象模型DOM

    JavaScript文檔對(duì)象模型DOM

    這篇文章主要介紹了JavaScript文檔對(duì)象模型DOM,當(dāng)網(wǎng)頁(yè)被加載時(shí),瀏覽器會(huì)創(chuàng)建頁(yè)面的文檔對(duì)象模型,通過(guò)可編程的對(duì)象模型,JavaScript 獲得了足夠的能力來(lái)創(chuàng)建動(dòng)態(tài)的 HTML。下面來(lái)看看文章得詳細(xì)內(nèi)容,需要的朋友可以參考一下
    2021-11-11
  • LoadRunner調(diào)用JS加密后登錄實(shí)現(xiàn)

    LoadRunner調(diào)用JS加密后登錄實(shí)現(xiàn)

    這篇文章主要為大家介紹了LoadRunner調(diào)用JS加密后登錄實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • js中的賦值 淺拷貝和深拷貝詳細(xì)

    js中的賦值 淺拷貝和深拷貝詳細(xì)

    js數(shù)據(jù)類(lèi)型主要分基本數(shù)據(jù)類(lèi)型和引用數(shù)據(jù)類(lèi)型。前者包括Number,String等,后者主要是Object,因此以下會(huì)針對(duì)不同的數(shù)據(jù)類(lèi)型來(lái)分析,需要的朋友可以參考一下
    2021-09-09
  • 微信小程序 支付功能實(shí)現(xiàn)PHP實(shí)例詳解

    微信小程序 支付功能實(shí)現(xiàn)PHP實(shí)例詳解

    這篇文章主要介紹了微信小程序 支付功能實(shí)現(xiàn)PHP實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • 微信小程序 表單Form實(shí)例詳解(附源碼)

    微信小程序 表單Form實(shí)例詳解(附源碼)

    這篇文章主要介紹了微信小程序 表單Form實(shí)例詳解的相關(guān)資料,這里對(duì)form 表單進(jìn)行了詳細(xì)介紹,并附實(shí)例代碼,需要的朋友可以參考下
    2016-12-12
  • 微前端qiankun改造日漸龐大的項(xiàng)目教程

    微前端qiankun改造日漸龐大的項(xiàng)目教程

    這篇文章主要為大家介紹了微前端qiankun改造日漸龐大的項(xiàng)目教程示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • 微信小程序 出現(xiàn)47001 data format error原因解決辦法

    微信小程序 出現(xiàn)47001 data format error原因解決辦法

    這篇文章主要介紹了微信小程序 出現(xiàn)47001 data format error原因解決辦法的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • JavaScript 中的文檔對(duì)象模型 DOM

    JavaScript 中的文檔對(duì)象模型 DOM

    DOM,即文檔對(duì)象模型,前端開(kāi)發(fā)工程師必學(xué)的基礎(chǔ)知識(shí),在本文將介紹如何在 HTML 文檔中選擇元素、如何創(chuàng)建元素、如何更改內(nèi)聯(lián) CSS 樣式以及如何監(jiān)聽(tīng)事件,需要的朋友可以參考一下
    2021-10-10

最新評(píng)論

成都市| 博爱县| 康乐县| 左贡县| 铜川市| 万全县| 四子王旗| 建德市| 营口市| 横峰县| 长葛市| 乐都县| 瑞昌市| 藁城市| 鸡东县| 湘潭市| 包头市| 铜陵市| 襄城县| 常宁市| 沂源县| 叙永县| 始兴县| 东乌珠穆沁旗| 聊城市| 沛县| 西丰县| 莎车县| 南宁市| 金湖县| 乐山市| 丽江市| 永川市| 通辽市| 噶尔县| 麻江县| 合江县| 曲阳县| 铜陵市| 大渡口区| 辉南县|