2013-06-22 154 views
1

我有關於屏幕設置的一些問題。最初,當我繪製一個三角形時,x向量1將一直向右,-1會一直向左。現在我已經調整了它,以考慮窗口的不同寬高比。我的新問題如何使用於渲染二維三角的數字以及像素值。如果我的窗口是480個像素寬,320高的我想要進入這個跨越的屏幕採用了三OpenGL屏幕布局

glBegin(GL_TRIANGLES); 
    glVertex2f(240, 320); 
    glVertex2f(480, 0); 
    glVertex2f(0, 0); 
glEnd(); 

而是它目前看起來像這樣

glBegin(GL_TRIANGLES); 
    glVertex2f(0, 1); 
    glVertex2f(1, -1); 
    glVertex2f(-1, -1); 
glEnd(); 

任何想法?

+0

http://stackoverflow.com/questions/17056733/using-opengl-for-2d – Grimmy

+0

http://stackoverflow.com/questions/5877728/want-an-opengl-2d-example-vc-draw-a -長方形 – mr5

回答

1

您需要使用具有正確值的功能glViewportglOrtho。基本上glViewport設置窗口的一部分能夠使用OpenGL渲染3D圖形。 glOrtho使用OpenGL的座標在窗口的該部分內建立座標系。 因此,爲了您的任務,您需要知道窗口的確切寬度和高度。如果你說他們是480和320分別然後你需要調用

glViewport(0, 0, 480, 320) 
// or: glViewport (0,0,w,h) 

某處,也許在你的SizeChanging處理程序(如果您正在使用WINAPI是WM_SIZE消息)

其次,建立的OpenGL時的場景你需要指定OpenGL的座標。對於正射投影,它們將與窗戶的尺寸相同,因此

glOrtho(-240, 240, -160, 160, -100, 100) 
// or: glOrtho (-w/2, w/2, -h/2, h/2, -100, 100); 

適合你的purppose。不是說我在這裏使用200的深度(z從-100到100)。 接下來,在您的渲染例程中,您可以繪製您的三角形

0

由於第二段代碼適合您,因此我假設您的轉換矩陣都是標識,或者您有繞過它們的着色器。此外,您的視口跨越整個窗口。

一般來說,如果你的視口開始於(x0,y0),並具有W X H尺寸,歸一化座標(x,y)你喂glVertex2f將會轉化成(vx,vy)如下:

vx = x0 + (x * .5f + .5f) * W 
vy = y0 + (y * .5f + .5f) * H 

如果您想要使用像素座標,您可以使用該功能

void vertex2(int x, int y) 
{ 
    float vx = (float(x) + .5f)/480.f; 
    float vy = (float(y) + .5f)/320.f; 
    glVertex3f(vx, vy, -1.f); 
} 

-1 z值是距離觀察者最近的深度。這是負面的,因爲z被認爲是在轉換後反映出來的(這是你的情況)。 .5f的添加是因爲光柵化器將一個像素視爲1x1四邊形,並在該四邊形中間評估三角形的覆蓋範圍。