这里介绍了使用 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 的混合问题吗?