最近我碰到了一个问题,我的OpenGL程序无法在配备nVidia Quadro 140卡的2年前联想笔记本电脑上正确渲染纹理。它运行OpenGL 2.1.2和GLSL 1.20,但是当我打开mip-mapping时,整个屏幕都是黑屏,没有警告或错误。
这是我的纹理过滤器代码:
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);
经过40分钟的摆弄,我发现mip-mapping是问题所在。关掉它固定它:
// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
// glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);
我得到了很多别名,但至少程序是可见的并且运行正常。
最后,有两个问题:
修改
这是我真正追求的问题:
如何在程序上检查平台上是否提供mip-mapping?
答案 0 :(得分:3)
支持自动mipmap 生成(使用GL_GENERATE_MIPMAP)需要OpenGL 1.4,几乎每张显卡都应该使用mipmap进行纹理处理。
我猜问题可能不是
缺少mipmapping功能
但也许是一代人的
的贴图。只是为了调试
目的,你可以尝试生成
mipmap使用gluBuild2DMipmaps
?
如果此问题特定于此图形卡/配置,则检查更新的驱动程序也是一个好主意。
摆脱锯齿的好方法是multisampling。
答案 1 :(得分:2)
如果没有可用的mip-mapping,您可能不希望避免别名。没有mip-mapping的平台通常不值得麻烦。
但是,如果你真的想避免别名,你可以通过每个原始mip-mapping来近似每片段mip-mapping。首先,您必须手动生成并上传所有mip-map级别到单独的纹理中。在渲染三角形之前,在cpu上计算适当的mip-map级别,并使用与此mip-map级别对应的纹理。为了避免大型基元上的伪影,请将它们细分。
答案 2 :(得分:2)
OpenGL要求所有属于Core的纹理格式支持mip-mapping。因此,没有特定的方法来询问纹理格式是否支持mip-mapping。
一些扩展,在第一次引入时,正在放宽对新格式的约束(最值得注意的是,两种纹理的非幂和浮动纹理)。扩展本身明确表示根本不支持mip-mapping。但在将这些内容集成到核心之前,恢复了对mip-mapping支持的要求。
答案 3 :(得分:0)
如果你的实现真的不支持mipmap,我会很惊讶。你很可能错过了一个或多个级别,这很容易发生。
如果你只错过一个mip级别并启用mipmapping,那么你就得到了你所拥有的黑色。确保定义所有级别低至1x1,或相应地设置GL_TEXTURE_MAX_LEVEL TexParameter。