2010-03-26 64 views
2

我試圖在構建一個更大的程序之前在opengl es 1.1中渲染一個圓作爲測試,但它呈現爲橢圓形。下面是我用它來生成和渲染我頂點代碼:試圖在opengl es 1.1中渲染一個圓,渲染爲橢圓

static const int numVerts = 40; 

static GLfloat myFirstCircle[82]; 

myFirstCircle[0] = 0.0f; 
myFirstCircle[1] = 0.0f; 

for (int i = 2; i < (numVerts+1)*2; i+=2) { 
    myFirstCircle[i] = .5 * cosf(i*2*3.14159/numVerts); 
    myFirstCircle[i+1] = .5 * sinf(i*2*3.14159/numVerts); 
} 

glVertexPointer(2, GL_FLOAT, 0, myFirstCircle); 
glEnableClientState(GL_VERTEX_ARRAY); 

glDrawArrays(GL_TRIANGLE_FAN, 0, 22); 

我還是有點新的這個系統,所以我可以有一個愚蠢的錯誤,我沒有看到,但在我看來,這應該在半徑爲0.5的圓上生成40個頂點。渲染時,屏幕上的形狀看起來像是一個橢圓形,比寬度高很多。

我的問題是這樣的:我的圓圈爲什麼這樣渲染,我能做些什麼來修復它?這是第一個關於stackoverflow的問題,所以我不知道如何共享我的輸出圖像。

+0

謝謝,夥計們!這很有意義。一旦我有時間去嘗試一下,我會回來並批准一個答案。 – eipxen

回答

2

您必須根據屏幕的比例設置投影矩陣。就像現在一樣,屏幕的所有邊緣都在+ -1.0之間,從而導致長距離拉伸。這個小巧的小東西將頂部和底部的邊緣設置爲+ -1.5。

glMatrixMode(GL_PROJECTION); 
glOrthof(-1.0, 1.0, -1.5, 1.5, 1, 100); 
+0

謝謝!我在渲染循環的第一次迭代中運行了這些代碼行(我認爲這感覺很糟糕),並且它們像一個魅力一樣工作! – eipxen

+0

放置它們的更好的地方可能在你的framebuffer設置代碼附近,但它對每一幀都沒有太大的傷害。 – codewarrior

0

正如lexu說的,問題是您的透視設置可能是正方形,但是您的屏幕是矩形的。您需要通過設置投影矩陣來表示適當的矩形來彌補這一點。

在常規的OpenGL,則可能會做這如下:圖90度(45 * 2),0.1附近截止,100遠切斷

gluPerspective(45.0f, 320.0f/480.0f, 0.1f,100.0f); 

字段,和屏幕分辨率爲320像素寬×480像素高。當然,這個功能在ES中不存在,所以您需要手動完成。

有人好心張貼代碼在這裏替換:

http://maniacdev.com/2009/05/opengl-gluperspective-function-in-iphone-opengl-es/

希望這有助於。

編輯 Codewarrior發佈了代碼,如果你正在做一個正交投影,最有可能的2D應用程序。此代碼是您希望透視具有更真實深度的3D遊戲。

0

如果你想離開你的觀點,它的方式是開始一樣,這將是最簡單的,只是說

glScalef(1, 1.0/1.5, 1); 

我可能會那樣對投影矩陣(比如glMatrixMode(GL_PROJECTION);之前的規模)