Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用SOIL-OpenGL解决mip地图相关问题_Opengl_Mipmaps_Soil - Fatal编程技术网

使用SOIL-OpenGL解决mip地图相关问题

使用SOIL-OpenGL解决mip地图相关问题,opengl,mipmaps,soil,Opengl,Mipmaps,Soil,我正在使用SOIL生成OpenGL纹理。一切都很好,除了在土壤中产生的mip贴图引起的远处伪影。当我不使用该标志时: SOIL_FLAG_MIPMAPS 这不是伪品,但看起来很糟糕。有人见过这样的文物吗?水面上呈栗色,沙滩上呈浅绿色/蓝色 下面是它的外观: 可能有帮助: // right after you set your GL_TEXTURE_MIN/MAG_FILTER if( glewIsSupported("GL_EXT_texture_filter_anisotropic") )

我正在使用SOIL生成OpenGL纹理。一切都很好,除了在土壤中产生的mip贴图引起的远处伪影。当我不使用该标志时:

SOIL_FLAG_MIPMAPS
这不是伪品,但看起来很糟糕。有人见过这样的文物吗?水面上呈栗色,沙滩上呈浅绿色/蓝色

下面是它的外观:

可能有帮助:

// right after you set your GL_TEXTURE_MIN/MAG_FILTER
if( glewIsSupported("GL_EXT_texture_filter_anisotropic") )
{
    GLfloat max;
    glGetFloatv( GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &max );
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, max);
}

或者是某种加载/纹理坐标错误,尽管没有足够的信息来确定(即,一个完整的、最小的程序来演示问题)。

我的猜测是,无论您使用什么来生成mipmap,都有一个bug,并且没有正确过滤mip级别-或者“泄漏”“有效”区域外部的随机颜色,在该区域中存储先前级别的像素,或忘记计算某些像素的值。也就是说,有一个bug只影响mipmap链的最后一级

要验证这是否是原因,请从加载的纹理的mip级别读回数据。使用glReadPixels或其他什么。如果最后一个mip级别包含垃圾-这是纹理加载例程的错误。您还可以使用GL_LINEAR_MIPMAP_NEAREST filter,查看是否存在带有紫色像素的特定mip级别

要绕过此问题,请为第一级生成图像,并使用
glGenerateMipmaps
(OpenGL 3+),
glTexParameteri(GL\u TEXTURE\u 2D,GL\u generate\u MIPMAP,GL\u TRUE)(OpenGL 2+或OpenGL 1.4+——我忘了它是在哪个版本中添加的。在OpenGL 3+或gluBuild2DMipMap(古代OpenGL版本)中不推荐使用)

或者你可以自己计算。盒子过滤器并不难实现。高斯也不难

如果使用公式生成纹理(因为您说过“生成”),另一种可能的情况是,该公式会在最后一个mip级别上导致计算错误,从而导致出现垃圾颜色


还有一种可能的情况是硬件故障(你不会相信在过热的GPU和坏了的冷却器上会出现什么样的画面)或者驱动程序有问题。但这会在许多应用程序中导致工件,而不仅仅是在您的程序中。

不幸的是没有效果。谢谢。我今晚会试试这个,然后再打给你。谢谢发布一个完整的、最少的程序来演示问题。