深度排序在屏幕上绘制的元素

时间:2013-01-30 05:53:58

标签: c++ algorithm opengl 2d

我这里有一个小程序,我正在窗口上绘制一些元素。

class CustomPointer{
void draw(); //draw png image on the screen
};

class CustomRectangle{
void draw(){
drawRect(); //draw Rectangle with a certain color
drawbtnImage(); //draw png image to the top right of rectangle (alphaBlending enabled)
}
};

的main.cpp

CustomRectangle customRectangle;
CustomPointer customPointer;

void draw(){
drawBackgroundImage();
customRectangle.draw();
customPointer.draw();
}

当我使用上面的代码绘制我的元素时,我期望将customPointer绘制在屏幕上的所有其他元素上,因为指针正在绘制其他所有内容。但我的指针出现在背景上,但落后于customRectangle/btnImage

如何让我的customPointer实际上始终保持在窗口上的所有其他元素上? 另外,我还期望我的btnImage.draw()被绘制在自定义形状上(就像控件右上角的圆形按钮)。 btnImage是一个png,它的两侧有一些透明度。但是,它不会出现在矩形上,而是出现在它后面。类似的问题需要解决。有什么建议吗?

2 个答案:

答案 0 :(得分:0)

我认为你应该为2D空间进行一些Z-Sorting zalgorithm。每个对象都应该有自己的Z值(可以是整数),在全局Draw方法中,您可以使用此Z顺序进行排序。

对于最顶部的矩形,您可以将Z设置为某个较大的值,以便它始终是第一个/最后一个。

这在使用透明度时也会有所帮助。

void drawAll() {
    sort_by_z_order();
    foreach rect in sorted_rect_list {
        draw_rect(rect)
    }
}

答案 1 :(得分:0)

你可以为除了指针绘制之外的所有内容启用深度测试以获得该效果:

void draw(){
glEnable(GL_DEPTH_TEST);
drawBackgroundImage();
customRectangle.draw();
glDisable(GL_DEPTH_TEST);
customPointer.draw();
}

应该达到预期的效果