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

C++ OpenGL纹理不适用于大于1x1的分辨率,c++,opengl,glfw,glew,freeimage,C++,Opengl,Glfw,Glew,Freeimage,我目前正在为我正在开发的3D游戏开发GUI系统。我使用实例渲染在速度和内存使用方面取得了相当好的折衷。到目前为止一切正常,我能够在屏幕上显示多种颜色的矩形(最多200k@60fps) 现在,我正在尝试添加纹理,以便能够显示字符、图标和帧缓冲区内容。这就是我的问题所在。我使用FreeImage作为图像加载库。加载图像文件并创建OpenGL纹理对象的代码直接从另一个项目复制 当我试图显示纹理时,我只在屏幕上看到一个黑色矩形。请注意,代码在旧项目中运行良好。我看到彩色框的唯一情况是,我将带和高度传递到

我目前正在为我正在开发的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);
我使用GLFW作为窗口,使用GLEW来启用现代OpenGL。我的IDE是VS2017,我正在运行Windows 10 64位,带有GTX1060(GL 4.6.0、387.92)的最新nVidia驱动程序。如果有人能帮我,那就太好了,因为我在过去几天里一直在寻找我的错误


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

如果在创建大小为2000x1000的纹理后,
glGetError()
返回0,则问题可能在于渲染代码。 还可以通过以下方式检查纹理的纹理大小:

int w=0;
glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &w); 

虽然并不是所有地方都支持它

这里有两个问题

函数将返回指向以FreeImage内部格式存储的数据的指针。其中,每条扫描线通常与4字节边界对齐。这将很好地工作,而你有两个纹理的力量。但是,对于NPOT纹理,您需要为OpenGL指定正确的解包对齐方式

使用可以使用以下功能

FreeImage_convertorawbits(),它返回未对齐的位,并适用于NPOT纹理

第二个问题可能是没有为mipmap指定筛选模式 尝试在调用glTexImage2D()后添加以下行

还有一个,你使用的是内部格式,第三个参数是GL_RGBA,所以你告诉opengl将像素数据解释为RGBA,但你给的是第七个参数是GL_BGRA,所以你告诉我在像素数组中给的数据是对齐的线BGRA,这真的是你的意思吗?
也检查一下。

在a中编辑。我不知道这个例子的问题是什么。这是最小的,因为生成问题的三条线都显示出来了,它们周围的一切都无关紧要。它是完整的,因为问题发生在示例中,并且我是可验证的,因为自从我两天前开始调试以来,代码对我不起作用。@Professor901通常,MCVE源代码的标准要求是允许人们1)复制并粘贴代码到文件中2)使用一行程序(由您提供)编译它3)执行并测试程序。你提供的链接还可以。为了澄清,第二个问题是纹理“不完整”。使用GL_LINEAR将使其完整,但生成mipmap也将使其完整。第二个是它。谢谢
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);