opengl - 为什么视口(viewport)的宽度/高度在 glViewportIndexed 中从 int 变为 float

标签 opengl opengl-4

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

但是 glViewportIndexed 具有这些 float 值。让它们 float 有什么好处。我的理解是基于像素始终是整数这一事实。

最佳答案

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

如果 xywh 是您指定的视口(viewport)尺寸,xNdcyNdc 你的 NDC 坐标,视口(viewport)变换可以这样写:

xWin = x + 0.5 * (xNdc + 1.0) * w;
yWin = y + 0.5 * (yNdc + 1.0) * h;

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

视口(viewport)尺寸不需要整数值甚至可能非常有用。假设你有一个大小为 1000x1000 的窗口,你想在窗口中渲染 9 个大小相等的 subview 。 API 没有理由阻止您做最自然的事情:将每个 subview 的大小设置为 333.3333x333.3333,并将这些大小用于 glViewport() 的参数。

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

关于opengl - 为什么视口(viewport)的宽度/高度在 glViewportIndexed 中从 int 变为 float,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24199841/

相关文章:

c++ - 调用 XCreateWindow() 时产生 GLX 错误的 XLib

opengl - OpenGL 有多强大?

opengl - 使用统一的 sampler2d[] 时出现无法解释的行为

ruby - 如何在 Ruby 中创建 OpenGL 3.x 或 4.x 上下文?

c - OpenGL 着色器编译垃圾错误

c++ - OpenGL 中的第三个三角形顶点在窗口中渲染时显示为 0.0

c++ - 使用顶点数组、四边形数组创建四边形网格

c++ - 从屏幕底部绘制纹理

c++ - 无法显示世界中的顶点

c++ - 通过 TCS 和 TES 传递数据