所以我编写了一个辅助函数,它只加载一个png文件光盘并将其加载到OpenGL着色器中。
这一切都很好,直到我尝试加载多个纹理。我遇到的问题是它似乎每次都会覆盖所有以前的纹理。我不知道为什么会这样。如果我提供的代码不够,则发布完整的来源here
这是loadTexture函数(驻留在Helper.cpp中)
GLuint loadTexture(const GLchar* filepath, GLuint& width, GLuint& height)
{
// image vector.
vector<GLubyte> img;
// decodes the image to img
decode(img, filepath, width, height);
// if the image is empty return
if (img.size() == 0)
{
std::cout << "Bad Image" << std::endl;
system("pause");
return 0;
}
// return value
GLuint ret;
// gen textures
glGenTextures(1, &ret);
// bind the ret to GL_TEXTURE_2D so everyting using GL_TEXTURE_2D referrs to ret
glBindTexture(GL_TEXTURE_2D, ret);
// set parameters. Current filtering techunique is GL_LINEAR http://www.arcsynthesis.org/gltut/Texturing/Tut15%20Magnification.html
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
// copy the data to the texture associated with ret.
// format is RGBA internally and externally, and the size is unsigned char, which is unsigned byte
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, &img[0]);
return ret;
}
解码方法将图像保存为img,并分别将宽度和高度存储到宽度和高度。
如果有遗漏的东西请告诉我。
感谢您的帮助!
答案 0 :(得分:2)
当某些内容无法与OpenGL一起使用时,请先查看绘图代码。在你的绘图功能(我讨厌Dropbox,BTW,首先必须下载那个狗屎,以便我可以查看它)有这个:
GLuint uniID = glGetUniformLocation(program, "tex");
glActiveTexture(GL_TEXTURE0);
glUniform1i(textures[idx], 0);
那就是你的问题。 textures[idx]
包含textureID。但纹理ID根本不会进入着色器制服。 glUniform ...的第一个参数是着色器变量的所谓“位置索引”。在查询名为tex
的着色器变量的统一位置正上方。 那是进入统一呼叫的内容。该值是活动纹理单元的编号。
要选择要使用的实际纹理,您必须将右纹理绑定到右纹理单元。您的原始代码在需要时无法绑定所需的纹理。
使用此代码:
glUseProgram(program)
GLuint uniID = glGetUniformLocation(program, "tex");
for(…) {
/* ... */
int const unit = 0; // just for illustration
glUniform1i(uniID, unit);
glActiveTexture(GL_TEXTURE0 + unit);
glBindTexture(GL_TEXTURE_2D, textures[idx]);
/* draw stuff ...*/
}
BTW:纹理未加载到着色器中。