<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
深度剝離實現之後,似乎會使得走樣嚴重起來。 我意識到,這是因為 剝離這個過程,並沒有什麼講究,只要是深度小於等於就剔除了,這樣很可能就導致了,原本平滑的差值過渡出現了斷層,突變。 簡單的解決辦法就是增頂點數。
一番搜尋weight oit演演算法的demo,但是隻找到了用原生webgl寫的,傳送門。在費了幾個日夜之後,終於看懂了,但是,還要把它用three實現。一般來說,沒有使用編譯的框架,應該可以直接使用原生,但是業務場景不允許。
我當然為此goole了一番,但是隻找到一個教我如何在three裡使用原生Texture的方法, 算是解決了一個困境。
遇到的下一個困境就是,直接用原生的上下文進行一系列緩衝區和紋理的繫結操作是徒勞的, 因為three的renderer.render裡面會有他的一套處理。 到這裡我就意識到了,沒法混用。
比如說,我要修改融合演演算法引數,使用gl.blendFunc
,但是隻要我使用three的renderer.render
,它就會以材質上的相關屬性重設blend,渲染目標也是如此。
至於為什麼不能不用它的渲染器,直接使用gl.draw方法族,那當然是因為,拿不到全部的著色器資料。
所以,結論就是,必須完全使用threejs的方式實現。
先來看原生的使用 , 用的是webgl2,glsl 3.0。 幸好, three用的也是,為此我還納悶了一番。因為我發現three 仍然使用的是glsl 1.0的語法。
要知道,glsl 3.0 裡面移除了 gl_FragColor
這個內建輸出變數,移除了 attribute varrying
關鍵字, 直接使用當然會報錯。
因為,加權深度演演算法用的也是glsl3.0 ,我之前學的是1.0的語法和api,看的時候就有些雲裡霧裡,後來發覺原來版本不對,立即去研究3.0的語法,然後很多問題就迎刃而解了。 可見,搞清楚自己用的api的版本的重要性
three的處理就是起別名, 對於fragment的輸出,glsl 3.0,要求至少定義一個 out 修飾的 四維向量, 如果有多個,最好是用layout指定索引。 直接看程式碼,以片元著色器為例,頂點著色器不用輸出顏色 。
#version 300 es out highp vec4 Ocolor; #define gl_FragColor Ocolor #define varying in
第一行指定版本
第二行定義輸出變數
第三行定義Ocolor的 別名為gl_FragColor
第四行 定義修飾符 in的別名為 varying
知道了3.0的語法特點,再來看oit的程式碼。
在初次繪製的著色器裡 ,宣告輸出變數 顏色和透明度
layout(location=0) out vec4 accumColor; layout(location=1) out float accumAlpha;
宣告兩個紋理,並且和顏色緩衝區繫結,這樣在繪製幀緩衝區時,會把顏色緩衝區的畫素繪製到紋理。 color_attachmentN
就是對應在片元著色器裡宣告的layout (loaction = N) out ve4
accumBuffer = gl.createFramebuffer();// 幀緩衝區唯一 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 將這兩個輸出變數和對應的緩衝區關聯起來。沒錯這個方法只是關聯而已,沒有真的繪製。
gl.drawBuffers([ gl.COLOR_ATTACHMENT0, gl.COLOR_ATTACHMENT1 ]); 還原 gl.bindFramebuffer(gl.FRAMEBUFFER, null);
原生就是這樣實現,繪製之後顏色和透明度就繪製到對應的紋理了。 透明度是float 型別,可直接理解為一維向量。
然後再次繪製的時候就可以用這兩個紋理的資料去修改alpha 使得最終的合成符合他那個公式,我也不理解這個公式,就這樣吧。
我理解了這個演演算法的一套流程,之後就發現文章開頭的問題。我發現blend和 bindframeBuffer的失靈之後,就去搜了一下對應的api ,然後斷點看執行時機。
不知過了多久,也許一瞬,也許半天,我突然意識到,如果threejs實現了drawBuffers的封裝,那麼它必然使用了這個api,我直接搜 drawBuffers
不就行了 。
於是我就發現了,rendertarget必須設定為 multipleRendertarget。 所以我轉而搜這個,於是乎就發現了,有現成的example.
首先當然是範例化,需要傳入紋理的尺寸和輸出變數的數目。
renderTarget = new THREE.WebGLMultipleRenderTargets( window.innerWidth * window.devicePixelRatio, window.innerHeight * window.devicePixelRatio, 2 );
然後在繪製之前設定渲染目標。
renderer.setRenderTarget( renderTarget );
沒了,就這麼多。 至於紋理引數的設定,小細節不拘。
繪製後,就可以把 renderTarget.texture[ N ] 用three的方式傳給著色器。 這裡有一個小點要注意。
renderTarget.texture 沒有複數。
以上就是threejs中使用drawbufferss範例詳解的詳細內容,更多關於threejs使用drawbufferss的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45