将MVP倒置后的Vulkan淘汰问题

将MVP倒置后的Vulkan淘汰问题,mvp,vulkan,culling,Mvp,Vulkan,Culling,我在android设备上运行了一个vulkan渲染器,结果图像是颠倒的。 我不想在VkViewport定义中设置负高度,因为有代码和注释表明矩阵被转换为Y 我试图在下面的代码中反转mvp[5]矩阵数组的符号,但在渲染图像中遇到了消隐问题 // update opengl projection matrix to vulkan conventions: // Vulkan clip space has inverted Y and half Z ( Z - [0, 1] instead of [

我在android设备上运行了一个vulkan渲染器,结果图像是颠倒的。 我不想在VkViewport定义中设置负高度,因为有代码和注释表明矩阵被转换为Y

我试图在下面的代码中反转mvp[5]矩阵数组的符号,但在渲染图像中遇到了消隐问题

// update opengl projection matrix to vulkan conventions:
// Vulkan clip space has inverted Y and half Z  ( Z - [0, 1] instead of [-1, 1])
float zNear = r_znear->value;
float m10 = -zFar / (zFar - zNear);

float py = tan(fovY * (M_PI / 360.0f));
float px = tan(fovX * (M_PI / 360.0f));

mvp[0] = 1.0f / px;
mvp[1] = 0;
mvp[2] = 0;
mvp[3] = 0;

mvp[4] = 0;
mvp[5] = -1.0f / py;
mvp[6] = 0;
mvp[7] = 0;

mvp[8] = 0;
mvp[9] =  0;
mvp[10] = m10;
mvp[11] = -1.0f;

mvp[12] = 0;
mvp[13] = 0;
mvp[14] = zNear * m10;
mvp[15] = 0;

我知道z轴是倒转的,但此时我不知道如何解决这个问题。

要在Y轴上翻转矩阵:

mvp[5] = -mvp[5];
mvp[7] = -mvp[7];
然后,可以在VkPipelineRasterizationStateCreateInfo结构中反转剔除顺序:

// with frontFace field, replace:
createInfo.frontFace = VK_FRONT_FACE_CLOCKWISE;
// by:
createInfo.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;

// OR with cullMode field, replace:
createInfo.cullMode = VK_CULL_MODE_FRONT_BIT;
// by:
createInfo.cullMode = VK_CULL_MODE_BACK_BIT;