10

GLSL でガウスぼかしシェーダーを作成しています。畳み込みカーネルは対称なので、半分を保存します。私は書きます:

vec3 glow = vec3(0.0);
for (int i = -WIDTH; i <= WIDTH; i++) {
    uint j = abs(i);
    glow += kernel[j] + texelFetch(u_glowTexture, coord + ivec2(i, 0), 0);
}

奇妙なことに、これは本来あるべき状態よりもわずかに左側にぼかしを描いています。しかし、その 3 行目を次のように置き換えます。

uint j = i * sign(i);

そして今、期待どおりに機能しています。私は壊れましたabs()か?本当にドライバーのバグを見つけたのでしょうか?

4

1 に答える 1

2

Abs() は、バージョン 1.30 で整数をサポートし始め、バージョン 4.10 で倍精度をサポートします。バージョンとタイプに関する自明でない問題である可能性があります。int の代わりに float を使用してデバッグしてみてください。それでも解決しない場合は、スクリーン スペース シェーダーを介して abs() を分離してデバッグし、フラグメント カラーとして出力して使用します。

于 2012-11-12T02:46:05.993 に答える