gpt4 book ai didi

c++ - 如何减少图像/纹理中的 "flickering"薄元素?

转载 作者:太空宇宙 更新时间:2023-11-04 14:29:03 26 4
gpt4 key购买 nike

标题听起来有点乱,但我不想写得太长,所以请耐心阅读......

我正在编写一个非常简单的 OpenGL 演示,它将图像加载为纹理,然后在屏幕上无限地水平滚动图像。以下是我如何加载纹理并渲染单帧:

void load_texture(char* filename)
{
glEnable(GL_TEXTURE_2D);
gl_texture = SOIL_load_OGL_texture(filename, SOIL_LOAD_AUTO, SOIL_CREATE_NEW_ID, SOIL_FLAG_MIPMAPS | SOIL_FLAG_INVERT_Y);
glBindTexture(GL_TEXTURE_2D, gl_texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glBindTexture(GL_TEXTURE_2D, 0);
}

void render_single_frame()
{
glBindTexture(GL_TEXTURE_2D, gl_texture);
{
glBegin(GL_QUADS);
{
float delta = fmod(1.0f / FRAME_RATE / pan_seconds * current_frame, 1.0f);
glTexCoord2f(0.0f + delta, 0.0f); glVertex2f(-1.0f, -1.0f);
glTexCoord2f(1.0f + delta, 0.0f); glVertex2f(+1.0f, -1.0f);
glTexCoord2f(1.0f + delta, 1.0f); glVertex2f(+1.0f, +1.0f);
glTexCoord2f(0.0f + delta, 1.0f); glVertex2f(-1.0f, +1.0f);
}
glEnd();
}
glBindTexture(GL_TEXTURE_2D, 0);
glutSwapBuffers();
glFinish();
current_frame++;
}

...其中 FRAME_RATE 是目标帧速率,pan_seconds 是滚动整个图像所需的秒数。

总体而言,该演示运行良好,但为了吹毛求疵,我制作了一个测试图像,其中包含非常细的元素 - 一些细文本和黑色背景上的 1 像素宽的垂直线(在最右边)。

Test image

当这张图片被输入到演示中时,当 pan_seconds 很高(即图片滚动缓慢)时,问题就出现了——所有这些元素都会明显闪烁(亮度波动),最明显的是存在对于垂直线。

我的分析是,高 pan_seconds 会导致小数 delta,即子像素移动,并且 OpenGL 必须过滤纹理以确定像素的颜色。以垂直线为例,双线性过滤(GL_LINEAR)的插值在大多数情况下会产生2像素宽的灰色线,人眼感知为 1 像素宽,但同时与原始线相比会显得不那么亮。

虽然这无助于解决问题...将过滤器模式更改为 GL_NEAREST 会破坏平滑的滚动效果;更改为 GL_LINEAR_MIPMAP_LINEAR 确实消除了闪烁,但代价是图像明显模糊,这是 Not Acceptable 结果。

有没有办法在不损失太多清晰度的情况下减少这种闪烁,或者我必须相信自己的理论分析并认为这是不可能的?

最佳答案

您可以使用等于像素的坐标,例如

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-w/2.f, +w/2.f, -h/2.f, h/2.f, ZNEARCLIP * -1.f, ZFARCLIP * -1.f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glViewport(0, 0, w, h);

如果您现在在 x 和 y 为整数时绘制一条线,则该线的宽度应为 1 像素,并且不会跨越超过 2 个像素的插值。

关于c++ - 如何减少图像/纹理中的 "flickering"薄元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54143258/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com