2013-06-21 163 views
0

所以我在玩OpenGL和繪製位圖,看起來有時候glRasterPos被一個像素關閉。當我得到GL_CURRENT_RASTERPOSITION時,我可以看到rouding(floor)正在導致這個錯誤。例如,當我將x-pos設置爲110時,結果爲109.9998,從而導致在像素109上繪製位圖。爲什麼我無法繪製到像素110?請參閱下面的示例和輸出:OpenGL glRasterPos位置不正確

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值有關。

回答

0

嘗試使用glRasterPos2i來代替並指定整數座標。

+0

我有同樣的結果。 – SirRoot

+0

沒有幫助,因爲這隻會將API更改爲接受整數。但是這些整數仍然會通過導致這些舍入錯誤的相同流水線運行(作爲浮點數)。 –

0

它似乎與Ortho2D和glViewport值我是 使用。

實際上它的確如此。儘管您當前的glOrtho/glViewport配置允許您直接在窗口(視口)空間中指定座標,並因此作爲像素,但它們仍然會在通過管道時轉換爲標準化的設備座標([-1,1])並返回。所以這是你陷入舍入錯誤的地步。

請參閱this question及其關於使用OpenGL進行像素完美渲染的一些想法的回答,以及爲什麼這不像起初看起來那麼容易。雖然我不完全知道這實際上適用於不贊成使用的像素繪圖函數(無論如何都沒有人使用過)。