尝试在opengl es 1.1中渲染一个圆圈,渲染为椭圆形

时间:2010-03-26 06:33:16

标签: iphone objective-c opengl-es

我尝试在构建一个更大的程序之前在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);

我对这个系统还有些新意​​,所以我可能会遇到一个我看不到的愚蠢错误,但在我看来,这应该会在半径为圆形的圆上生成40个顶点。渲染时,屏幕上的形状看起来是椭圆形,明显高于宽度。

我的问题是:为什么我的圈子以这种方式呈现,我该怎么做才能解决它?这是stackoverflow的第一个问题,所以我不确定如何共享输出的图像。

3 个答案:

答案 0 :(得分:2)

您必须根据屏幕的比例设置投影矩阵。就像现在一样,屏幕的所有边缘都在+ -1.0,导致长尺寸的拉伸。这个小曲子将顶边和底边设置为+ -1.5。

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

答案 1 :(得分:0)

正如lexu所说,问题是您的透视设置可能是正方形,但您的屏幕是矩形的。您需要通过设置投影矩阵来表示相应的矩形来补偿它。

在常规OpenGL中,您可能会按如下方式执行此操作:

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

视角为90度(45 * 2),接近截止值为0.1,远截止值为100,屏幕分辨率为320像素宽,480像素高。当然,ES中不存在该功能,因此您需要手动完成。

有人在这里发布了替换代码的代码:

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

希望这有帮助。

编辑 Codewarrior已经发布了代码,如果您正在进行正交投影,很可能是2D应用程序。这段代码是你想要一个具有更真实深度的3D游戏的透视图。

答案 2 :(得分:0)

如果你想以与开始时相同的方式离开你的观点,那么最简单的说就是

glScalef(1, 1.0/1.5, 1);

我可能会对投影矩阵(比如glMatrixMode(GL_PROJECTION);在比例之前)

相关问题