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);
我使用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);
尽管并非所有地方都支持它。
- 在没有太多条件句的情况下,我如何避免被零除
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 函数中堆分配的效果与缺少堆分配的情况
- 在未初始化映射的情况下,将值插入到映射的映射中
- 是默认情况下分配给char数组常量的值
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- 如何在不产生任何垃圾的情况下获得C中的像素
- 在已经使用Git的情况下减少编译时间
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- 如何在没有信号的情况下从C++执行QML插槽
- 如何在不知道向量大小的情况下输入向量内部的向量?
- 如何针对特定情况调试和修复此双自由内存损坏问题
- 为什么在某些情况下不写入此文件?
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 在没有Xcode的情况下在Mac捆绑包中嵌入框架
- 有没有一种方法可以测量c++程序的运行时内存使用情况
- UE4-如何在给定4个屏幕坐标的情况下缩放纹理或材质
- 为什么这个音频包络不能通过开关的情况?
- 为什么需要复制构造函数,在哪些情况下它们非常有用
- OpenGL纹理不适用于分辨率大于1x1的情况