glFrustumf仅显示清晰的颜色,按预期显示glOrthof(OpenGL ES)

时间:2009-07-06 14:44:06

标签: iphone opengl-es

我是OpenGL的新手,所以我确定这是一个虚假的错误,但我已阅读每篇文章,并查看了示例代码,我找不到差异,解释为什么glFrustum不会显示为I我喜欢它。

我将OpenGL初始化为:

- (void) initOpenGL{
    glEnable(GL_DEPTH_TEST);
    glMatrixMode(GL_PROJECTION);
    //glLoadIdentity();
    //glOrthof(0.0f, self.bounds.size.width, self.bounds.size.height, 0.0f, -10.0f, 10.0f);

    const GLfloat zNear = -0.1, zFar = 1000.0, fieldOfView = 60.0;
    GLfloat size;
    size = zNear * tanf(DEGREES_TO_RADIANS(fieldOfView) / 2.0);

    // This give us the size of the iPhone display
    CGRect rect = self.bounds;
    glFrustumf(-size, size, -size / (rect.size.width / rect.size.height), size / (rect.size.width / rect.size.height), zNear, zFar);
    glViewport(0, 0, rect.size.width, rect.size.height);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

#if 0
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
#endif

    glEnable(GL_TEXTURE_2D);
    glEnable(GL_BLEND);

#if TARGET_IPHONE_SIMULATOR
    glColor4f(0.0, 0.0, 0.0, 0.0f);
#else
    glColor4f(0.0, 0.0, 0.0, 0.0f);
#endif

    [[Texture2D alloc] initWithImage:[UIImage imageNamed:@"GreenLineTex.png"] filter:GL_LINEAR];

    glInitialised = YES;

我的绘图完成如下:

- (void)drawView {
    if(!glInitialised) {
        [self initOpenGL];
    }

    [EAGLContext setCurrentContext:context];

    glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
    glEnableClientState(GL_COLOR_ARRAY);        
    glEnable(GL_TEXTURE_2D);
    static const GLfloat texCoords[] = {
        0.0, 0.0,
        1.0, 0.0,
        0.0, 1.0,
        1.0, 1.0
    };

    // draw the edges
    glEnableClientState(GL_VERTEX_ARRAY);
        glDisableClientState(GL_COLOR_ARRAY);

    glTexCoordPointer(2, GL_FLOAT, 0, texCoords);
    glBindTexture(GL_TEXTURE_2D, 1);  
        glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); 
        glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);

    glBlendFunc(GL_SRC_ALPHA, GL_DST_ALPHA);

    for (int i = 0; i < connectionNumber; i++){

        Vertex2DSet(&vertices[0], connectionLines[i].lineVertexBeginPoint.x, connectionLines[i].lineVertexBeginPoint.y);
        Vertex2DSet(&vertices[1], connectionLines[i].lineVertexBeginPoint.x+connectionLines[i].normalVector.x, connectionLines[i].lineVertexBeginPoint.y+connectionLines[i].normalVector.y);
        Vertex2DSet(&vertices[2], connectionLines[i].lineVertexEndPoint.x, connectionLines[i].lineVertexEndPoint.y);
        Vertex2DSet(&vertices[3], connectionLines[i].lineVertexEndPoint.x+connectionLines[i].normalVector.x, connectionLines[i].lineVertexEndPoint.y+connectionLines[i].normalVector.y);

        glVertexPointer(2, GL_FLOAT, 0, vertices);
        glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
    }

    glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
    [context presentRenderbuffer:GL_RENDERBUFFER_OES];
}

for循环中的块是一组构成一些三角形条的顶点。

如果我取消注释glOrthof()行,那么我可以看到我的显示,但它是正交的,我想要移动相机,以改变整个场景的缩放。

我做错了什么导致glFrustumf()只显示清晰的颜色?

1 个答案:

答案 0 :(得分:2)

简短回答:你看错了方向。

答案很长: 你的平截头体是对称的,而你的正交矩阵则不对称。因此,如果您的模型设置为在glOrtho案例中可见,则glFrustum可能无法看到它。 此外,你不应该一起使用glOrtho和glFrustum,因为矩阵是相乘的,肯定会产生一个有趣的投影矩阵。

你可以在http://www.xmission.com/~nate/tutors.html使用Nate Robins的GL导师来试验glFrustum和glOrtho(在“投影”应用程序中)。