根据此页面:
https://matthewwellings.com/blog/the-new-vulkan-coordinate-system/
Vulkan坐标系具有:
X轴向右增加
Y轴向下增加
Z轴进入屏幕
在我自己的测试中,我可以确认X和Y轴。但是,对我来说,-Z指向屏幕,而不是+ Z。我的意思是:
随着X的增加,场景会向左移动,因为相机向右移动。
随着Y的增加,场景会向上移动,因为相机向下移动。
随着Z的增加,场景会移开,因为相机向后移动。
我相信链接页面位于我自己的学习代码上,因此我不确定为什么会得到这种效果。
我的场景包括一个纹理四边形。这是我正在使用的代码:
C ++
// No rotation
auto identMat = glm::mat4(1.0f);
auto rotAmount = 0.0f;
auto rotAxis = glm::vec3(0.0f, 0.0f, 1.0f);
mUBO.mModel = glm::rotate(identMat, rotAmount, rotAxis);
float eyeXPos = 0.0f;
float eyeYPos = 0.0f;
float eyeZPos = time * 1.0f;
auto eyePosition = glm::vec3(eyeXPos, eyeYPos, eyeZPos);
auto centerPosition = glm::vec3(0.0f, 0.0f, 0.0f);
auto upAxis = glm::vec3(0.0f, 1.0f, 0.0f);
mUBO.mView = glm::lookAt(eyePosition, centerPosition, upAxis);
const float kWindowWidth = 800;
const float kWindowHeight = 600;
auto verticalFOV = glm::radians(45.0f);
auto aspectRatio = kWindowWidth / kWindowHeight;
auto nearPlane = 0.1f;
auto farPlane = 100.0f;
mUBO.mProj = glm::perspective(verticalFOV, aspectRatio, nearPlane, farPlane);
顶点着色器
layout(location = 0) in vec2 inPosition;
// ...
gl_Position = ubo.proj * ubo.view * ubo.model * vec4(inPosition, 0.0, 1.0);
------------------------编辑------------------------- ---------
我不会为此或诸如此类而睡不着。但是,由于我决定给自己买一件Vulkan T恤,所以我继续为这个问题创建了一个测试用例,以防万一有人好奇地运行它。更新UBO的函数名称称为UpdateUniformBuffer()。该代码是自包含的,只是需要GLFW库。此外,它需要最新的C ++编译器(我使用VS2017)。
T恤:https://teespring.com/vulkan#pid=2&cid=2397&sid=front
main.cpp
https://pastebin.com/RWpNDfjc
TestRenderer.hpp
https://pastebin.com/09TTF1e3
TestRenderer.cpp
https://pastebin.com/wCDV0CEk
shader.vert
https://pastebin.com/fb5f4hvF
shader.frag
https://pastebin.com/CCVpnmwj
最佳答案
使用glm时,只需定义GLM_FORCE_DEPTH_ZERO_TO_ONE
。它将矩阵深度范围映射到Vulkans的[0 .. + 1]范围,而不是OpenGL的[-1 .. + 1]范围。
关于vulkan - Vulkan坐标系:+ Z向内吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48924725/