1

当我使用以下代码时:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 6);

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

编辑:它也会渲染最后的 miplevel,这就是问题所在,我不希望它们被渲染。

Edit3: 我测试并确认它根本不会忘记 mip 限制,所以它确实遵循我的 GL_TEXTURE_MAX_LEVEL 设置。...所以问题与 mipmap 无关,我猜...

Edit2:截图,这是世界地图被缩小了很多,使用低角度使效果显示最差,地图下面还有渲染的水平面,所以不可能从地图以外的任何地方获取黑色像素纹理:

替代文字 http://img511.imageshack.us/img511/6635/multisamplingtexturelim.png

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

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

4

3 回答 3

1

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

glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, ... );

尝试不同的设置(这里有一个列表)。

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

特别是后者是高度可定制的。没有提到的是,这个扩展是通过设置GL_GENERATE_MIPMAP为 true 来启动的。它是自动的,因此如果数据更改,您无需重新计算。

于 2010-01-13T18:52:10.323 回答
1

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

我有两种关于 LOD 选择不同的理论,而这两种理论似乎都被纯色测试所反驳。

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

这可以通过多重采样片段通常在像素中间进行采样这一事实来解释。即使该中心不在生成样本的三角形内。请参阅本页底部的插图。

解决这个问题的常用方法称为质心采样(此页面也有很好的问题说明)。它强制采样带回三角形内的采样点。

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

编辑添加:

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

于 2010-01-14T23:46:02.327 回答
0

如果您希望您的渲染始终拥有它,您应该通过您的应用程序而不是 nvidia 控制面板启用多重采样。这甚至可以解决您的问题。

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

编辑:从您展示的图片来看,它看起来并没有真正忽略设置。一方面,MAX_LEVEL=0 与 MAX_LEVEL=6 不同。现在,考虑到纹理中的噪音,我什至不明白为什么你的 MAX_LEVEL=6/MS off 看起来那么干净。根据 MA​​X_LEVEL=16/MS off picture,它应该是嘈杂的。此时,我建议在您的漫反射纹理的每个 mip 级别中放置不同的纯色(而不是依赖 GL 来构建您的 mip),以准确查看您获得的 mip 级别。

于 2010-01-09T18:20:11.540 回答