12

我正在制作这个具有按钮、按钮容器、聊天框等的 C++ 程序,并且我想用纹理将它包裹起来。

我想为我制作的所有矩形生成平滑的边缘,并且我不希望顶点绘图方法为它完成工作,因为它消耗更多的 CPU 使用率并且看起来不太好,我不知道是否它可以使用纹理坐标(即glTexCoord(u, v)glVertex2f(x, y) w/c 应该只有 4,因为它是一个四边形)

我曾经使用SDL_LoadBMP() w/c 加载纹理,只能加载.bmp的格式。(我不确定,因为那里只说 LoadBMP)。

所以我的问题是:

  • .bmp格式可以处理透明度吗?如果是这样,该怎么做?

  • 你能告诉我一些使用SOIL加载.gif格式的图像或任何其他可以处理图像透明度的格式的代码示例吗?

  • 四边形可以在不绘制背景的情况下处理六边形或星形等不规则/多边形形状吗?

附加问题

*如何导入通过c ++ opengl呈现的原始文本框,以便我可以将那里的文本复制到剪贴板?至于我程序中的聊天会话。


我制作了自己的库,该库使用 GL_POINTS 绘制文本,并且在调整窗口大小时看起来不太好,因为这些点已展开。需要const char*避免文本,#include <*string*>因为我希望我的程序不依赖于 C++ 的核心功能。

所以更好的解决方案是使用位图来绘制它。

有些人建议使用图像来绘制它,所以我真的需要透明度的东西,因为我希望它只使用四边形来绘制。

4

3 回答 3

11

是的,位图格式确实支持透明度。

这取决于压缩方式,默认RGB方式支持 24 位颜色,但BITFIELDS压缩支持 32 位颜色(24 位 + alpha 通道)。

您可以在http://en.wikipedia.org/wiki/BMP_file_format阅读更多内容

我在 Lime 项目中成功使用它,这是用 Haxe 编写的实现:https ://github.com/openfl/lime/blob/4adb7d638d15612e2542ae3a0ef581a786d21183/src/lime/_internal/format/BMP.hx

于 2015-04-12T03:43:40.520 回答
1

这个答案只解决了 bmp 文件是否可以处理透明度,以及如何使用 SOIL 加载 png 文件,我认为如果你通过推理进一步看,它也会向你展示如何加载 gif 文件。根据这篇 wikipedia 文章,bmp 是一种通过Alpha 通道支持透明度的文件类型。但根据this SO article它没有。以我自己的经验,我还没有找到使 bmp 透明度起作用的方法。所以理论上 32 位 bmp 文件应该支持透明度,但我对此表示怀疑。(也许我会吃我的话?)

好的,来自SOIL 网站,这段代码告诉了如何加载处理透明度的 png 文件:

/* load an image file directly as a new OpenGL texture */
 GLuint tex_2d = SOIL_load_OGL_texture
 (
       "img.png"
       SOIL_LOAD_AUTO,
       SOIL_CREATE_NEW_ID,
       SOIL_FLAG_MIPMAPS | SOIL_FLAG_INVERT_Y | SOIL_FLAG_NTSC_SAFE_RGB |
       SOIL_FLAG_COMPRESS_TO_DXT
 );
于 2013-01-07T12:05:28.320 回答
0

BMP 透明度在 Photoshop 中是可能的,至少具有 24 位深度。它不会在 Matlab 中作为“imwrite”选项出现。

于 2014-05-11T11:57:44.703 回答