c++ - OpenGL - SOIL 不会加载 JPG 或 PNG 图像
问题描述
我正在尝试在 OpenGL 中创建一个上下文加载器,但我无法让 SOIL 加载图像。
这是代码:
Texture2D TextureLoader::loadSprite(const char* path)
{
int width, height;
GLuint texture = SOIL_load_OGL_texture(path, SOIL_LOAD_RGBA, SOIL_CREATE_NEW_ID, SOIL_FLAG_INVERT_Y);
if (texture == 0)
{
Texture2D failedTexture;
return failedTexture;
}
glBindTexture(GL_TEXTURE_2D, texture);
glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &width);
glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &height);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glBindTexture(GL_TEXTURE_2D, 0);
Texture2D texture2d(texture, width, height);
return texture2d;
}
它总是在纹理 == 0 检查时失败。映像文件与构建项目时生成的可执行文件位于同一目录中。我已经尝试过 PNG 和 JPG,但两者都无法使用。
解决方案
尽管您似乎假设了什么,但SOIL_load_OGL_texture
几乎可以肯定不会检查可执行文件的目录。相对路径相对于进程的当前工作目录。根据您的描述,我假设您使用的是 Visual Studio IDE。默认情况下,Visual Studio 在运行程序时会使用项目文件所在的目录作为工作目录。您可以在项目属性 > 调试 > 工作目录中更改该设置。我建议将其更改为您计划在其中运行完成的应用程序的任何目录。
如果您确实想指定相对于可执行文件路径的图片路径,那么我建议您改用绝对路径。不幸的是,没有办法在标准 C++ 中可靠地找到可执行文件的路径。在 Windows 上,您可以使用GetModuleFileName()
. 查看此问题以获取有关此主题的更多信息。获得可执行文件的绝对路径后,提取目录的路径并附加文件名。如果您可以使用 C++17,std::filesystem
可以帮助您处理路径……
推荐阅读
- amazon-s3 - 现有 S3 存储桶的 Terraform 数据源在计划阶段尝试返回 NoSuchWebsiteConfiguration 的 GetBucketWebsite 请求失败
- sql - 将 2 列,同一个表链接到另一个表
- entity-framework-core - EF Core 自引用多对多双方
- python - 如何在 Python 中为多个变量快速添加 1?
- elasticsearch - 将日志 prestashop 发送到 kibana
- .net-core - 我可以做些什么来加快我使用 NBomber 的负载测试?(VS LT 250 RPS 轻松;NBomber 最高 25 RPS)
- python - 熊猫:将元素与另一个数据框进行比较
- hadoop - Hive/Impala 写入 HDFS
- bash - 将命令历史记录到 docker 主机
- shell - 使用 find 查找名称中包含不可打印字符的文件