openGL渲染纹理渲染总是黑色的几何
这是可能会出错的代码中唯一的部分:
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()数组的长度为height * width * sizeof(GL_FLOAT)长,我传递GL_UNSIGNED_BYTE作为类型参数导致数据丢失。 Althougth这个作品你仍然有权利,事实上glTexImage2D与glGenerateMipmap在Nvidia硬件上造成奇怪的影响,而ATI GPU上的生活是美好的(奇怪的)。
为什么在没有数据存储的纹理上调用glGenerateMipmap (...)
?
在这个工作之前,你至少需要分配0级的图像(比如调用glTexImage2D (...)
,你应该在每帧画出你的纹理之后调用这个函数,你现在的方式实际上什么都不做,当你最终画出你的纹理时,你只会生成一个LOD的图像,如果你不打算在每次给纹理图像0级数据时重新计算mipmap,我会移除mipmap纹理过滤器。
我也不明白这与渲染纹理有什么关系? 您正在将图像数据从客户端内存传递到您的纹理。 通常,当渲染到纹理时,可以使用像素缓冲区(老派)或帧缓冲区对象完成此操作。
链接地址: http://www.djcxy.com/p/38539.html