加载纹理的功能无法正常工作
Function to load textures not working correctly
所以我写了一个辅助函数,它只加载一个 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;
}
decode方法将图片保存到img中,将宽高分别存入width和height。
如果我遗漏了什么,请告诉我。
感谢您提供的任何帮助!
当某些东西不适用于 OpenGL 时,请始终先查看绘图代码。在你的绘图功能中(我讨厌 Dropbox,顺便说一句,首先必须下载那个狗屎以便我可以查看它)有这个:
GLuint uniID = glGetUniformLocation(program, "tex");
glActiveTexture(GL_TEXTURE0);
glUniform1i(textures[idx], 0);
这就是你的问题所在。 textures[idx]
包含 textureID。但是纹理 ID 根本不会进入着色器制服。 glUniform 的第一个参数...是着色器变量的所谓 "location index"。查询名为 tex
的着色器变量的统一位置正上方。 那个 是统一调用的内容。该值是活动纹理单元的编号。
要select要使用的实际纹理,您必须绑定正确的纹理到正确的纹理单元。您的原始代码无法在需要时绑定所需的纹理。
使用此代码:
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 ...*/
}
顺便说一句:纹理未加载到着色器中。
所以我写了一个辅助函数,它只加载一个 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;
}
decode方法将图片保存到img中,将宽高分别存入width和height。
如果我遗漏了什么,请告诉我。
感谢您提供的任何帮助!
当某些东西不适用于 OpenGL 时,请始终先查看绘图代码。在你的绘图功能中(我讨厌 Dropbox,顺便说一句,首先必须下载那个狗屎以便我可以查看它)有这个:
GLuint uniID = glGetUniformLocation(program, "tex");
glActiveTexture(GL_TEXTURE0);
glUniform1i(textures[idx], 0);
这就是你的问题所在。 textures[idx]
包含 textureID。但是纹理 ID 根本不会进入着色器制服。 glUniform 的第一个参数...是着色器变量的所谓 "location index"。查询名为 tex
的着色器变量的统一位置正上方。 那个 是统一调用的内容。该值是活动纹理单元的编号。
要select要使用的实际纹理,您必须绑定正确的纹理到正确的纹理单元。您的原始代码无法在需要时绑定所需的纹理。
使用此代码:
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 ...*/
}
顺便说一句:纹理未加载到着色器中。