我试图提高我的体积射线投射算法的质量。我设置了一个较小的光线投射步骤(质量更好),但它会导致问题。它在下面的图片上(不应该出现的黑色区域)。
我正在使用 RGB 立方体来获取体积中的光线方向。我想,我有和那里一样的算法:volume rendering (using glsl) with ray cast algorithm
有没有人有一些想法,可能是哪里出了问题?我需要解决这个问题,因为我的文凭论文的截止日期是关闭:(我真的不知道,为什么它不起作用:(
编辑: 我不能在那里显示我的所有代码(这可能是个问题,如果我会在学校提供之前提供它)。但通读卷的关键代码:
// All variables neede to rays
vec3 rayDirection = texture2D(backFaceCube, texCoo).xyz - varcolor.xyz;
float lenRay = length(rayDirection);
vec3 normDir = normalize(rayDirection);
float d = qualitySteps; //quality steps is size of steps defined by user -> example: 0.01, 0.001, 0.0001 etc.
vec3 step = normDir * d;
float lenStep = length(step);
float accumulatedLength = 0.0;
然后在循环中:
posInCube.xyz += step;
accumulatedLength += lenStep;
...
...
...
if(accumulatedLength >= lenRay || accumulatedColor.a > 1.0 ) {
break;
}
EDIT2:(对不起,但喜欢评论太长了)
是的,纹理很嘈杂......我试图用 alpha: 删除条件if(accumulatedColor.a > 1.0)
,但结果是一样的。我认为这与射线的长度和步长的大小有直接的关系。我尝试了很多组合,我发现了这些东西。如果步长很大,我可以通过所有音量,但如果它很小,我真的无法通过音量(也许)。如果步幅非常大,我可以看到镜像对象(如果我在 GPU 上超出纹理,可能是由于重复纹理造成的)。如果步长太小,我只能映射纹理的一小部分 - >看起来,那条光线太短了,但实际上他不是。问题是,为什么将 3D 坐标映射到 2D 纹理是错误的,并且取决于步长。