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

标签 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 并且它的侧面有一些透明度。但是,它没有出现在矩形上方,而是出现在矩形后面。要修复的类似问题。有什么建议吗?

最佳答案

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

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

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

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

关于c++ - 对屏幕上绘制的元素进行深度排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14597588/

相关文章:

c++ - 使用数组乘以矩阵?

c++ - 根据 Visual Studio 中的调试/发布配置自动#defines

algorithm - 在 C# 中解析脚本循环

algorithm - 二维数组中的二进制搜索

c++ - OpenGL 还是 DirectX?

c++ - OpenGL 窗口未打开

java - 延迟渲染管道无法在笔记本电脑图形卡上运行,以及奇怪的“模型重影”问题(glBlendFunc)

c++ - C++ 中的 Unicode 和 std::string

c++ - RegisterRawInputDevices() 正在生成 ERROR_FILE_NOT_FOUND

javascript - array.reduce 通过递归实现