我正在使用大像素图形制作2D游戏。为了达到这个效果,我将所有图像渲染到帧缓冲区,纹理比我的窗口小2倍。然后,我使用quad({{-1,-1},{1,-1},{1,1},{-1,1}}
)将此纹理渲染到窗口。
这很好用,但渲染到纹理时的坐标系有点奇怪。例如,当我使用
时glBegin(GL_POINTS);
glVertex2f(-0.75, -0.75);
glEnd();
它呈现2x2点。我希望这一点在(win_w * 1/8, win_h * 7/8)
but但是嘀嗒点在(win_w * 1/4, win_h * 3/4)
。
如果我从((win_w + 1) / 2, (win_h + 1) / 2)
更改帧缓冲纹理大小(比我的屏幕小2倍)
至((win_w + 3) / 4, (win_h + 3) / 4)
(比我的屏幕小4倍),该点现在的大小为4x4,位于(win_w * 1/2, win_h * 1/2)
(窗口中心)。
我认为这是不正确的。 AFAIK,framebuffer坐标系不依赖于帧缓冲纹理大小; 1,1
是任何纹理大小的右上角,对吗?
没有像这样的变换矩阵或某个字符串,因此OpenGL不能转换我的坐标。
我仍然可以使用这个奇怪的坐标系进行渲染,但我不明白为什么它会这样工作。
所以,问题是:我希望渲染顶点与窗口内的任何帧缓冲纹理大小相同。可能吗? (我不想在着色器中使用trasformation矩阵,因为它应该在没有它们的情况下工作。我希望有另一种解决方案。)
着色器:
// Vertex:
#version 430
in layout(location = 0) vec2 pos;
out vec2 vPos;
void main()
{
vPos = pos;
gl_Position = vec4(pos.x, pos.y, 0, 1);
}
// Fragment:
#version 430
uniform layout(location = 0) sampler2D tex;
in vec2 vPos;
out vec4 color;
void main()
{
color = texture(tex, (vPos + 1) / 2);
}
答案 0 :(得分:0)
问题解决了。 (感谢@RetoKoradi。)现在我的代码看起来像这样:
glViewport(0, 0, 800, 600);
/// Switch shaders and framebuffer
DrawQuadWithTexture();
glViewport(0, 0, 400, 300);
/// Switch shaders and framebuffer
DrawAllStuff();