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

OpenGL texture does not work with resolutions greater than 1x1

本文关键字:1x1 情况 大于 分辨率 纹理 不适用 适用于 OpenGL      更新时间:2023-10-16

我目前正在为我正在开发的3D游戏开发GUI系统。我使用实例化渲染来很好地兼顾速度和内存使用。到目前为止,一切都很好,我可以在屏幕上显示多个彩色矩形(最多200k@60fps)。

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

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

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驱动程序。如果有人能帮忙,那就太好了,因为我在过去几天一直在搜索我的错误。

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

我在这里看到两个问题

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

使用可以使用以下功能

FreeImage_ConvertToRawBits(),返回未对齐的位,适用于NPOT纹理。

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

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 

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

如果在创建大小为2000x1000的纹理后,glGetError()返回0,那么问题可能出在渲染代码中。您也可以通过检查纹理的纹理大小

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

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