0

3DTV に出力するインターレース画像を作成しようとしています。私の方法では、OpenGL のステンシル バッファーを使用して、ピクセルの偶数行ごとに線のグリッドを描画します。私のラップトップでは、結果の画像はインターレースされているように見えますが、(HDMI ケーブル経由で) 3DTV に出力すると、ピクセルの偶数行ごとに線が描かれていないように見えます。私のラップトップとテレビの垂直解像度は 1080 ピクセルです。以下で使用される画面座標は、画面の左下の (-1, -1) から右上の (1, 1) までの範囲です。これは、ステンシル バッファーにグリッドを描画するために使用しているコードです。誰かが私のためにそれを健全にチェックして、私が何か根本的に間違っているかどうかを確認できるとありがたい. 私のコードが問題ない場合、問題はテレビがラップトップからの出力のサイズを変更している可能性があります。

glEnable(GL_STENCIL_TEST);
glClearStencil(0);
glClear(GL_STENCIL_BUFFER_BIT);
glStencilOp (GL_REPLACE, GL_REPLACE, GL_REPLACE); 
glDisable(GL_DEPTH_TEST);
glStencilFunc(GL_ALWAYS,1,1); 
const int stencilsize = 2500;
// hardcoding 2500, not the greatest solution in the world i know...
GLfloat stencilVertices[stencilsize] = {0.0};
//if we know the window height, we can draw a line in the stencil buffer on even row of pixels in the window
currheight = 1080; 
GLint i = 0;
GLfloat ht = -1;
/*start ht @ -1, increase by 4/currheight each time, until 1 is reached*/
while ((ht < 1) && (i < stencilsize-4)) 
{
    stencilVertices[i] = -1;    //left edge of screen
    i++;
    stencilVertices[i] = ht;    //current line's y coord
    i++;
    stencilVertices[i] = 1;     //right edge of screen
    i++;
    stencilVertices[i] = ht;    //current line's y coord
    i++;
    ht += 4.0/currheight;   //increase ht by (4/(height of window)) each time to mark even rows only (until ht == 1)
}
glGenBuffers(1, &m_ui32Stencilpattern); 
glBindBuffer(GL_ARRAY_BUFFER, m_ui32Stencilpattern);
glBufferData(GL_ARRAY_BUFFER, (stencilsize * sizeof(GLfloat)), stencilVertices, GL_STATIC_DRAW);
glEnableVertexAttribArray(VERTEX_ARRAY);
glVertexAttribPointer(VERTEX_ARRAY, 2, GL_FLOAT, GL_FALSE, 0, 0);
glDrawArrays(GL_LINES, 0, stencilsize);
4

1 に答える 1

1

ステンシル バッファは、これに適したツールではないと思います。最近では、フラグメント シェーダーを使用すると、ライン インターレースをより簡単に行うことができます。そして、OpenGL-3 の前の数日間、私はポリゴン スティプルを使用してこれを行っていました (mplayer に組み込まれたインターレース 3D TV パッチで行ったように)。これにより、ジオメトリを正しい位置に配置するのに苦労する必要がなくなります。

シェーダーでは、gl_FragCoord ビューポートのピクセル座標を条件として使用して、ピクセルごとに 2 つのソース イメージを選択できます。discardまたは、行/列のいずれかの2 つのパスとフラグメントを描画します。

于 2012-03-18T01:08:58.523 に答える