为什么我的opengl es 1.1视口会剪切我的几何体?

时间:2010-11-08 17:51:06

标签: iphone objective-c ipad opengl-es

我正在尝试在我正在编写的自定义ipad应用程序中查看某些3d几何体。我遇到的问题是当我缩放,平移和旋转我的模型时,边缘会被修剪,我不知道为什么。我不认为这是因为近/远剪裁平面,因为我改变它们并且没有任何反应,它仍然是剪辑。而且,它只在一个方向上完成。另一个方向渲染得很好。有任何想法吗?转换矩阵是使用我创建的arcball操作类创建的,但出于显而易见的原因,我只包含了一个硬编码的视图矩阵。硬编码矩阵显示问题就好了。场景中只有一堆正方形被渲染,可以夹在两个角上。

要复制我的问题,请为iPad创建一个新的opengl项目,然后在“return self;”之前将以下代码粘贴到ES1Renderer.m init方法的末尾:

glMatrixMode(GL_PROJECTION);
CGRect frame = [[UIScreen mainScreen] bounds];
glViewport(0, 0, frame.size.width, frame.size.height);
glFrustumf(-1000, 1000, -1000, 1000, 10000, 10000);

现在用以下内容替换整个render方法:

static const GLfloat squareVertices[] = {
-0.5f,  -0.5f,
0.5f,  -0.5f,
-0.5f,   0.5f,
0.5f,   0.5f,
};

[EAGLContext setCurrentContext:context];

glBindFramebufferOES(GL_FRAMEBUFFER_OES, defaultFramebuffer);

glClearColor(0.5f, 0.5f, 0.5f, 1);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

CGRect frame = [[UIScreen mainScreen] bounds];

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glViewport(0, 0, frame.size.width, frame.size.height);
glFrustumf(0, backingWidth, 0, backingHeight, -.1, -1000);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

float mat2[16];

mat2[0] = .268496;
mat2[1] = .082372;
mat2[2] = .127658;
mat2[3] = 0;
mat2[4] = .051842;
mat2[5] = .193987;
mat2[6] = -.234207;
mat2[7] = 0;
mat2[8] = -.142808;
mat2[9] = .225290;
mat2[10] = .154991;
mat2[11] = 0;
mat2[12] = .034580;
mat2[13] = -.001087;
mat2[14] = -.013952;
mat2[15] = 1;

glMultMatrixf(mat2);

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

for (float i = 0; i <= 6; i += 2) {
    for (float j = 0; j <= 6; j+= 2) {
        glPushMatrix();
        glColor4f(i/6, j/6, 0, 1);
        glTranslatef(i-3, j-3, 0);
        glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
        glPopMatrix();
    }
}

glBindRenderbufferOES(GL_RENDERBUFFER_OES, colorRenderbuffer);
[context presentRenderbuffer:GL_RENDERBUFFER_OES];

最后,在EAGLView.m文件中,替换initWithCoder方法中的以下行

renderer = [[ES2Renderer alloc] init];

使用:

renderer = [[ES1Renderer alloc] init];

然后跑。您将看到以一定角度旋转的正方形网格,并且左上边缘和右下边缘被剪裁。这是我无法弄清楚如何摆脱。任何帮助表示赞赏。感谢。

2 个答案:

答案 0 :(得分:1)

这很奇怪:

glFrustumf(0, backingWidth, 0, backingHeight, -.1, -1000);

最后两个值是近平面和远平面的值。这些都是负值。从我所看到的,你只在z = 0处工作,它位于这个范围之外。你看到任何东西都很奇怪。

如果您将其更改为:

,该怎么办?
glFrustumf(0, backingWidth, 0, backingHeight, 1000, -1000);

?前四个值对应左,右,上和下。这些都是正值,而您的方块可能具有负值。如果你在

中使它们更平衡怎么办?
glFrustumf(-10, 10, -10, 10, 1000, -1000);

...

答案 1 :(得分:0)

我想出了一种方法来解决它对我有用,但我仍然想知道我的glFrustrumf调用我做错了什么。如果我使用glOrthof,它工作得很好,并修复了我遇到的剪裁平面问题。任何人都知道glFrustrumf我做错了什么?