c++ - 纹理未通过 stb_image 出现

标签 c++ opengl glfw

我一直在用 C++ 开发一个新项目,使用 GLFW 作为 OpenGL 包装器,并使用 stb_image.h 工具加载图像。

我使用以下代码片段加载图像:

this->width = width;
this->height = height;
int bpp;

unsigned char* image = stbi_load(("./res/textures/"+fileName).c_str(), &width, &height, &bpp, STBI_rgb_alpha);

if (image == nullptr) std::cerr << "Unable to load texture: " + fileName << std::endl;

glGenTextures(1, &id);
glBindTexture(GL_TEXTURE_2D, id);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

if(bpp == 3) glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image);
else if (bpp == 4) glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, image);
stbi_image_free(image);

我通过以下方式渲染纹理:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glEnable(GL_TEXTURE_2D);

glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glBindTexture(GL_TEXTURE_2D, texture->id);
glBegin(GL_QUADS);
glTexCoord2i(0, 0); glVertex3i(0, 0, -5);
glTexCoord2i(0, 1); glVertex3i(0, 1, -5);
glTexCoord2i(1, 1); glVertex3i(1, 1, -5);
glTexCoord2i(1, 0); glVertex3i(1, 0, -5);
glEnd();

我正在交换缓冲区、轮询事件,并已使用 glfwWindowHint() 设置各种颜色位

收效甚微。 当我运行时,我只收到以下结果:

white untextured quad

最佳答案

您必须在 glBindTexture(GL_TEXTURE_2D, texture->id) 之前调用 glActiveTexture(GL_TEXTURE0)。所以,你最后的代码应该是这样的:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glEnable(GL_TEXTURE_2D);

glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texture->id);
glBegin(GL_QUADS);
glTexCoord2f(0, 0); glVertex3f(0, 0, -5);
glTexCoord2f(0, 1); glVertex3f(0, 1, -5);
glTexCoord2f(1, 1); glVertex3f(1, 1, -5);
glTexCoord2f(1, 0); glVertex3f(1, 0, -5);
glEnd();

此外,glActiveTexture(...) ,与 GLFW 没有任何关系。它是 opengl 的一部分。

关于c++ - 纹理未通过 stb_image 出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30558183/

相关文章:

c++ - 如何为 std::vector<std::vector<bool>> 编写哈希函数

c++ - 使用枚举还是#define?

c++ - C++ 中变量的属性

java - 我应该使用哪个 OpenGL 库?

c++ - 手动编译GLFW "No supported window creation API selected"

c++ - glfw如何破坏主循环中的窗口

c++ - 给定一个 future 容器,如何以非阻塞方式执行所有获取?

c++ - 使用 GLUT 按键停止动画?

opengl - GLSL 150+ 中textureCube 的替代品?

c++ - 选择从 Windows 将文件拖放到 GLFW 应用程序中