我试图提高质量光线投射算法的质量。我已经设置了一个较小的光线投射步骤(质量更好),但它会导致问题。它位于下面的图片上(不应该是黑色区域)。
我正在使用RGB立方体来获取体积光线的方向。 我想,我有相同的算法:volume rendering (using glsl) with ray casting 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)
删除条件,但结果是一样的。
我认为与射线长度和步长有一些直接关系。我尝试了很多组合,我发现了这些东西。
如果步骤很大,我可以完成所有音量,但如果它很小,那么我真的无法完成音量(也许)。如果step非常大,那么我可以看到镜像对象(如果我走出GPU上的纹理,它可能是由重复纹理引起的)。如果步骤太小,我只能映射一小部分纹理 - >看起来,光线太短,但实际上他并非如此。 Questins是,为什么3D坐标到2D纹理的映射是错误的并且取决于步骤的大小..
答案 0 :(得分: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;
}