【发布时间】:2014-08-05 15:48:41
【问题描述】:
我正在制作带有大像素图形的 2D 游戏。为了达到这种效果,我将所有图像渲染到纹理比我的窗口小 2 倍的帧缓冲区。然后,我使用四边形 ({{-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)
但关键点位于(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,帧缓冲区坐标系不依赖于帧缓冲区纹理大小; 1,1 是任何纹理大小的右上角,对吧?
没有像这样的变换矩阵或类似的东西,所以OpenGL不能变换我的坐标。
我仍然可以使用这个奇怪的坐标系进行渲染,但我不明白为什么会这样。
所以,问题是:我想渲染顶点在窗口内的相同位置,具有任何帧缓冲区纹理大小。是否可以? (我不想在着色器中使用变换矩阵,因为没有它们它应该可以工作。我希望有另一种解决方案。)
着色器:
// 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);
}
【问题讨论】:
-
从症状来看,您可能在开始渲染到 FBO 之前错过了
glViewport()调用。
标签: opengl