[英]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.