如何在 C++ 中绘制纹理/位图的区域?

Posted

技术标签:

【中文标题】如何在 C++ 中绘制纹理/位图的区域?【英文标题】:How to draw a region of a texture/bitmap in C++? 【发布时间】:2013-08-28 14:23:31 【问题描述】:

我正在为游戏 (GTA IV) 制作小地图/雷达,我想知道如何隐藏或移除方形地图区域之外的地图纹理的部分/像素。该函数将在每一帧都运行,因此我正在寻找一种有效的方法来执行此操作,最好使用一些轻量级库或 directX。

到目前为止,我想到的是“手动”检查每个像素的坐标,或者纹理中的每一行像素,看看它是否在雷达区域之外,但我想这需要相当多的资源每帧大约有 4 512*512 个纹理。

我怎样才能有效地做到这一点? 谢谢,如果这已经发布了一百万次,但没有找到与标准图像编辑无关的内容,我们深表歉意。

【问题讨论】:

你可以使用模板缓冲区吗? 为什么不在启用透明度的像素着色器中使用乘法混合? @Joe,模板缓冲区看起来很有希望!将不得不调查它。 RomanChehowsky,这也是一种选择,虽然它似乎比模板缓冲区更难,所以我会先尝试这些。 【参考方案1】:

如果我理解正确,您想根据当前位置和实际地图从地图中删除像素。为什么干脆不使用透明度?基本上,您在 CPU 上填充像素数据(在您的游戏代码中),然后更新视频卡上的纹理。如果地图没有改变,那就更好了,您可以先在大纹理中完成所有这些操作,然后将其加载到 GPU 上(甚至手动完成)并更改纹理坐标以显示您感兴趣的部分。

【讨论】:

是的,这就是我可能要做的。这里的问题是溢出定义区域的纹理部分。你如何让这些部分变得透明?就像问题中评论的那样,乘法混合可能是一个很好且有效的解决方案。

以上是关于如何在 C++ 中绘制纹理/位图的区域?的主要内容,如果未能解决你的问题,请参考以下文章

c++:如何使用 sdl 将位图加载到 opengl 中的多维数据集中?

Opengl es 2.0 在视频上绘制位图叠加

如何在白色背景上的Open GL ES中显示彩色纹理画笔?

如何纹理 Opengl glut 对象(C++)

在 C++ Win32 客户端/框架区域中进行图形和绘图

iOS使用OpenGLES和freetype绘制字体