OpenGL:启用多重采样会在高缩放级别为多边形绘制混乱的边缘

时间:2010-01-04 22:38:53

标签: c++ opengl multisampling

当我使用以下代码时:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 6);

然后启用多重采样,我注意到我的程序不再关心最大mip级别。

编辑:它也渲染了最后的miplevels,这就是问题,我不希望它们被渲染。

EDIT3: 我测试并确认它根本不会忘记mip限制,因此它遵循我的GL_TEXTURE_MAX_LEVEL设置。 ...所以问题不是mipmap相关的,我猜......

编辑2:截图,这是世界地图缩小了很多,并使用低角度使效果显示最差的方式,地图下也有渲染水面,所以没有从地图纹理以外的任何地方拍摄黑色像素的可能性:

alt text http://img511.imageshack.us/img511/6635/multisamplingtexturelim.png

Edit4:所有这些照片应该看起来像右上角的pic(根据多重采样,只是更平滑的边缘)。但显然我的代码中有一些可怕的错误。我必须使用mipmap,mipmap不是问题,它们工作得很好。

我做错了什么,或者我该如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

还检查您为MIN_FILTER设置了什么:

glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, ... );

尝试不同的设置(列表为here)。

但是,如果您对gluBuild2DMipmaps的结果不满意,我建议您查看替代方案:

特别是后者是高度可定制的。没有提到的是,通过将GL_GENERATE_MIPMAP设置为true可以激发此扩展。它是自动的,因此如果数据发生变化,您无需重新计算。

答案 1 :(得分:1)

确定。毕竟问题不是TEXTURE_MAX_LEVEL。有趣的是,一个简单的测试如何帮助解决这个问题。

我有两种理论认为LOD的选择方式不同,而这两种理论似乎都被纯色测试所证实。

然后是第三种理论。如果我理解你的场景,你有一个使用纹理图集的模型,我们观察到的是一些应该从地图集的特定项目中获取的多边形实际上是从另一个获取的。是吗?

这可以通过以下事实来解释:多重采样片段通常在像素的中间进行采样。即使该中心不在生成样本的三角形内部。有关说明,请参见this page的底部。

通常的解决方法叫做centroid sampling(此页面也有很好的插图)。它强制采样使三角形内的采样点恢复。

现在是坏消息:我不知道在可编程管道之外打开质心过滤的任何方法,而你没有使用它。你认为你想切换到访问该功能吗?

编辑添加:

此外,不使用纹理图集将是一种解决此问题的方法。它如此可见的原因是因为你开始用“三角形”的采样模式从地图集的另一部分取来。

答案 2 :(得分:0)

如果您希望渲染始终拥有它,您应该enable multi-sampling通过您的应用程序,而不是nvidia控制面板。这甚至可以解决你的问题。

对于使用控制面板多重采样时忽略的GL_TEXTURE_MAX_LEVEL设置,它听起来像是驱动程序错误/功能。这很奇怪,因为此功能可用于限制您在纹理中实际加载的内容(所谓的纹理完整性标准)。如果您根本没有加载最低的mipmap级别怎么办?什么被渲染?

编辑:从您正在显示的图片中,它看起来并不像是忽略了设置。首先,MAX_LEVEL = 0与MAX_LEVEL = 6不同。现在,考虑到纹理中的噪声,我甚至不知道你的MAX_LEVEL = 6 / MS关闭看起来干净的原因。根据MAX_LEVEL = 16 / MS关闭图片,应该有噪声。在这一点上,我建议在漫反射纹理的每个mip级别放置不同的纯色(而不是依靠GL来构建你的mips),以确切了解你所获得的mip级别。