3

タイルを含む大きな2Dテクスチャを使用して3Dテクスチャルックアップをシミュレートするコードを思いつきました。3Dテクスチャは128x128x64で、大きな2Dテクスチャは1024x1024で、128x128の64タイルに分割されています。

フラグメントシェーダーのルックアップコードは次のようになります。

#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つだけ問題があります。次のようになります。

それはどのようなものか

ボクセルのレイヤーの間に奇妙な1〜2ピクセル幅の縞があります。縞模様は、変化すると境界線に表示されdます。
私はこれに2日間取り組んできましたが、ここで何が起こっているのかまだわかりません。

4

1 に答える 1

3

これはテクスチャフィルタの問題のようです。考えてみてください。境界に近づくと、双一次フィルターは、別の「深度レイヤー」からの隣接するテキセルを考慮します。

これを回避するには、テクスチャ座標をクランプして、タイルのrectで定義された最も外側のテクセル中心の外側にならないようにします(GL_CLAMP_TO_EDGEと同様ですが、タイルごとに)。ただし、ミップマップを使用すると問題が悪化することに注意する必要があります。また、実際の3Dテクスチャのように、現在z方向にフィルタリングできないことにも注意してください。もちろん、これをシェーダーで手動でシミュレートすることもできます。

しかし、実際には、3Dテクスチャを使用しないのはなぜですか?hwは、はるかに少ないオーバーヘッドで、これらすべてを実行できます...

于 2012-10-07T21:55:58.313 に答える