【问题标题】:Flipping the viewport in Vulkan在 Vulkan 中翻转视口
【发布时间】:2017-08-08 13:55:21
【问题描述】:

来自规范:

VK_KHR_maintenance1

允许在 slink::VkViewport::height 字段中指定负高度以执行 y 反转 剪辑空间到帧缓冲区空间的转换。这允许应用程序避免 必须在着色器中使用 gl_Position.y = -gl_Position.y 也针对 其他 API。

我的物理设备支持版本1.0.42,并且我启用了VK_KHR_maintenance1。 当我在 VkViewport 结构中设置负高度时,我没有收到任何验证错误/警告。

vkCmdSetViewport(vkContext.commandBuffer, 0, 1, &viewport);

但是我在屏幕上也看不到任何东西,它是黑色的,如果我删除 viewport 中的负值,一切都会按预期呈现。我需要做任何其他事情来使用VK_KHR_maintenance1 extension 翻转视口吗?我只是在屏幕上渲染一个带有全屏视口的红色四边形。

VkViewport viewport = {};
viewport.x = 0.0f;
viewport.y = 0.0f;
viewport.width = 1024.0f;
viewport.height = -1024.0f;
viewport.minDepth = 0.0f;
viewport.maxDepth = 1.0f;
vkCmdSetViewport(vkContext.commandBuffer, 0, 1, &viewport);

顶点着色器:

void main() {
        vec4 positions[3] = {
        vec4(-1.0, -1.0, 0.0, 1.0),
        vec4(3.0, -1.0, 0.0, 1.0),
        vec4(-1.0, 3.0, 0.0, 1.0)
    };
    gl_Position = positions[gl_VertexIndex % 3];
}

片段着色器:

void main() {
    outFragColor = vec4(1,0,0,1);
}

【问题讨论】:

  • "但是我在屏幕上也看不到任何东西" 你在渲染什么?你的VS是什么样子的?你的投影矩阵是什么样的? viewport 包含什么?等等。没有看到您的代码,我们无法知道发生了什么。
  • @NicolBolas 添加了顶点和片段着色器

标签: glsl viewport vulkan


【解决方案1】:

只需计算一下即可。你有所有的数字,规范明确地列出了一切。

帧缓冲空间顶点坐标的 Y 分量方程为:

Yf = (Py / 2) Yd + Oy
Oy = viewport.y + viewport.height / 2.0
Py = viewport.height

Yf 是帧缓冲空间 Y 分量,Yd 是 NDC 空间 Y 分量。

如果你插入一个积极的height 1024,你会得到什么数字?对于 -1 的 Yd,您将获得 0.0 的 Yf。对于 3 的 Yd,您将获得 2048 的 Yf

在 Vulkan 中,“自然”视口变换通过将 -1 置于 viewport.x/y 并将 1 置于 viewport.width/height 来映射 NDC 空间。请记住:Vulkan 的图像具有左上角的原点,正值向下和向右移动。所以 0.0 的 Yf 位于顶部,而 2048 的 Yf 位于屏幕底部。因此,三角形(部分)位于视口的可见区域内。

鉴于此,当您使用否定的height 时会发生什么?数学没有改变;只是结果。对于 -1 的 Yd,您会得到 0.0 的 Yf,就像以前一样。对于 3 的 Yd,您会得到 -2048 的 Yf

那看起来像什么?好吧,视口的含义没有改变;只是数字。这意味着帧缓冲区图像的可见区域仍然在左上角,向下。因此,-2048 的值高于视口。

简而言之,负高度会翻转视口。但这会在视口原点翻转它,而不是在屏幕中心。视口原点位于左上角并向右下方。因此,翻转它会将之前在屏幕上可见的所有内容翻转。您现在正在查看屏幕的不同区域,在您的情况下该区域是空白的。

如果你想翻转视口中心周围的所有东西,那么你需要调整viewport.y来补偿负高度。具体来说,它需要是正高度。

【讨论】:

  • 谢谢你,一个很好的解释,当你输入负高度时,我认为 Vulkan 正在翻转视口并在场景后面移动原点:)
  • 尼可波拉斯引用的公式可以在Vulkan 1.2.148, Chapter 23找到。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多