我目前正在为我正在开发的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 64bit,配备了适用于我的GTX1060(GL 4.6.0,387.92)的nVidia驱动程序。如果有人可以提供帮助,那将是很好的,因为我过去几天一直在搜索我的错误。
可以使用完整的纹理加载代码here。如果需要更多信息或代码,请发表评论。
答案 0 :(得分:0)
如果在创建大小的纹理后,例如2000x1000,glGetError()
返回0,则问题可能在于渲染代码。
您还可以通过
int w=0;
glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &w);
尽管它并不是随处可见。
答案 1 :(得分:0)
我在这里看到两个问题
FreeImage_GetBits()函数将返回一个指向以FreeImage内部格式存储的数据的指针。每条扫描线通常与4字节边界对齐。当你有两个纹理时,这将正常工作。但是,对于NPOT纹理,您需要为OpenGL指定正确的解包对齐。
使用可以使用以下功能
FreeImage_ConvertToRawBits()返回非对齐位,适用于NPOT纹理。
第二个问题可能是没有为mipmap指定过滤模式 在调用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但是你给第7个参数作为GL_BGRA所以你告诉我在像素数组中给出的数据对齐线BGRA这真的是你的意思吗? 检查一下。