OpenGL广告牌插值问题

时间:2010-04-04 16:38:25

标签: opengl mipmaps

我有一个广告牌四边形,纹理映射到它上面。

这基本上是一些透明的文字。

广告牌从相机的角度向前和向后漂浮。

当广告牌移开(并且看起来更小)时,会出现闪烁效果 在文本边缘,实际纹理上有笔触边框。

我认为这是因为需要插值,因为通常X像素宽的图像现在仅显示为X的%,并且一些像素需要合并在一起。我猜它正在做最近的邻居什么的?任何人都可以指出我正确的方向控制opengl设置,我猜有一些方法可以通过调整纹理的处理方法来防止这种影响发生?

我认为这与它有关:

GL_NEAREST_MIPMAP_NEAREST

但是当我尝试将此设置为MIN过滤器并启用mip贴图时,我的纹理变得非常模糊和模糊......

我也尝试过:

GL_LINEAR_MIPMAP_LINEAR

显然是MIN滤镜的三线滤镜,但显示时我的图像非常模糊。 (看起来它是一个非常低的纹理)任何想法我做错了什么?

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); // trilinear

    glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);

更多代码:

        // Allocated memory needed for the bitmap context
    spriteData = (GLubyte *) calloc(width * height * 4, sizeof(GLubyte));
    // Uses the bitmap creation function provided by the Core Graphics framework. 
    spriteContext = CGBitmapContextCreate(spriteData, width, height, 8, width * 4, CGImageGetColorSpace(spriteImage), kCGImageAlphaPremultipliedLast);
    // After you create the context, you can draw the sprite image to the context.
    CGContextDrawImage(spriteContext, CGRectMake(0.0, 0.0, (CGFloat)width, (CGFloat)height), spriteImage);
    // You don't need the context at this point, so you need to release it to avoid memory leaks.
    CGContextRelease(spriteContext);

    // Use OpenGL ES to generate a name for the texture.
    glGenTextures(1, &spriteTexture[textureCount-1]); 

    // Bind the texture name. 
    glBindTexture(GL_TEXTURE_2D, spriteTexture[textureCount-1]);


    glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);


    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);



    // Specify a 2D texture image, providing the a pointer to the image data in memory
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, spriteData);
    // Release the image data
    free(spriteData);

纹理为512 x 512。

使用MIN滤镜时的模糊度示例: Blurry billboard http://i43.tinypic.com/2h2qe6u.jpg

当使用GL_NEAREST进行最小滤镜更清晰但令人讨厌的双线性和上面提到的闪烁时,动画为缩小: GL_NEAREST http://i42.tinypic.com/28a5kdf.jpg

2 个答案:

答案 0 :(得分:1)

如果您正在使用glu,我建议您尝试使用gluBuild2DMipmaps来创建mipmap并了解其他人如何做到这一点。

为了避免使用glu函数,我有时会看看Mesa的OpenGL实现来获得一些想法(我通常会尝试在我自己的项目中保留很多代码..我在OpenGL,D3D和其他之间分享了很多代码平台)。您可以尝试查看gluBuild2DMipmaps的Mesa实现(MesaLib)的来源,看看如何获​​得类似的效果。它出现在MesaLib的mipmap.c中,你最终可能会跳到bitmapBuild2DMipmaps的实现。

我不能保证这会带来好结果,但这是一个探索的途径。对于正在发生的事情的一般调试,您可以尝试的另一件事是将mipmap纹理输出到文件以供外部查看。所有这一切当然是在你用完随机切换标志并搜索其他人的代码以查看你是否错过任何状态函数之后。

答案 1 :(得分:1)

Mipmapping由正在绘制的片段的纹素与像素的比率控制(希望我的术语在那里是正确的)。你在屏幕上画了多大?

如果你在(例如)128x128处绘制它,你将获得mipmap level 2,因此模糊。

纹理应该以它们在屏幕上显示的大小创建,或者尽可能接近,而不是产生太多像素,让GPU选择不合适的mipmap级别......