如何使用OpenGL处理​​纹理压缩和mipmap生成?

时间:2014-03-24 03:41:32

标签: c++ opengl compression textures

这就是我想要做的:我想加载一个普通的图像文件(.png,.tga,.bmp等),将这个图像作为纹理上传到OpenGL,告诉OpenGL生成纹理的mipmap,告诉OpenGL压缩图像(使用S3TC / RGTC),然后下载整个压缩/ mipmapped纹理,将其保存到文件中,以后可以立即将整个纹理加载到OpenGL中。

我已经完成了前3个步骤。我使用SDL2_Image来处理图片加载,我可以通过glTexImage2D()上传所述图片,然后我可以使用glGenerateMipmap()创建mipmap。从那里开始,我几乎迷失了,但我可以弄清楚如何压缩图像而不会有太多麻烦。

我需要帮助的是最后一点 - 将整个压缩+ mipmapped纹理作为单个连续数据块下载,将其保存到文件(在内容创作阶段),然后立即上传整个事物(在运行时)。关于我可以从哪里开始的任何建议?

PS。我正在使用OpenGL 3.3作为我的最低版本。

1 个答案:

答案 0 :(得分:1)

您可以使用rygDXT实时压缩器压缩到S3TC或DXT,因为驱动程序中没有嵌入DXT压缩。大多数DXT压缩器都处于脱机状态(非实时),需要几秒或几分钟才能运行。

你也有nvdxt,nvidia SDK提供完整的代码示例来压缩DXT中的纹理,但它的速度很慢我警告你。 ryg DXT应该更快。

然后,对于向上复制,您应该能够将纹理复制到动态(DX术语中的“分段”)缓冲区中,然后使用某个锁定(glMapBuffer?)然后使用memcopy将动态缓冲区映射到内存。