WebGL半透明物體的繪製

2022-02-09 08:48:45 字數 2228 閱讀 8488

webgl 中當透明和半透明物體共存時,相關設定不正確的話,物體表面會出現破碎雜亂的斷面,非常影響效果,我們接著就來解決這個問題。

完成的展示demo請看:半透明物體和透明物體共存

讓物體實現半透明效果需要用到顏色的α分量。該功能被稱為a混合(alpha blending) 或 混合 blending,webgl已經內建該功能,但需要開啟,如果只設定了顏色的第四個分量 α 是看不到透明效果的,這第四分量α其實和 css 樣式的 rgba / hsla 顏色模式 中的 α 是一樣的,或者類似 opacity 屬性。必須要執行下面兩個步驟才能看到透明效果:

開啟混合功能:gl.enable(gl.blend)。

指定混合函式:gl.blendfunc(gl.src_alpha, gl.one_minus_src_alpha)。

gl.blendfunc(src_factor, dst_factor)

a混合函式,指定如如何混合兩者的顏色,權重因子的型別多種多樣,引數:

// 混合顏色計算公式: 

《混合後的顏色》 = 《源顏色》 * src_factor + 《目標顏色》 * dst_factor

// 一般半透明效果常用如下形式

gl.blendfunc(gl.src_alpha, gl.one_minus_src_alpha)

權重因子列表

(rs,gs,bs,as) 表示源顏色各分量, (rd,gd,bd,ad) 表示目標顏色的各分量

常量r分量的係數

g分量的係數

b分量的係數

gl.zero

0.00.0

0.0gl.one

1.01.0

1.0gl.src_color

rsgs

bsgl.one_minus_src_color

1-rs

1-gs

1-bs

gl.dst_color

rdgd

bdgl.one_minus_dst_color

1-rd

1-gd

1-bd

gl.src_alpha

asas

asgl.one_minus_src_alpha

1-as

1-as

1-as

gl.dst_alpha

adad

adgl.one_minus_dst_alpha

1-ad

1-ad

1-ad

gl.src_alpha_satureate

min(as,ad)

min(as,ad)

min(as,ad)

實現 a 混合最簡單的方式是遮蔽掉隱藏面消除功能,即去掉 gl.enable(gl.depth_test),但關閉隱藏面消除功能是乙個粗暴的解決方案,並不能滿足實際需求。其實可通過某些機制,同時實現隱藏面消除和半透明效果,步驟如下:

//1.開啟隱藏面消除功能:

gl.enable(gl.depth_test)。

//2.繪製所有不透明的物體(a == 1.0)

//3.鎖定深度緩衝區的寫入操作,使之唯讀 (深度緩衝區用於隱藏面消除):

gl.depthmask(false);

//4.繪製所有半透明的物體 a < 1.0,注意將物體按深度排序,a 最小最先繪製

//5.釋放深度緩衝區,使之可讀可寫:

gl.depthmask(true)

gl.depthmask(mask)

鎖定或釋放深度緩衝區的寫入操作

mask: 鎖定深度緩衝區的寫入操作 false,釋放 true

我們寫個demo來實際演示效果,比如我要繪製8個物體,其中前面4個是非透明的物體,即 α 分量值則為1,剩餘物體的 α 分量分別從 0.1至0.4不等。

for (var i = 0; i < 8; i++) );

}

如果是繪製的物體佇列是無序的,則必須手動排序。但我這裡建立圖形時已經排好序,前4個為不透明物體,剩餘是透明物體,所以可直接按順序繪製,針對是否為透明物體,分別設定緩衝區寫入和隱藏面刪除功能。

if(i < 4) else 

drawbufferinfo(gl, vao);

最終完成效果請看:半透明物體和透明物體共存

OpenGL繪製半透明物體

一 使用混合來實現半透明效果 混合是什麼呢?混合就是把兩種顏色混在一起。具體一點,就是把某一畫素位置原來的顏色和將要畫上去的顏色,通過某種方式混在一起,從而實現特殊的效果。假設我們需要繪製這樣乙個場景 透過紅色的玻璃去看綠色的物體,那麼可以先繪製綠色的物體,再繪製紅色玻璃。在繪製紅色玻璃的時候,利用...

OpenGL繪製半透明物體技巧

一 使用混合來實現半透明效果 混合是什麼呢?混合就是把兩種顏色混在一起。具體一點,就是把某一畫素位置原來的顏色和將要畫上去的顏色,通過某種方式混在一起,從而實現特殊的效果。假設我們需要繪製這樣乙個場景 透過紅色的玻璃去看綠色的物體,那麼可以先繪製綠色的物體,再繪製紅色玻璃。在繪製紅色玻璃的時候,利用...

vc 繪製半透明矩形

要繪製透明矩形,要用到 blendfunction 這個結構體 和alphablend這個函式 方法如下 cbitmap tempbitmap 用於繪製矩形的臨時位圖 cdc tempdc crect rect 0,0,100,100 矩形大小 blendfunction blend memset ...