0

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 を補間するときに発生する通常の浮動小数点エラーですか?

4

0 に答える 0