gpt4 book ai didi

c++ - 加载纹理的功能无法正常工作

转载 作者:行者123 更新时间:2023-11-28 02:33:44 24 4
gpt4 key购买 nike

所以我写了一个辅助函数,它只加载一个 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…的第一个参数是所谓的着色器变量的“位置索引”。查询名为 tex 的着色器变量的统一位置正上方。 就是统一调用的内容。该值是事件纹理单元的编号。

要选择要使用的实际纹理,您必须将正确的纹理绑定(bind)到正确的纹理单元。您的原始代码无法在需要时绑定(bind)所需的纹理。

使用这段代码:

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 ...*/
}

顺便说一句:纹理不会加载到着色器中。

关于c++ - 加载纹理的功能无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28249998/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com