完美像素:选择正确的校正(OpenGL)

the*_*own 5 opengl pixel-perfect

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

方形的大小为30x30像素,红色2x2在左上角。

在此处输入图片说明

  • 有人可以解释发生了什么吗?
  • OpenGL如何决定将像素放置在哪里?
  • 我应该选择哪个更正?

纹理使用GL_NEAREST。

    glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
Run Code Online (Sandbox Code Playgroud)

我不使用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);
Run Code Online (Sandbox Code Playgroud)

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

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

在此处输入图片说明

Vla*_*lad 4

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

创建窗口时,定义其外部尺寸,但是当窗口具有标题/装饰时,放置渲染上下文的客户区域可能会更小。

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