将像素长度转换为OPENGL坐标

时间:2015-05-14 16:26:24

标签: opengl

如何将像素长度(即512像素宽度和高度的图像)转换为精确的OpenGL坐标?

我现在所能做的就是尝试在-1和1之间手动猜测大小。

2 个答案:

答案 0 :(得分:3)

如果您想精确地处理像素,则之前发布的答案是不够的。它计算像素的左下角。但是要将顶点精确放置在像素上,您需要使用像素 center 的坐标。

在宽度为512像素且没有应用任何变换的示例中,这些像素跨越NDC坐标范围[-1.0, 1.0]。这意味着每个像素的宽度在NDC空间中为2.0 / 512

例如,对于第一个像素,如果将其视为小方块,则其坐标范围为-1.0-1.0 + 2.0 / 512。因此,它的中心位于NDC空间的-1.0 + 1.0 / 512

对于一般窗口宽度w和高度h进行推广,在水平方向上索引为i且在垂直方向上为索引k的像素坐标(从下到上)顶部)是:

x = -1.0 + i * (2.0 / w) + (1.0 / w) = (2.0 * i + 1.0) / w - 1.0
y = -1.0 + k * (2.0 / h) + (1.0 / h) = (2.0 * k + 1.0) / h - 1.0

答案 1 :(得分:2)

这个问题很模糊,但正如我所看到的那样,问题是窗口坐标的范围正如你所说的介于-1到1之间;由于屏幕是一个矩形,四边形将被绘制为矩形而不是方形。

不建议绘制“像素坐标”,因为所有显示器的分辨率不同,纵横比不同。但是,如果您确定这是您想要做的,那么您就是这样做的:

如果您使用OpenGL 3 +着色器:

  • 只需将x坐标除以窗口宽度的一半,然后减去1.

  • 对y坐标执行相同操作,但除以高度的一半而不是宽度的一半。

如果您使用旧的即时模式OpenGL(顺便提一下,推荐并且很久以前已过时),那么您应该查看glOrtho

请注意,以上所有内容仅适用于正投影(2D)。

如果你想用3D绘图,不应该以任何方式绘制“像素坐标”。相反,如果要创建自己的着色器,请将宽度或高度乘以相关的宽高比(即宽度/高度或高度/宽度),或将宽高比整合到透视投影中。

通常,OpenGL不会按像素绘制。您将绘制到OpenGL自己的坐标系中,然后OpenGL将其转换为像素。这使它对3D渲染如此强大。由于显示器分辨率和宽高比不同,这种方法更加方便。