【问题标题】:openGL render to texture renders always black geometryopenGL 渲染到纹理总是渲染黑色几何
【发布时间】:2013-11-25 09:31:12
【问题描述】:

这是代码中唯一可能有问题的部分:

        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 作为类型参数传递,导致数据丢失。尽管这仍然有效,但实际上在 glTexImage2D 和 glGenerateMipmap 之前使用会导致对 Nvidia 硬件产生奇怪的影响,而在 ATI GPU 上的生活是美好的(奇怪的是)。

【问题讨论】:

  • 渲染到屏幕上能用吗?

标签: opengl


【解决方案1】:

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

您需要至少分配图像级别 0 才能工作(例如,调用 glTexImage2D (...)。您应该在每帧绘制到纹理后调用此函数,就像您现在拥有它的方式一样,它实际上什么都不做,并且当您最终绘制到纹理中时,您只会为 1 个 LOD 生成图像。如果您不打算在每次提供纹理图像级别 0 数据时重新计算 mipmap,我会删除 mipmap 纹理过滤器。

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

【讨论】:

  • 这不是问题,我仍在使用 glTexImage2D (...) 之前的 glGenerateMipmap (...)。真正的问题是当我的图像为 GL_RGB 格式时,我以格式 GL_RGBA 传递。此外,我的 t->data() 数组是 heightwidthsizeof(GL_FLOAT) 长,我将 GL_UNSIGNED_BYTE 作为类型参数传递,导致数据丢失。尽管这仍然有效,但实际上在 glTexImage2D 和 glGenerateMipmap 之前会导致对 Nvidia 硬件产生奇怪的影响,而在 ATI GPU 上的生活是美好的(奇怪的是)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-27
  • 2016-07-23
  • 2023-03-30
  • 1970-01-01
相关资源
最近更新 更多