对屏幕上绘制的元素进行深度排序

Depth sorting of elements drawn on the screen

本文关键字:深度 排序 元素 屏幕 绘制      更新时间:2023-10-16

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

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)
}
};

主.cpp

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

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

如何让我的customPointer实际上始终保留在窗口上的所有其他元素之上?
此外,我还希望我的btnImage.draw()绘制在自定义形状上(如控件右上角的圆形按钮)。btnImage是 png,侧面有一些透明度。但是,它不是出现在矩形上方,而是出现在矩形后面。要修复的类似问题。有什么建议吗?

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

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

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

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

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

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

应该得到预期的效果