我在使用OpenGL渲染纹理时遇到问题。我得到的是白色而不是纹理图像,但我的矩形和整个上下文都运行正常。我正在使用stbi图像加载库和OpenGL 3.3。
渲染前:
glViewport(0, 0, ScreenWidth, ScreenHeight);
glClearColor(0.2f, 0.0f, 0.0f, 1.0f);
int Buffer;
glGenBuffers(1, &Buffer);
glBindBuffer(GL_ARRAY_BUFFER, Buffer);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
加载纹理:
unsigned char *ImageData = stbi_load(file_name, 1024, 1024, 0, 4); //not sure about the "0" parameter
int Texture;
glGenTextures(1, &Texture);
glBindTexture(GL_TEXTURE_2D, Texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, x, y, 0, GL_RGB, GL_UNSIGNED_BYTE, ImageData);
stbi_image_free(ImageData);
渲染:
glClear(GL_COLOR_BUFFER_BIT);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, Texture);
glEnableVertexAttribArray(0);
glDrawArrays(GL_TRIANGLES, 0, 6 * 3); //a rectangle which is rendered fine
glDisableVertexAttribArray(0);
我正在寻找一种非常简约和简单的解决方案。
答案 0 :(得分:2)
首先,请花一点时间查看stbi_load (...)
的函数声明:
unsigned char *stbi_load (char const *filename,
int *x, // POINTER!!
int *y, // POINTER!!
int *comp, // POINTER!!
int req_comp)
现在,考虑一下你传递的论据:
file_name (presumably a pointer to a C string)
1024 (definitely NOT a pointer)
1024 (definitely NOT a pointer)
0 (definitely NOT a pointer)
将x
,y
和comp
作为指针传递的重点是stbi可以在加载图像后更新其值。这是C语言,比如在C ++或Java等语言中通过引用传递,但您选择传递整数常量,然后编译器将其视为地址。
由于您调用此功能的方式,stbi会尝试将图像的宽度存储在以下地址: 1024 ,地址处的图像高度: 1024 和地址上的组件数量: 0 。你真的很幸运,这不会导致访问冲突或其他奇怪的行为,在任意地址存储是危险的。
相反,请考虑一下:
GLuint ImageX,
ImageY,
ImageComponents;
GLubyte *ImageData = stbi_load(file_name, &ImageX, &ImageY, &ImageComponents, 4);
[...]
glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA8,
ImageX, ImageY, 0, GL_RGBA, GL_UNSIGNED_BYTE, ImageData);
// ~~~~ You are requesting 4 components per-pixel from stbi, so this is RGBA!
答案 1 :(得分:1)
我已经有一段时间了,因为我已经完成了OpenGL,但除了一些任意调用之外,我猜的主要问题是你在调用绘制函数之前没有调用glEnable(GL_TEXTURE_2D);
。之后调用glDisable(GL_TEXTURE_2D);
是明智的
以及避免潜在的未来冲突。