像素完美:选择正确的校正 (OpenGL)
Pixel perfect: choosing the right correction (OpenGL)
我试图在 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) 时(相当于第 3 种情况),问题就消失了...
好的,现在我意识到第三个选项也不起作用:
检查您是否已将正确的屏幕尺寸传递给着色器。
当你创建window时,你定义了它的外部大小,但是当window有header/decorations时,放置渲染上下文的客户区可以更小。
因此您应该使用 GetClientRect()
询问客户区大小,或者在创建 window 之前通过调用 AdjustWindowRect()
找到 "correct" window 大小 -这将为您提供 window 大小,该大小将具有您最初想要的大小的客户区。
我试图在 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) 时(相当于第 3 种情况),问题就消失了...
好的,现在我意识到第三个选项也不起作用:
检查您是否已将正确的屏幕尺寸传递给着色器。
当你创建window时,你定义了它的外部大小,但是当window有header/decorations时,放置渲染上下文的客户区可以更小。
因此您应该使用 GetClientRect()
询问客户区大小,或者在创建 window 之前通过调用 AdjustWindowRect()
找到 "correct" window 大小 -这将为您提供 window 大小,该大小将具有您最初想要的大小的客户区。