openGL渲染到纹理渲染始终是黑色几何体

时间:2013-11-13 00:09:34

标签: 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()数组是高度*宽度* sizeof(GL_FLOAT)长,我传递GL_UNSIGNED_BYTE作为类型参数导致数据丢失。 Althougth这个有用,你仍然有权利,事实上在glTneImage2D之前使用glGenerateMipmap会对Nvidia硬件造成奇怪的影响,而ATI GPU上的生活很美(奇怪)。

1 个答案:

答案 0 :(得分:1)

为什么在没有数据存储的纹理上调用glGenerateMipmap (...)

你需要在此之前至少分配图像级别0(例如调用glTexImage2D (...)。你应该在每帧绘制纹理后调用此函数,就像你现在拥有它的方式一样没有什么,当你最终绘制到你的纹理时,你只生成1 LOD的图像。如果你不打算每次给纹理图像0级数据重新计算mipmap,我会删除mipmap纹理过滤器。

我也看不出这与渲染到纹理有什么关系?您正在从客户端内存将图像数据传递到纹理。通常在渲染到纹理时,可以使用像素缓冲区(旧学校)或帧缓冲区对象来完成。