欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 时评 > 【Vulkan入门】21-Coordinate Systems

【Vulkan入门】21-Coordinate Systems

2025/2/25 0:19:02 来源:https://blog.csdn.net/patronwa/article/details/145014363  浏览:    关键词:【Vulkan入门】21-Coordinate Systems

@TOC

先叨叨

我在开发的时候发现画出来的图形跟我指定的坐标不一致,在Y轴上是反的。
按照OpenGL的经验,图形采用右手坐标:X轴正方向向右,Y轴正方向向上,Z轴正方向向外。
因此我按照下图的坐标设置了三个点, 描画三角形。

在这里插入图片描述
但是画出的图形却不是我期望的。
在这里插入图片描述
在调查了原因之后,我觉得有必要向大家介绍一下Vulkan的坐标系统。

归一化的设备坐标系

归一化的设备坐标系(normalized device coordinates, 缩写为NDC), NDC就是我们给Vulkan输入顶点的坐标系。
在Vulkan中NDC与OpenGL基本一致,采用右手坐标系。X轴正方向向右,Y轴正方向向上,Z轴正方向向外。X和Y轴的范围都是[-1.0f, 1.0f]. 但Z轴的坐标范围为[0.0f, 1.0f];

视口坐标系

视口坐标系,是指最终渲染图像的坐标系。
Vulkan的视口坐标系跟OpenGL或其他窗口系统坐标系有所不同。一般的窗口系统(Qt、MFC、SDL、Wayland等)的视口坐标都是以左上角为原点,X轴正方向向右,Y轴正方向向下。
在这里插入图片描述
但Vulkan的视口坐标是以左下角为原点,X轴正方向向右,Y轴正方向向上。
在这里插入图片描述

归一化坐标与视口坐标结合

综上,Vulkan的坐标系统如下:
在这里插入图片描述
Vulkan在向Framebuffer中渲染时是从视口的原点开始渲染,因此Framebuffer中的第一行是视口坐标最底层(Y=0)的像素信息,Framebuffer中的最后一行是视口坐标最顶层(Y = 视口高度)的像素信息。

当我们将Framebuffer交给窗口描画时,窗口按照窗口坐标,从Framebuffer第一行从上到下显示,因此导致Y轴的图像看起来是反过来的。

因此我们将Framebuffer交给窗口系统之前,需要调转一下Framebuffer每行的内存位置。

解决问题

SDL有一个方法SDL_RenderTextureRotated可以将Framebuffer的Y轴进行反转,因此我们用它代替SDL_RenderTexture便可以解决Y轴反转的问题。

    if (!SDL_RenderTextureRotated(renderer, texture, nullptr, nullptr, 0, NULL, SDL_FLIP_VERTICAL)){SDL_Log("Couldn't render texture: %s", SDL_GetError());return SDL_APP_FAILURE;}// if (!SDL_RenderTexture(renderer, texture, nullptr, nullptr))// {//     SDL_Log("Couldn't render texture: %s", SDL_GetError());//     return SDL_APP_FAILURE;// }

在这里插入图片描述

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词