OpenGL 3.2/GLSL 1.5 で双三次補間シェーダーを実装しようとしています。OSX 10.7 を実行する 2011 15 インチ MBP と OSX 10.8 を実行する 2013 27 インチ iMac でこれを試しましたが、どちらにも同様の問題があります。
私のシェーダー プログラムは問題なく動作します...ただし、ウィンドウが特定のサイズの場合、ピクセルの行や列の一部が奇妙にオフになります。このスクリーンショットをチェックして、私が何を意味するかを確認できます: http://angusforbes.com/texcoord_issue.png . この画像では、y 軸に沿った texCoord.x の値は常に同じではありません。
では、なぜ texcoords が不均一なのですか? つまり、たとえば、特定の行に沿って x 軸を 0.0 から 1.0 に補間する場合、変化する y はまったく同じであると予想されます。同様に、y 軸に沿って補間する場合、変化する x は同じでなければなりません。
しかし、そうでない場合もあります。
ここに、私が何を意味するかを説明するための単純化された (しかし機能する) サンプルコードを示します。
#version 150
uniform sampler2D tex0; //some image I'm trying to do bicubic interpolation on
uniform int tWidth; //width of image;
uniform int tHeight; //height of image
in vec2 texCoord; //my interpolated texture coordinates, 0.0->1.0 in each direction
out vec4 outputFrag;
void main() {
float a = fract( texCoord.x * tWidth );
float b = fract( texCoord.y * tHeight );
outputFrag = vec4( a, b, 0.0, 1.0 );
/*
//it's a little easier to see the issue like this:
if (a > 0.95) {
outputFrag = vec4( a, b, 0.0, 1.0 );
} else {
outputFrag = vec4( 0.0 );
}
*/
}
fract 関数を次のように置き換えてみました: float a = texCoord.x * tWidth - floor(texCoord.x * tWidth); ビルトインの fract メソッドで何かおかしくなったかどうかを確認するだけです。しかし、それは同じ結果をもたらします。
それが重要な理由は、シェーダーが台無しになり、特定の位置で (texCoord に基づいて) 計算した値が突然 0.99 ではなく 0.01 になると、奇妙なストリーキングが発生するためです。「precision highp float;」を設定してみました。フラグメント シェーダーで実行しますが、問題は解決しません。最小および最大フィルターに GL_NEAREST を使用しています。
何か案は?それとも、これはシェーダーで texcoords を補間するときに発生する通常の浮動小数点エラーですか?