这是代码中唯一可能出错的部分:
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()数组是高度*宽度* sizeof(GL_FLOAT)长,我传递GL_UNSIGNED_BYTE作为类型参数导致数据丢失。 Althougth这个有用,你仍然有权利,事实上在glTneImage2D之前使用glGenerateMipmap会对Nvidia硬件造成奇怪的影响,而ATI GPU上的生活很美(奇怪)。
答案 0 :(得分:1)
为什么在没有数据存储的纹理上调用glGenerateMipmap (...)
?
你需要在此之前至少分配图像级别0(例如调用glTexImage2D (...)
。你应该在每帧绘制纹理后调用此函数,就像你现在拥有它的方式一样没有什么,当你最终绘制到你的纹理时,你只生成1 LOD的图像。如果你不打算每次给纹理图像0级数据重新计算mipmap,我会删除mipmap纹理过滤器。
我也看不出这与渲染到纹理有什么关系?您正在从客户端内存将图像数据传递到纹理。通常在渲染到纹理时,可以使用像素缓冲区(旧学校)或帧缓冲区对象来完成。