如何缩放类似于Imgui的图元?

时间:2018-07-29 14:42:36

标签: opengl geometry rectangles

我希望渲染器的行为类似于imgui。 无论imgui应用程序具有什么尺寸,imgui小部件窗口的大小都不会改变。

当分辨率为1280x720时imgui就是这样

https://developer.mozilla.org/en-US/docs/Web/CSS/scroll-behavior

这就是分辨率为1920x1017时的外观

enter image description here

原始元素始终都是相同大小

在我的应用程序中,

调整窗口大小会导致不同侧面的厚度不同或出现不愉快的现象。

我的应用未填充矩形1280x720

enter image description here

我的应用使用相同的矩形1920x1017

enter image description here

如您所见,更高的分辨率导致在这种情况下,未填充的矩形的底面与其他侧面的厚度不同(可能未在照片中显示,但在屏幕上显示出来,这很烦人)。

imgui尚未遇到此问题。我的应用程序渲染器几乎相同(没有几个高级选项)。

我该如何实施?为什么会这样工作? 我问过imgui创作者,但他告诉我这与imgui无关,他无能为力。

1 个答案:

答案 0 :(得分:1)

通常,您绘制的任何图元都会以一种或另一种方式最终出现在剪辑空间中,然后归一化为设备坐标。您可以将一些矩阵变换应用于输入位置或其他任何东西,但是根据定义,顶点着色器将输出剪贴空间坐标。然后将这些剪贴空间坐标投影到归一化的设备坐标。

在归一化设备坐标(NDC)中,视口(“屏幕”)在x和y方向上从-1扩展到1(因此称为“归一化”)。 NDC相对于您的视口。这意味着如果您指定图元的顶点以使其终止于NDC中的位置(-0.5,0.25),则意味着它将是沿x的屏幕全宽的1/4,沿y的5/8:

illustration of NDC

如果要将图元放置在视口内的特定像素位置,则必须计算它们的坐标,以使它们最终位于对应的NDC坐标处。例如,假设您有一个800×600的视口,并且想在像素坐标(50,40)处放置一个顶点。在这种情况下,您希望顶点坐标最终成为

x_NDC = 2 * (50 + 0.5) / 800 - 1
y_NDC = 2 * (40 + 0.5) / 600 - 1

+ 0.5是为了说明OpenGL中的采样位置位于像素网格的中心这一事实:

enter image description here

通常,要将顶点放置在近平面上的像素坐标(x,y)上,您希望顶点着色器返回该坐标

x_clip = 2.0f * (x + 0.5f) / W - 1
y_clip = 2.0f * (y + 0.5f) / H - 1
z_clip = 0
w_clip = 1

其中WH是视口的宽度和高度,并假设像素坐标的原点是左下角。