我设法使我的游戏读取到PNG文件中,并成功构造了我的对象。老实说,我无法100%确定其实际工作方式-现在我想将其扩展为加载多个纹理,并使用我指定的纹理。
这是我的PNG加载功能:
//Loads PNG to texture
GLuint loadPNG(string name) {
nv::Image img;
GLuint myTextureID;
if (img.loadImageFromFile(name.c_str())) {
glGenTextures(1, &myTextureID);
glBindTexture(GL_TEXTURE_2D, myTextureID);
glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);
glTexImage2D(GL_TEXTURE_2D, 0, img.getInternalFormat(), img.getWidth(), img.getHeight(), 0, img.getFormat(), img.getType(), img.getLevel(0));
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 16.0f);
}
else {
MessageBox(NULL, L"Failed to load texture", L"Sorry!", MB_OK | MB_ICONINFORMATION);
}
return myTextureID;
}
在我的主要功能中,我这样定义纹理:
//Load in player texture
testTexture = loadPNG("test.png");
其中testTexture
是全局变量,类型为GLuint
。并在主draw
循环中绘制矩形是这样的:
//Used to draw rectangles
void drawRect(gameObject &p) {
glEnable(GL_TEXTURE_2D);
//Sets PNG transparent background
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
//glBindTexture(GL_TEXTURE_2D, myTexture);
glBegin(GL_QUADS);
glTexCoord2f(0.0, 0.0); glVertex2f(p.x, p.y);
glTexCoord2f(1.0, 0.0); glVertex2f(p.x + p.width, p.y);
glTexCoord2f(1.0, 1.0); glVertex2f(p.x + p.width, p.y + p.height);
glTexCoord2f(0.0, 1.0); glVertex2f(p.x, p.y + p.height);
glEnd();
glDisable(GL_TEXTURE_2D);
}
这很好,可以使用定义的纹理对我的所有对象进行纹理处理。但是,我希望能够定义更多的纹理并使用它们。我尝试移动:
glBindTexture(GL_TEXTURE_2D, myTextureID);
从loadPNG
函数进入我的drawRect
,如下:
glBindTexture(GL_TEXTURE_2D, testTexture);
但是,这不会应用任何纹理。如果有人有任何想法,我将非常感谢您的帮助。谢谢!
答案 0 :(得分:4)
您必须绑定纹理才能使用glTexImage2D
对其进行初始化。不要从glBindTexture
删除对loadPNG
的呼叫。如果要使用其他纹理进行渲染,只需在渲染四边形之前先绑定纹理即可。