1

私は OpenGL Bayer デモザイキング アルゴリズムに取り組んでおり、テクニックを一見うまく機能させることができましたが、出力に時折不具合が発生し、その理由を理解できないようです。ここで画像を参照してください: https://imgur.com/a/gz5YL . ストライプは表面の特定のスケールでのみ発生し、ほとんどのスケール (おそらく 99%) ではグリッチはありません。

頂点シェーダー:

vec2 invTexSize = 1.0/texSize;
centerCoord = floor(vertexIn*texSize) + 0.5;
centerTexCoord = centerCoord * invTexSize;

Xoffsets = centerTexCoord.x + vec2(-invTexSize.x, invTexSize.x);
Yoffsets = centerTexCoord.y + vec2(-invTexSize.y, invTexSize.y);

gl_Position = mvp_matrix * vec4(vertexIn.xy,0.0,1.0);

フラグメント シェーダー:

float center = texture2D(source, centerTexCoord).r;

vec4 diags = vec4(
    texture2D(source, vec2(Xoffsets.x, Yoffsets.x)).r,          // (-1,-1)
    texture2D(source, vec2(Xoffsets.x, Yoffsets.y)).r,          // (-1, 1)
    texture2D(source, vec2(Xoffsets.y, Yoffsets.x)).r,          // ( 1,-1)
    texture2D(source, vec2(Xoffsets.y, Yoffsets.y)).r);         // ( 1, 1)

vec2 horiz = vec2(
    texture2D(source, vec2(Xoffsets.x, centerTexCoord.y)).r,    // (-1, 0)
    texture2D(source, vec2(Xoffsets.y, centerTexCoord.y)).r);   // ( 1, 0)

vec2 vertic = vec2(
    texture2D(source, vec2(centerTexCoord.x, Yoffsets.x)).r,    // ( 0,-1)
    texture2D(source, vec2(centerTexCoord.x, Yoffsets.y)).r);   // ( 0, 1)

float GREEN4 = (horiz.x + horiz.y + vertic.x + vertic.y)/4.0;
float DIAG4 = (diags.x + diags.y + diags.z + diags.w)/4.0;
float H2 = (horiz.x + horiz.y)/2.0;
float V2 = (vertic.x + vertic.y)/2.0;

// Branching
vec2 branch = mod(floor(centerCoord), 2.0);
gl_FragColor.rgb =  (   branch.y == 0.0) ?
                    ((      branch.x == 0.0) ?
                                vec3(center,GREEN4,DIAG4) :
                                vec3(H2,center,V2)) :
                    ((      branch.x == 0.0) ?
                                vec3(V2,center,H2) :
                                vec3(DIAG4,GREEN4,center));

頂点は次のように定義されます

float vertices[] = {0.0f,   0.0f,
                    0.0f,   1.0f,
                    1.0f,   0.0f,
                    1.0f,   1.0f};

フィルターは GL_NEAREST に設定されています。texSize は、アップロードされたテクスチャ イメージのピクセル単位のサイズです。便宜上(?)、同じ頂点座標とテクスチャ座標 [0,1] を使用し、縦横比を維持するために mvp をオルソに設定します。私は Qt5.5 MSVC32 を使用していますが、グリッチは非常に異なるハードウェアで再現されています。

私はさまざまなマッピング手法を試しました (テクスチャ座標の調整など)。それらのいくつかは、他のものよりも優れた結果を生成するように見えます (グリッチの頻度が低い)。そのため、テクスチャ座標が十分に正確ではないなどの理由が考えられます。ある時点で、縦横比を維持するために mvp を使用しなかった場合、問題は解決したと少なくとも思っていましたが、想像しただけで、違いが生じる可能性がありますか?

何がこれを引き起こしているのでしょうか?

一部のコードは、graphics.cs.williams.edu/papers/BayerJGT09/ の功績によるものです。

サンプルの CFA 画像は www.cs.unc.edu/~lazebnik/spring09/assignment1.html からのものです。

更新 6.12.2015: ここで指を交差させておきますが、正規化されていないテクスチャ座標を使用して取得することで、うまくいったと思います

texelFetch(source, ivec2(x, y), 0).r

texture/texture2D の代わりに。ファンキーなテクスチャ座標調整をすべて元に戻し、[0, size] 頂点を次のように入力しました。

centerCoord = vertexIn;

最初のテストでは良好な結果が得られました。時期尚早であるかどうかは、後でわかります。これが解決策だったとしても、正規化された座標でテクセルをヒットできなかった理由はまだわかりません。

4

0 に答える 0