【问题标题】:Is Vulkan positive X-axis pointing to the right of the screen?Vulkan 正 X 轴是否指向屏幕右侧?
【发布时间】:2020-02-22 10:06:18
【问题描述】:

所以我在处理vulkan坐标系的时候遇到了一些奇怪的事情。我习惯了opengl坐标系,所以当我在vulkan中创建视口时,我做到了

VkViewport viewport = {};
viewport.width = 800;
viewport.height = -600;
viewport.x = 0.0f;
viewport.y = 600;
viewport.minDepth = 0.0f;
viewport.maxDepth = 1.0f;

这样,我翻转了 y 轴,因此我假设 X 轴正向位于屏幕右侧,Y 轴正向位于屏幕上方,Z 轴正向指向屏幕。我对么? 但是当我用四个顶点画一个简单的正方形时,

(150, 50, 0.0), (50.0, 50, 0.0), (50.0, -50, 0.0), (150.0, -50, 0.0)

模型转换矩阵为单位,视图矩阵为

glm::lookAt(glm::vec3(0, 0, -500), glm::vec3(0, 0, 0), glm::vec3(0, 1, 0));

和投影矩阵

glm::perspective(glm::radians(45.0f), m_swapchainExtent.width / (float)m_swapchainExtent.height, 0.1f, 1000000.0f);

我得到了一个实际上在图像左侧的正方形。如何解释这一点,或者只是实际指向左侧的正 X 轴?

【问题讨论】:

    标签: graphics vulkan


    【解决方案1】:

    This link 讨论了 Vulkan 和 OpenGL 坐标系之间的差异。综上所述,Vulkan 的 Z 范围在[0, 1] 范围内而不是[-1, 1] 范围内,Y 轴是翻转的,但 X 轴是一样的。

    如果您要尝试使用负视口范围,您必须确保您已请求 Vulkan 1.1 或更高版本,或者需要 KHR_VK_maintainance1 扩展,否则指定负视口大小无效。

    我建议您从根本不使用矩阵开始,并以标准化的设备坐标(即在 -1 到 1 的范围内)来描述您的立方体。因此您可以使您的方形顶点坐标类似于

    { 0.25, 0.25, 0.0 }
    { 0.75, 0.25, 0.0 }
    { 0.75, -0.25, 0.0 }
    { 0.25, -0.25, 0.0 }
    

    渲染它(尽管它不会是一个正方形,除非你的窗口纵横比是 1.0),然后看看它是否在你期望的地方结束(在右边,在垂直中间)。如果是这样,那么您的问题在于您的矩阵转换之一,而不是 Vulkan API。

    【讨论】:

    • "Vulkan 的 Z 范围在 [0, 1] 而不是 [-1, 1]" 请注意,OpenGL 也可以通过 GL 4.5/ ARB_clip_control.
    • @Jherico nitpick:Vulkan 天生就是无头的。较高的归一化 y 只会在 VkImage 中以较高的纹素 y 结束(对于 x 也是如此)。在这种情况下,您能否扩展您对“Y 轴翻转”的确切含义的回答? OpenGL 做了哪些 Vulkan 没有做的事情(反之亦然),才能做到这一点?
    猜你喜欢
    • 2015-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多