【问题标题】:Pixel perfect: choosing the right correction (OpenGL)像素完美:选择正确的校正(OpenGL)
【发布时间】:2019-11-18 03:17:18
【问题描述】:

我试图在 OpenGL 中使用四边形绘制像素完美的位图...令我惊讶的是,丢失了一行非常重要的像素:(绿色正常,红色不好)

四边形的大小为 30x30 像素,左上角是红色的 2x2。

  • 谁能解释发生了什么?
  • OpenGL 如何决定像素的放置位置?
  • 我应该选择哪种更正方式?

纹理使用 GL_NEAREST。

    glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);

我不使用 glViewport 和 glOrtho。相反,我通过制服将屏幕尺寸发送到着色器:

uniform float cw;
uniform float ch;
...
gl_Position = vec4(     -1.0f + 2.0f*(in_pos.x + in_offset.x)/cw, 
                         1.0f - 2.0f*(in_pos.y + in_offset.y)/ch,
                         0.0f, 1.0f);

但这似乎不是问题的根源,因为当我在着色器中添加 (0.5,0.5) 时(相当于第三种情况),问题就消失了......

好的,现在我意识到第三个选项也不起作用:

【问题讨论】:

  • 只有当你缩小精灵时,这条线才会丢失。你为什么感到惊讶?
  • 什么意思?我只是在着色器内缩放顶点坐标。纹理坐标始终为 (0,0),(1,1)... 并且位图数据对于所有四边形都是恒定的并且正确。
  • 一定有一些缩减。移动大约半个像素,或将其放大半个像素 - 永远不会使线条消失。如果您将过滤更改为线性,您应该会看到该行,这将确认存在缩减。
  • 您对该声明的确定程度如何?你能证明 GL_NEAREST 在 1:1 时不能产生缺失的行吗?我不做任何缩放。
  • 是的,我很确定,虽然可能不会产生非常正式的证据:) 作为一个疯狂的猜测,检查你是否通过了正确的屏幕尺寸。如果您在 Windows 上,请确保您使用的是客户矩形区域而不是整个窗口大小。

标签: opengl pixel-perfect


【解决方案1】:

检查您是否已将正确的屏幕尺寸传递给着色器。

当你创建窗口时,你定义了它的外部大小,但是当窗口有标题/装饰时,放置渲染上下文的客户区可以更小。

因此,您应该使用GetClientRect() 询问客户区大小,或者在创建窗口之前通过调用AdjustWindowRect() 找到“正确”的窗口大小 - 这将为您提供具有与您一样大小的客户区的窗口大小最初想要。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-08
    • 1970-01-01
    • 2019-10-15
    • 2011-04-12
    • 2022-06-27
    相关资源
    最近更新 更多