gpt4 book ai didi

glsl - 在 Vulkan 中翻转视口(viewport)

转载 作者:行者123 更新时间:2023-12-04 02:09:06 24 4
gpt4 key购买 nike

从规范:

VK_KHR_maintenance1

Allow negative height to be specified in the slink::VkViewport::height field to perform y-inversion of theclip-space to framebuffer-space transform. This allows apps to avoidhaving to use gl_Position.y = -gl_Position.y in shaders also targetingother APIs.


我的物理设备支持版本 1.0.42我启用了 VK_KHR_maintenance1 .
当我在 VkViewport 中设置负高度时,我没有收到任何验证错误/警告结构。
vkCmdSetViewport(vkContext.commandBuffer, 0, 1, &viewport);
但是,如果我删除 viewport 中的负值,我在屏幕上也看不到任何东西,它是黑色的。一切都按预期呈现。我需要做任何其他事情来使用 VK_KHR_maintenance1 extension 翻转视口(viewport)吗? ?我只是在屏幕上渲染一个带有全屏视口(viewport)的红色四边形。
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);
}

最佳答案

只是通过数学。您拥有所有数字,并且规范明确列出了所有数字。
帧缓冲空间顶点坐标的 Y 分量方程为:

Yf = (Py / 2) Yd + Oy
Oy = viewport.y + viewport.height / 2.0
Py = viewport.height
在哪里 Yf是帧缓冲空间 Y 分量和 Yd是 NDC 空间 Y 分量。
如果你插入一个积极的 height 1024,你得到什么数字?对于 Yd -1,你得到一个 Yf 0.0。对于 Yd 3,你得到一个 Yf 2048 年。
在 Vulkan 中,“自然”视口(viewport)变换通过将 -1 置于 viewport.x/y 来映射 NDC 空间。 , 1 在 viewport.width/height .请记住:Vulkan 的图像具有左上角的原点,正值向下和向右移动。所以 Yf 0.0 位于顶部, Yf 2048 位于屏幕底部。因此,三角形(部分)位于视口(viewport)的可见区域。
鉴于此,当您使用负数 height 时会发生什么? ?数学没有改变;只是结果。对于 Yd -1,你得到一个 Yf 0.0,很像以前。对于 Yd 3,你得到一个 Yf -2048 的。
那看起来像什么?好吧,视口(viewport)的含义没有改变;只是数字。这意味着帧缓冲区图像的可见区域仍然在左上角,向下。因此,-2048 的值在视口(viewport)上方。
简而言之,负高度会翻转视口(viewport)。但这会在视口(viewport)原点翻转它,而不是在屏幕中心。视口(viewport)原点位于左上角并向右下方。因此,翻转它会将之前在屏幕上可见的所有内容翻转。您现在正在查看屏幕的不同区域,在您的情况下该区域是空白的。
如果要翻转视口(viewport)中心周围的所有内容,则需要调整 viewport.y以补偿负高度。具体来说,它需要是正高度。

关于glsl - 在 Vulkan 中翻转视口(viewport),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45570326/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com