OpenGL:如何优化2D模式下多层重叠的2D渲染?

时间:2011-06-06 12:36:32

标签: c++ opengl 3d rendering 2d

我知道如何通过简单地首先渲染最近的平面来加速3D渲染。

但是如何在二维模式下获得这种方法的优势呢?我不能使用深度测试,因为它们都处于相同的z级别。

所以当我不需要在“下方”渲染图层的不可见部分时,我想是否可以加速。这可能吗?

请注意,我在3D模式下渲染,可能同时存在3d对象和2d对象。所以我不能只切换到2D渲染,我总是使用3d坐标。我可以按照自己的意愿旋转相机,因此特定于相机的技巧是不可接受的。

修改:我尝试了Ville建议的方法: enter image description here

http://img815.imageshack.us/img815/7857/zfighting.png

但是如你所见,它会导致z战斗。

我用于渲染的代码在这里:

glDepthFunc(GL_LESS);
glEnable(GL_DEPTH_TEST);
glDisable(GL_TEXTURE_2D);
glDisable(GL_ALPHA_TEST);
glDisable(GL_POLYGON_OFFSET_FILL);

glColor4f(1,0,0,1);
DrawQuad(0, 0, 10, 10);

glColor4f(0,0,1,1);
DrawQuad(5, 5, 15, 15);

glDepthFunc(GL_LEQUAL);

2 个答案:

答案 0 :(得分:1)

您对2D模式有何了解?你的意思是正投影吗?然后我有一个好消息:深度测试在那里工作也很完美。 gluOrtho2D与glOrtho(...,-1,1)基本相同;即你有Z范围-1 ... 1花费。

由于评论而编辑:

完全可以在一个帧中组合渲染多个投影:

void render_perspective_scene(void);

void render_ortho_scene(void);

void render_HUD();

void display()
{
    float const aspect = (float)win_width/(float)win_height;

    glViewport(0,0,win_width,win_height);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glFrustum(-aspect*near/lens, aspect*near/lens, -near/lens, near/lens, near, far);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    render_perspective_scene();

    // just clear the depth buffer, so that everything that's
    // drawn next will overlay the previously rendered scene.
    glClear(GL_DEPTH_BUFFER_BIT);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-aspect*scale, aspect*scale, -scale, scale, 0, 1);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    render_ortho_scene();

    // Same for the HUD, only that we render
    // that one in pixel coordinates.
    glClear(GL_DEPTH_BUFFER_BIT);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, win_width, 0, win_height, 0, 1);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    render_HUD();
}

当然,如果你因为那些将投影矩阵设置放在重塑处理程序中的糟糕教程而陷入困境,你当然会被阻止,看看这个明显的解决方案。

答案 1 :(得分:1)

听起来您正在同一平面上渲染所有“2D”对象。您可以将2D部件渲染为带有正投影的离屏帧缓冲,并按照datenwolf的建议为它们提供不同的Z值。然后将帧缓冲纹理渲染到主3D场景中。