OpenGL 纹理不适用于大于 1x1 的分辨率

OpenGL texture does not work with resolutions greater than 1x1

我目前正在为我正在开发的 3D 游戏开发 GUI 系统。我正在使用实例化渲染在速度和内存使用方面取得很好的折衷。到目前为止一切正常,我能够在屏幕上显示多个彩色矩形(高达 200k@60fps)。

现在,我正在尝试添加纹理以显示字符、图标和帧缓冲区内容。那就是我的问题发生的地方。我使用 FreeImage 作为图像加载库。加载图像文件和创建 OpenGL 纹理对象的代码是直接从另一个项目复制的。

当我尝试显示纹理时,我在屏幕上只看到一个黑色矩形。请注意,该代码在旧项目中运行良好。我看到彩色框的唯一情况是当我将 高度传递给 glTexImage2D 设置为 1:

glGenTextures(1, &textureID);
glBindTexture(GL_TEXTURE_2D, textureID);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_BGRA, GL_UNSIGNED_BYTE, (void*)bits)

除此之外的一切都不起作用。 glGetError() 没有生成错误代码。我也试过生成一个随机纹理,它在 1x1 以上的尺寸都不起作用:

float* data = new float[4 * 2 * 2 * 4]{
    1.0f,0.3f,0.5f,1.0f,
    0.0f,0.7f,0.5f,1.0f,
    0.0f,0.5f,0.2f,1.0f,
    0.0f,0.0f,0.0f,1.0f
};
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 2, 0, GL_RGBA, GL_FLOAT, (void*)data);

我正在为 window 使用 GLFW 和 GLEW 以支持使用现代 OpenGL。我的 IDE 是 VS2017,我是 运行 Windows 10 64 位,带有适用于我的 GTX1060(GL 4.6.0、387.92)的最新 nVidia 驱动程序。如果有人能提供帮助,那就太好了,因为过去几天我一直在寻找我的错误。

完整的纹理加载代码可用here。如果需要更多信息或代码,请发表评论。

如果在创建大小为 2000x1000 的纹理后,glGetError() returns 0,可能问题出在您的渲染代码上。 您也可以通过

检查纹理的纹理大小
int w=0;
glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &w); 

尽管并非所有地方都支持它。

我在这里看到两个问题

FreeImage_GetBits() 函数将 return 指向以 FreeImage 内部格式存储的数据的指针。每条扫描线通常与 4 字节边界对齐。当你有二次幂的纹理时,这会很好地工作。但是,对于 NPOT 纹理,您需要为 OpenGL 指定正确的解包对齐方式。

使用可以使用以下函数

FreeImage_ConvertToRawBits() 其中 return 是非对齐位,适用于 NPOT 纹理。

第二个问题可能是没有为 mipmaps 指定过滤模式 尝试在调用 glTexImage2D()

后添加以下行
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 

还有一个你正在使用内部格式,它是第 3 个参数作为 GL_RGBA 所以你告诉 opengl 将像素数据解释为 RGBA 但你将第 7 个参数作为 GL_BGRA 所以你告诉我在像素阵列中提供的数据是对齐线 BGRA 这真的是你的意思吗? 也检查一下。