2

我试图提高我的体积射线投射算法的质量。我设置了一个较小的光线投射步骤(质量更好),但它会导致问题。它在下面的图片上(不应该出现的黑色区域)。

我正在使用 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 纹理是错误的,并且取决于步长。

4

1 回答 1

1

您能否提供片段着色器的代码?

您是否正在从前端位置遍历整个向量?这是一个示例着色器(代码可能包含一些错误,因为我只是从头顶编写它。不幸的是,我目前无法在我的计算机上测试代码):

in vec2 texCoord;
out vec4 outColor;
uniform float stepSize;
uniform int numSteps;
uniform sampler2d frontTexture;
uniform sampler2d backTexture;
uniform sampler3d volumeTexture;
uniform sampler1d transferTexture; // Density to RGB

void main()
{
    vec4 color = vec4(0.0);
    vec3 startPosition = texture(frontTexture, texCoord);
    vec3 endPosition = texture(backTexture, texCoord);
    vec3 delta = normalize(startPosition - endPosition) * stepSize;
    vec3 position = startPosition;

    for (int i = 0; i < numSteps; ++i)
    {
        float density = texture(volumeTexture, position).r;
        vec3 voxelColor = texture(transferTexture, density);

        // Sampling distance correction
        color.a = 1.0 - pow((1.0 - color.a), stepSize * 500.0);

        // Front to back blending (no shading done)
        color.rgb = color.rgb + (1.0 - color.a) * voxelColor.a * voxelColor.rgb;
        color.a = color.a + (1.0 - color.a) * voxelColor.a;

        if (color.a >= 1.0)
        {
            break;
        }

        // Advance
        position += direction;

        if (position.x > 1.0 || position.y > 1.0 || position.z > 1.0)
        {
            break;
        }
    }

    outColor = color;
}
于 2013-04-30T07:14:53.487 回答