将像素长度转换为OPENGL坐标

3

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

目前我只能手动猜测尺寸范围在-1到1之间。


你能详细说明一下你想要做什么吗? - derhass
当我使用一个假装是盒子贴图的材质来创建一个飞机时,它会以矩形的形式显示出来。因此,我需要进行补偿。这可能是因为OpenGL根据窗口大小缩放高度和宽度的缘故。 - rambodash
3
但这与“将像素长度转换为OpenGL坐标”无关。你所描述的只是纵横比。通常在投影矩阵中进行此校正。 - derhass
2个回答

6
如果您想精确地处理像素,先前发布的答案是不够的。它计算的是像素的左下角。但是,要把一个顶点精确地放在一个像素上,您需要使用像素中心的坐标。
例如,对于宽度为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

4
问题相当模糊,但我认为问题在于窗口坐标范围在-1到1之间;由于屏幕是矩形的,四边形将被绘制成矩形而不是正方形。
不建议使用“像素坐标”进行绘制,因为所有显示器的分辨率和宽高比都不同。但是,如果您确定这就是您想要做的事情,那么应该这样做:
如果您正在使用OpenGL 3+的着色器: - 只需将x坐标除以窗口宽度的一半并减去1即可。 - 对于y坐标做同样的操作,但除以的是窗口高度的一半而不是宽度的一半。
如果您正在使用旧的立即模式OpenGL(顺便说一下,这已经过时很久了),则应查看glOrtho。
请注意,以上所有内容仅适用于正交投影(2D)。
如果你想进行3D绘制,一定不要以任何方式在“像素坐标”上进行绘制。相反,可以将宽度或高度乘以相关的宽高比(即宽度/高度或高度/宽度),或者将宽高比集成到透视投影中(如果要创建自己的着色器)。 通常情况下,OpenGL不会按像素绘制。你应该在OpenGL自己的坐标系中进行绘制,然后OpenGL会将其转换为像素。这正是它在3D渲染方面如此强大的原因。这种方法更加方便,因为显示器的分辨率和宽高比有所不同。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接