如何使用SFML for OpenGL加载纹理?


Answers:


16

欢迎使用OpenGL,免费提供快速的东西,而让简单的东西变得困难。

如果您认为样本又长又复杂,“仅用于加载纹理”,那么您什么都没看到。等到您必须加载DDS纹理,处理HDR纹理,支持立方体贴图,渲染到纹理等。

在OpenGL中加载纹理包含两个组件:

  • 从图像格式获取数据。您可以从文件中加载纹理或以程序方式生成它。没关系,只要您最终得到了不错的颜色信息即可。

  • 将数据放在视频卡上。数据需要从系统RAM到视频RAM。

第一部分应该很容易,因为SFML带有一个标准的图像加载器。

sf::Image img_data;
if (!img_data.LoadFromFile("images/avatar.png"))
{
    LOG_ERROR("Could not load '%s'.", "images/avatar.png");
    return false;
}

接下来,我们将生成一个OpenGL纹理对象。

GLuint texture_handle;
glGenTextures(1, &texture_handle);

绑定纹理有很多选择。共有三种主要类型:1D,2D和3D,并且您支持立方体贴图(+ X,-X,+ Y,-Y,+ Z,-Z)。但是,在99%的情况下,您将需要2D纹理。

glBindTexture(GL_TEXTURE_2D, texture_handle);

现在我们进入有趣的部分。让我们将数据上传到视频卡。

glTexImage2D(
    GL_TEXTURE_2D, 0, GL_RGBA,
    img_data.GetWidth(), img_data.GetHeight(),
    0,
    GL_RGBA, GL_UNSIGNED_BYTE, img_data.GetPixelsPtr()
);

最后,我们可以设置许多纹理参数。这些问题回答如下:如果我们使用超出范围(0.0,1.0)的纹理坐标怎么办?我们是环绕(GL_REPEAT)还是什么都不做(GL_CLAMP)?它们也可以用来向视频卡说明我们要在纹理上使用线性插值。

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

现在,您应该能够使用绑定纹理,glBindTexture并使用它来绘制纹理化的网格。


嗯,我尝试这样做,我得到的只是一个白色立方体:pastebin.com/nVQFAMRJ
Darestium,2012年

尝试放入glEnable(GL_TEXTURE2D);init函数。
knight666

太棒了!谢谢!顺便说一句,该功能做什么?启用纹理?
Darestium

是的,它打开了2D纹理对象,因此可以接收纹理数据。您仅需在初始化时启用一次,但是在将代码复制到新项目时通常会忘记它。包括我自己。;)
knight666

很好的解释。您可以编写教程!
danijar

2

SFML 2.0+使加载纹理更加容易。

sf::Texture texLid;
std::string image2="images/top.jpg";
if (!texLid.loadFromFile(image2))
{
    std::cout << "Could not load" << image2;
    char c;
    std::cin>>c;
    return false;
}


glEnable(GL_TEXTURE_2D);//tell OpenGL to use textures when drawing

sf::Texture::bind(&texLid);//select this texture for OpenGL rendering
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.