2012-08-12 65 views
0

我正在制作一个涉及使用GL_POINT呈现点的iPhone游戏。但是,当点的中心在屏幕外时,我仍然想要绘制仍在屏幕上的点的任何部分。这里是我用来表达观点的代码。GL_POINT在中心关闭时不呈现屏幕

-(void)render { 
    if (!fill || !outline || !active || dead) 
     return; 

    NSLog(@"rendering"); 

    glPushMatrix(); 
    glLoadIdentity(); 
    glMultMatrixf(matrix); 

    glEnable(GL_BLEND); 
    glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
    glEnable(GL_SMOOTH); 
    glEnable(GL_POINT_SMOOTH); 

    glPointSize(scale.x*2); 

    [outline render]; 

    glPointSize(2*(scale.x-kLineWidth)); 

    [fill render]; 

    glPopMatrix(); 
} 

注意,它会记录"rendering"时应该呈现,所以这种方法得到正确调用。

[outline render][fill render]方法看起来像这样

-(void)render { 
    // load arrays into the engine 
    glVertexPointer(vertexSize, GL_FLOAT, 0, vertexes); 
    glEnableClientState(GL_VERTEX_ARRAY); 
    glColorPointer(colorSize, GL_FLOAT, 0, colors); 
    glEnableClientState(GL_COLOR_ARRAY); 

    //render 
    glDrawArrays(renderStyle, 0, vertexCount); 

    glDisableClientState(GL_VERTEX_ARRAY); 
    glDisableClientState(GL_COLOR_ARRAY); 
} 

,我使用此代码

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glOrthof(-kScreenWidth/2.0 + xPan, kScreenWidth/2.0 + xPan, -kScreenHeight/2.0 + yPan, kScreenHeight/2.0 + yPan, -1.0f, 1.0f); 

glMatrixMode(GL_MODELVIEW); 

但使用“平移”效果时,该点的中心不在屏幕上(在与glOrthof平移之后),整个点不被绘制。即使中心不在屏幕上,我该如何使点仍然呈现?

回答

1

我不相信你有什么可以做的简单的修复。在光栅化之前裁剪原始图像,所以如果该点位于视锥体之外,即使光栅化会创建位于视锥体内的碎片,它也不会被光栅化。

要么使用GL_TRIANGLES/GL_QUADS切换到真正的四边形,要么如果您真的不想这样做,您可以将点渲染到尺寸稍大于视口的屏幕外缓冲区,然后blit图像回到主框架上。

+0

我使用屏幕外缓冲区方法,它工作正常。谢谢! – 2012-08-12 15:30:13