Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 如何缩放与Imgui类似的原语?_Opengl_Geometry_Rectangles - Fatal编程技术网

Opengl 如何缩放与Imgui类似的原语?

Opengl 如何缩放与Imgui类似的原语?,opengl,geometry,rectangles,Opengl,Geometry,Rectangles,我希望我的渲染器的行为类似于imgui。 无论imgui应用程序有多大,imgui小部件窗口大小都不会改变 这就是imgui在分辨率为1280x720时的样子 这就是分辨率为1920x1017时的情况 基本体的大小始终相同 在我的应用程序中,调整窗口的大小会导致不同的侧面出现不同的厚度或令人不快的现象 我的应用程序未填充rect 1280x720 我的应用程序使用相同的rect 1920x1017 正如您所看到的,在这种情况下,更高的分辨率会导致未填充矩形的底面厚度不同于其他面(它可能不

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

这就是imgui在分辨率为1280x720时的样子

这就是分辨率为1920x1017时的情况

基本体的大小始终相同

在我的应用程序中,调整窗口的大小会导致不同的侧面出现不同的厚度或令人不快的现象

我的应用程序未填充rect 1280x720

我的应用程序使用相同的rect 1920x1017

正如您所看到的,在这种情况下,更高的分辨率会导致未填充矩形的底面厚度不同于其他面(它可能不会显示在照片中,但在屏幕上会显示出来,这非常烦人)

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

我该如何实现这一点?为什么它是这样工作的?
我问过imgui的创建者,但他告诉我这不是关于imgui的,他也无能为力

通常,无论以何种方式,您绘制的任何基本体最终都会在剪辑空间中结束,然后在规格化设备坐标中结束。可以将一些矩阵变换应用于输入位置或诸如此类,但顶点着色器根据定义输出剪辑空间坐标。然后将这些剪辑空间坐标投影到标准化设备坐标

在标准化设备坐标(NDC)中,视口(“屏幕”)在x和y方向上从-1延伸到1(因此称为“标准化”)。NDC是相对于视口的。这意味着,如果指定基本体的顶点,使其在NDC中的位置(-0.5,0.25)处结束,则意味着它沿x方向为屏幕全宽的1/4,沿y方向为5/8:

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

x_NDC = 2 * (50 + 0.5) / 800 - 1
y_NDC = 2 * (40 + 0.5) / 600 - 1
+0.5
解释了OpenGL中的采样位置位于像素网格中心的事实:

通常,要在近平面上的像素坐标(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

其中
W
H
是视口的宽度和高度,假设像素坐标的原点位于左下角。

x\u clip
y\u clip
是实际位置?由于我不太明白,您能否以不同的方式解释一下
+0.5
x_clip
y_clip
是顶点着色器应该返回的x和y坐标(例如,z可以是0,而w通常在2D渲染时设置为1)。
+0.5
是因为-1和1坐标表示视口边缘的位置,而不是第一个/最后一个像素的位置。我添加了另一个数字,希望能更好地解释这一点。嗯,我理解。那么,是否还有其他选择呢?有任何品牌的opengl宏/函数吗?这样的缩放是否足够有效,所以我不必担心渲染+30k sprites时会导致大问题?具体取决于您使用的OpenGL版本。但不在任何现代OpenGL核心配置文件中。至少我不知道。非常感谢你们的回答!现在我想我知道了一切让它工作的方法。