这是代码中唯一可能有错误的部分:
GLuint tex_name;
glGenTextures(1, &tex_name);
// set id to the gl_texture_id map for later use
gl_texture_id[t] = tex_name;
// bind texture
glBindTexture(GL_TEXTURE_2D, tex_name);
// set texture filtering parameters
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glGenerateMipmap(GL_TEXTURE_2D);
// load texture data
glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA8,t->width(),t->height(),0,GL_BGRA,GL_UNSIGNED_BYTE,t->data());
你能看到这段代码有问题吗?启用 glEnable(GL_TEXTURE_2D) 不会产生任何影响。纹理坐标是正确的,片段和顶点着色器肯定是正确的。
解决这不是问题所在,在glTexImage2D之前,我仍在使用glGenerateMipmap(...)。真正的问题是,当我的图像是GL_RGB格式时,我作为格式传递GL_RGBA。此外,我的 t->data() 数组是高度*宽度*大小(GL_FLOAT) 长,我GL_UNSIGNED_BYTE作为类型参数传递导致数据丢失。尽管这仍然有效,但实际上,在glTexImage2D之前使用glGenerateMipmap会对Nvidia硬件产生奇怪的影响,而在ATI GPU上的生活却很美好(奇怪)。
为什么要在没有数据存储的纹理上调用glGenerateMipmap (...)
?
您需要至少分配图像级别 0 才能正常工作(例如,调用 glTexImage2D (...)
.您应该在每一帧绘制纹理后调用此函数,就像您现在拥有它的方式一样,它实际上什么都不做,当您最终绘制到纹理中时,您只会生成 1 LOD 的图像。如果您不打算在每次提供纹理图像级别 0 数据时重新计算 mipmap,我会删除 mipmap 纹理过滤器。
我也看不出这与渲染到纹理有什么关系?您正在将图像数据从客户端内存传递到纹理。通常,当您渲染到纹理时,这是使用像素缓冲区(老式)或帧缓冲区对象完成的。