0

だから私はOpenGLで遊んでビットマップを描いていますが、時々glRasterPosが1ピクセルずれているようです。GL_CURRENT_RASTERPOSITION を取得すると、ルーティング (フロア) がこのエラーの原因であることがわかります。たとえば、x-pos を 110 に設定すると、109.9998 になり、ビットマップがピクセル 109 に描画されます。ピクセル 110 に描画できない理由はありますか? 以下の例と出力を参照してください。

glMatrixMode(GL_PROJECTION);
glLoadIdentity();

gluOrtho2D(0, 800, 800, 0);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

glViewport(0, 0, 800, 800);

glRasterPos2f (100.0, 12);
glGetFloatv(GL_CURRENT_RASTER_POSITION, pos);
printf("%f\n",pos[0]);

glRasterPos2f (110.0, 30.0);
glGetFloatv(GL_CURRENT_RASTER_POSITION, pos);
printf("%f\n",pos[0]);

glRasterPos2f (111.0, 45);
glGetFloatv(GL_CURRENT_RASTER_POSITION, pos);
printf("%f\n",pos[0]);


Console Output:
    100.000000
    109.999992
    111.000015

更新: Ortho2D と私が使用している glViewport の値に関係しているようです。

4

2 に答える 2

0

私が使用している Ortho2D と glViewport の値に関係しているようです。

実際、そうです。現在のglOrtho/glViewport構成では、座標をウィンドウ (ビューポート) 空間で直接指定できるため、ピクセルとして指定できますが、パイプラインを実行するときに正規化されたデバイス座標 ([-1,1]) に変換され、元に戻されます。したがって、これは丸め誤差が発生するポイントです。

この質問とその回答を参照して、OpenGL を使用してピクセル パーフェクトなレンダリングを行うことに関するいくつかの考えと、これが最初に思われるほど簡単ではない理由を確認してください。これが非推奨のピクセル描画関数に実際にどのように適用されるかは完全にはわかりませんが(とにかく誰も使用していません)。

于 2013-06-25T13:30:14.650 に答える