4

ピクセル パーフェクトなレンダリングとピクセル ブリッティングを可能にするために OpenGL シーンをセットアップすることは可能ですか? 次のようにしてシーンを設定していることに気付きました。

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0, width, height, 0.0, 0.0, 1.0);

そして、次を使用してピクセルを描画します。

glBegin(GL_POINTS);
glVertex2i(0, 0);
glEnd();

すべてのハードウェア構成で一貫して左上のピクセルに描画するわけではありませ(左に 1 ピクセル、または左上隅の 1 ピクセル下にある場合があります)。これは、グラフィックドライバーによる OpenGL の実装が異なるためである可能性が高いと認識していますが、左上のピクセルが (0,0) で、右下のピクセルが (width-1, height-1) になるようにする方法はありますか? )一貫して?これが標準化されていないのは奇妙に思えます...

(0.375, 0.375) または (0.5, 0.5) の変換を使用する「ハック」を見たことがありますが、一部の構成では解決するようですが、他の構成では解決しないようです。

4

2 に答える 2

7

編集:ダン、それは翻訳です。更新しました。

ピクセルにもサイズがあることも考慮する必要があります。これが「翻訳ハック」が目指していることです。左端のピクセルに中心座標が必要な場合、0.0その左の境界は-0.5-- にあり、そこにクリッピング プレーンがあるはずです。同様に、右端のピクセルに中心座標が必要な場合、width - 1その右境界は(width - 1) + 0.5-- であり、クリッピング プレーンがあるべき場所です。

だから試してください:

glOrtho(-0.5, (width - 1) + 0.5, (height - 1) + 0.5, -0.5, 0.0, 1.0);

というわけで翻訳はここから。

于 2013-01-30T21:33:11.570 に答える
1

最初の検査では、機能するはずであり、実装がピクセル単位でオフセットされている場合、仕様外である可能性があると思われます。ただし、ビューを上下逆に変換した結果、不正確さが忍び込み、丸めの問題を引き起こした結果である可能性もあります。それが事実であるとは確信していませんが、ピクセルパーフェクトなレンダリングを行いたい場合は、不必要な変換を導入することから始めません.

とにかく、固定関数パイプラインを完全に回避し、独自の変換を使用して、頂点シェーダーで正しい座標を計算していることを確認するだけです。これが私の最初の提案です。最新のプログラマブル パイプラインを使用すると、何が起こっているかをより細かく制御できます。

それができない場合は、少なくとも物事を正しい方法でレンダリングしてみて、ターゲットにしているさまざまなプラットフォームの一貫性が少し高まるかどうかを確認してください。

または、これはちょっとしたハックだと思いますが、これらのことが必要な場合もあります-それを確認し、変換を使用してそれに応じて座標をオフセットすることができます(つまり、ピクセルを描画し、それを読み戻して、最終的に正しいかどうかを確認します)場所、そうでない場合はどこに行ったか)。もちろん、問題を複雑にしているだけかもしれません。

ここではサブピクセルのオフセットをあまりいじりません。おそらく、ピクセルが必要に応じて 1:1 でマップされなくなったケースをさらに紹介するだけです。

于 2013-01-30T16:56:19.300 に答える