3

我想出了一些代码,使用包含瓷砖的大 2D 纹理来模拟 3D 纹理查找。3D贴图为128x128x64,大2D贴图为1024x1024,分为64个128x128的贴图。

片段着色器中的查找代码如下所示:

#extension GL_EXT_gpu_shader4 : enable

varying float LightIntensity;
varying vec3 pos;

uniform sampler2D noisef;
vec4 flat_texture3D()
{
    vec3 p = pos;
    vec2 inimg = p.xy;

    int d = int(p.z*128.0);
    float ix = (d % 8); 
    float iy = (d / 8);
    vec2 oc = inimg + vec2(ix, iy);
    oc *= 0.125;

    return texture2D(noisef, oc);
}

void main (void)
{
    vec4 noisevec = flat_texture3D();
    gl_FragColor = noisevec;
}

平铺逻辑似乎工作正常,这段代码只有一个问题。它看起来像这样:

它看起来像什么

体素层之间有奇怪的 1 到 2 像素宽的条纹。d更改时,条纹仅出现在边界处。
我已经为此工作了 2 天,但仍然不知道这里发生了什么。

4

1 回答 1

3

这看起来像一个纹理过滤器问题。想一想:当您靠近边界时,双线性过滤器将考虑相邻的纹素,在您的情况下:来自另一个“深度层”。

为避免这种情况,您可以钳制纹理坐标,使它们永远不会超出矩形定义的平铺最外侧纹素中心(类似于 GL_CLAMP_TO_EDGE,但基于每个平铺)。但是你应该知道,使用 mipmapping 时问题会变得更糟。您还应该知道,目前您无法像真正的 3D 纹理那样在 z 方向上进行过滤。当然,您可以在着色器中手动模拟。

但实际上:为什么不只使用 3D 纹理呢?硬件可以为您完成所有这些工作,而且开销要少得多......

于 2012-10-07T21:55:58.313 回答