为什么视口的宽度/高度在 glViewportIndexed 中从 int 变为浮动

vik*_*eid 2 opengl opengl-4

glViewport:宽度/高度是整数(像素)。

但是 glViewportIndexed 在浮点数中具有这些值。让它们浮动有什么好处。我的理解是基于像素总是整数这一事实。

Ret*_*adi 5

看起来glViewport*()调用指定像素矩形。但如果你查看 OpenGL 渲染管线的细节,情况并非如此。它们指定视口转换的参数。这是将标准化设备坐标 (NDC) 映射到窗口坐标的转换。

如果xyw并且h是你指定的视口的尺寸,xNdcyNdc你的NDC坐标,视口转换可以这样写:

xWin = x + 0.5 * (xNdc + 1.0) * w;
yWin = y + 0.5 * (yNdc + 1.0) * h;
Run Code Online (Sandbox Code Playgroud)

在该计算中,xNdcyNdc当然浮点值的,在其通常的(-1.0,1.0)范围内。我看不出有什么好的理由为什么x, y,wh在这个计算中应该被限制为整数值。此转换在光栅化之前应用,因此无需将任何内容四舍五入到像素单位。

视口尺寸不需要整数值甚至可能很有用。假设您有一个大小为 1000x1000 的窗口,并且您希望在窗口中渲染 9 个大小相同的子视图。API 没有理由阻止您做最自然的事情:使每个子视图的大小为 333.3333x333.3333,并将这些大小用于glViewport().

如果您查看glScissorIndexed()比较,您会注意到它仍然需要整数坐标。这完全有道理,因为gScissor()实际上确实指定了窗口中的像素区域,与glViewport().