Порядок намотки лицевой стороны Vulkan - PullRequest
1 голос
/ 07 ноября 2019

Я настраиваю Vulkan VkPipelineRasterizationStateCreateInfo для использования порядка намотки CCW:

 VkPipelineRasterizationStateCreateInfo rasterizer = {};
 rasterizer.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
 rasterizer.depthClampEnable = VK_FALSE;
 rasterizer.rasterizerDiscardEnable = VK_FALSE;
 rasterizer.polygonMode = VK_POLYGON_MODE_FILL;
 rasterizer.lineWidth = 1.0f;
 rasterizer.cullMode = VK_CULL_MODE_BACK_BIT;
 rasterizer.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
 rasterizer.depthBiasEnable = VK_FALSE;

Мое состояние сборки использует треугольный веер для рисования четырехугольника:

  VkPipelineInputAssemblyStateCreateInfo inputAssembly = {};
 inputAssembly.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
 inputAssembly.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN;
 inputAssembly.primitiveRestartEnable = VK_FALSE;

Вот мой буфер вершин:

 const  VertexPos2Col3 vertices[4] = {
{{0.5f,  0.5f}, {1.0f, 1.0f, 1.0f}},
{{-0.5f, 0.5f}, {0.0f, 1.0f, 0.0f}},
{{-0.5f, -0.5f}, {0.0f, 0.0f, 1.0f}},
{{ 0.5f, -0.5f}, {0.0f, 0.0f, 1.0f}}
};

Порядок вершин против часовой стрелки. Но примитив появляется только если я установил rasterizer.frontFace = VK_FRONT_FACE_CLOCKWISE; Почему это так?

Информация о системе:

Windows 10, NVIDIA RTX3000, драйвер: 431,86

1 Ответ

2 голосов
/ 07 ноября 2019

Это потому, что Vulkan использует другую систему координат, чем, например, OpenGL. Источник Vulkan находится в верхнем левом углу.

Таким образом, вы должны справиться с этим, либо изменив порядок вершин / индексов, перевернув область просмотра, либо изменив пение gl_position.y в своем вершинном шейдере. Если ваша цель поддерживает расширения VK_KHR_maintenance1, то проще всего было бы использовать отрицательную высоту , чтобы перевернуть окно просмотра.

...