Vulkan坐标系:是+ Z向内?

时间:2018-02-22 10:11:57

标签: vulkan

根据此页面: 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

2 个答案:

答案 0 :(得分:1)

当您使用glm时,只需定义GLM_FORCE_DEPTH_ZERO_TO_ONE即可。它将矩阵深度范围映射到Vulkans的[0 .. + 1]范围,而不是OpenGL的[-1 .. + 1]范围。

答案 1 :(得分:0)

您可以从8 options选择自己的深度测试。因此,只要将深度缓冲区清除为正确的值并使用正确的深度测试,它的方向就无关紧要。

opengl和vulkan之间的最大区别是NDC深度从0到1而不是-1到1在opengl中。这有助于避免在使用浮点深度缓冲区时丢失精度。