簡體   English   中英

如何使用 GLSL 在體積渲染中進行混合?

[英]How to do the blending in Volume Rendering using GLSL?

這里介紹了使用OpenGL過時的API進行體積渲染的方法。 但是現在,我想使用 GLSL 完成體積渲染,並且我已經完成了它的一些部分。 我的問題是如何進行混合。 在上面的鏈接中,混合是通過以下代碼完成的:

glEnable(GL_BLEND);
glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );

但是如何使用 GLSL 完成混合?

我嘗試使用以下等式:

C = Cs*As + Cd(1 - As)

Cs 是源對象的顏色。 Cd 是目標對象的顏色。 源對象的 alpha 也是如此。 我在片段着色器中的代碼如下:

......
vec3 dir = backPoint - frontPoint;
float len = length(dir);
float stepSize = 0.01;
vec3 deltaDir = normalize(dir)*stepSize;
float deltaLen = length(deltaDir);
float accLen = 0;
float accAlpha = 0;
float sampleAlpha = 0;
vec4 accColor = vec4(0.0);

vec3 samplePoint = frontPoint;
vec4 sampleColor;
while(accLen < len && accColor.a <= 1.0){
    sampleColor = texture(texture3D, samplePoint);

    accColor = sampleColor*sampleColor.a + accColor*(1-sampleColor.a);

    accLen += deltaLen;
    samplePoint += deltaDir;
}
color = accColor;
......

在我的項目中,我讓 3D Texture 的 r、g、b、a 的值相同。 但我無法獲得上述鏈接之一的結果。 你能幫我解決使用 GLSL 的混合問題嗎?

在預乘 alpha 顏色空間中進行計算是很自然的。 它更適合體積現象的發射吸收。 對應的方程為:

C = Cs + (1 - As)*Cd
A = 1 - (1 - As)*(1 - Ad) = As + (1 - As)*Ad

雖然可以在非預乘 alpha 顏色空間中進行計算,但它需要除以 alpha 值,並且通常更復雜。 (您的代碼在非預乘中工作並且沒有考慮到它......)

因此,要設置您使用的 OpenGL 混合:

glBlendFunc( GL_ONE, GL_ONE_MINUS_SRC_ALPHA );

你在着色器中使用這個公式:

accColor = sampleColor + accColor*(1-sampleColor.a);

在生成 3D 紋理時,您還必須考慮到這一點。 例如,對於所有像素R = G = B = A對應於白色霧狀物質的紋理,因此您必須在黑暗背景下查看它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM