我尝试在构建一个更大的程序之前在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的第一个问题,所以我不确定如何共享输出的图像。
答案 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);在比例之前)