2010-03-26 66 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);之前的规模)