我正在看NeHe的纹理贴图教程。仅加载纹理看起来过于复杂。
有没有一种方法可以在SFML中加载纹理,然后在Open GL中使用它?我将SFML用于窗口。
我正在看NeHe的纹理贴图教程。仅加载纹理看起来过于复杂。
有没有一种方法可以在SFML中加载纹理,然后在Open GL中使用它?我将SFML用于窗口。
Answers:
欢迎使用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
并使用它来绘制纹理化的网格。
glEnable(GL_TEXTURE2D);
init函数。
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