【问题标题】:opengl SOIL library only loads uncompressed dds imagesopengl SOIL 库仅加载未压缩的 dds 图像
【发布时间】:2018-01-28 07:25:23
【问题描述】:

我正在开发一个 OpenGL 应用程序,为此我想对一个矩形进行纹理处理。 我有一个 .dds 文件并使用 SOIL library

如果我将图像加载到我的项目中

 void setTexture( const std::string& t_filename )
 {
     GLuint m_TEX = SOIL_load_OGL_texture(
         t_filename.c_str(),
         SOIL_LOAD_AUTO,
         SOIL_CREATE_NEW_ID,
         SOIL_FLAG_DDS_LOAD_DIRECT);

     [...]
 }

如果图像被压缩(DXT3、DXT5),我的应用程序会立即崩溃。如果未压缩,一切都会按预期进行。

这可能是什么原因?根据官网,SOIL应该支持压缩的.dds文件。

编辑 1: 好的,我尝试使用 gdb 和 valgrind 调试我的程序。只要您使用压缩的 .dds 文件,它看起来就像是由 SOIL_load_OGL_texture() 函数引起的段错误。但我几乎无法想象我是唯一一个使用过压缩图像的人。

GDB 输出:

 Program received signal SIGSEGV, Segmentation fault.
 0x00007f469cd03197 in __strstr_sse2 () from /usr/lib/libc.so.6

 #0  0x00007f469cd03197 in __strstr_sse2 () from /usr/lib/libc.so.6
 #1  0x00007f469d8daa2d in query_DXT_capability () from /usr/lib/libSOIL.so.1
 #2  0x00007f469d8dc19f in SOIL_direct_load_DDS_from_memory () from /usr/lib/libSOIL.so.1
 #3  0x00007f469d8dcaad in SOIL_direct_load_DDS () from /usr/lib/libSOIL.so.1
 #4  0x00007f469d8dcb66 in SOIL_load_OGL_texture () from /usr/lib/libSOIL.so.1

【问题讨论】:

  • 您是否尝试过链接 SOIL 项目源并使用调试器找出失败的地方?

标签: c++ opengl opengl-3 soil dds-format


【解决方案1】:

我曾经遇到过同样的问题。由于错误发生在SOIL_load_OGL_texture(),它很可能是由glGetString(GL_EXTENSIONS) 引起的,SOIL 在内部使用它,但 OpenGL 3.0 已弃用它。您可以在此处找到 SOIL 的固定版本:https://github.com/njcrawford/Simple-OpenGL-Image-Library/tree/issue-8-attempt2

但是,我建议不要使用 SOIL,因为它已经近十年没有更新了。我正在使用 stb_image,它运行良好并且支持与 SOIL 相同的格式:https://github.com/nothings/stb

【讨论】:

  • 感谢您的回答!我注意到大多数SOIL_load_OGL 函数都有同样的问题。现在我知道问题是什么了。一开始我也想使用 stb_image 但不幸的是它不支持 .dds 文件。还是我错了?因为那是我选择SOIL的唯一原因
  • @linux_lover:可能会检查SOIL2 以查看问题是否已解决。
猜你喜欢
  • 2015-01-27
  • 2012-09-26
  • 1970-01-01
  • 2019-05-19
  • 2019-08-25
  • 2023-03-15
  • 2017-03-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多