2012-01-27 18 views
0

我使用NDK與Android上的庫GLESv1_CM渲染簡單場景。Android NDK:OpenGL ES中的奇怪線條座標

void render(Rect viewport) 
{ 
    glViewport(viewport.left, viewport.top, viewport.Width(), viewport.Height()); 
    glClear(GL_COLOR_BUFFER_BIT); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrthof(viewport.left, viewport.right, viewport.top, viewport.bottom, -1, 1); 
    GLfloat points[] = { 5, 50, 1, 1, 1, 1, 
         7, 50, 1, 1, 1, 1, 
         7, 50, 1, 0, 0, 1, 
         7, 52, 1, 0, 0, 1, 
         8, 50, 0, 1, 0, 1, 
         10, 50, 0, 1, 0, 1}; 
    glEnableClientState(GL_VERTEX_ARRAY); 
    glEnableClientState(GL_COLOR_ARRAY); 
    glVertexPointer(2,GL_FLOAT,sizeof(GLfloat)*6,&points); 
    glColorPointer(4,GL_FLOAT,sizeof(GLfloat)*6,&points[2]); 
    glDrawArrays(GL_LINES,0,6); 
    glDisableClientState(GL_VERTEX_ARRAY); 
    glDisableClientState(GL_COLOR_ARRAY); 
} 

我希望有3交叉線,但是當我Android 2.2或3.2上設備運行它,我有這樣的:

screen from Android 2.2 device

甚至更​​上Android模擬器與Android 4(更新:同與2.3模擬器),我有這樣的:

screen from Android 4 emulator

是否有可能使它看起來像這張圖片上在所有Android版本的所有設備上不使用opengl2?

wanted screen

謝謝

回答

1

根據the OpenGL FAQ這種類型的投影:

如果需要精確的像素化,你可能想要把一個小 翻譯在模型視圖矩陣,如下圖所示:

glMatrixMode (GL_MODELVIEW); 
glLoadIdentity(); 
glTranslatef (0.375, 0.375, 0.); 

我想這可以減少四捨五入問題的可能性。

+0

不幸的是,這種解決方案不起作用。它只會將所有點移到右上角,因爲它應該這樣做。我認爲這是因爲它是爲3D編寫的,而其次,它是爲opengl2編寫的,而不是用於opengl ES。但是,謝謝你有趣的鏈接 – 2012-02-01 13:36:26

+0

呃,不。如果您的世界座標精確地映射到屏幕像素的正投影,那麼該代碼片段會調整0.375像素。它肯定不會將「所有點指向右上方」。也許你有一個不同的模型視圖矩陣......你原來的問題不包括它,所以我認爲它是身份矩陣。 – 2012-02-01 14:21:11

+0

好吧,我糾正了一點我的代碼,現在它的工作。沒有我想要的那麼完美,但好多了。謝謝 – 2012-02-01 15:43:09