【问题标题】:Strange coordinates when rendering to framebuffer with texture使用纹理渲染到帧缓冲区时出现奇怪的坐标
【发布时间】: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


【解决方案1】:

问题解决了。 (感谢@RetoKoradi。)现在我的代码如下所示:

glViewport(0, 0, 800, 600);
/// Switch shaders and framebuffer
DrawQuadWithTexture();
glViewport(0, 0, 400, 300);
/// Switch shaders and framebuffer
DrawAllStuff();

【讨论】:

    猜你喜欢
    • 2016-09-27
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多