Я написал программу, которая рисует сетки вместе с их каркасом.
Между треугольниками и линией идет z-борьба.
Для решения этой проблемы я использую смещение глубины в конвейере, рисующем треугольники.
Я бы предпочел применить к строкам обратное смещение, поскольку оно лучше соответствовало бы моей организации кода. Однако в спецификации Vulkan я вижу только смещение глубины, относящееся к «многоугольникам»:
25.9.3. Смещение глубины
Значения глубины всех фрагментов, созданных в результате растеризации многоугольника, могут быть смещены (смещены) на одну глубину. значение смещения, вычисляемое для этого многоугольника.
Это меня немного огорчило.
Но я дал ему шанс и... это сработало! Вместо этого мне действительно удалось применить смещение глубины к линиям!
Вот мне и интересно, это правильное поведение? Считаются ли линии многоугольниками? Или это ошибка в моем драйвере Vulkan?
Я использую Radeon RX6600.
Обновлено:
Я нашел это в спецификации:
25.10. Полигоны
Многоугольник получается в результате разложения полосы треугольника, веера треугольников или серии независимых треугольников. Нравится баллы и сегментов линий, растеризация полигонов контролируется несколькими переменные в структуре VkPipelineRasterizationStateCreateInfo.





Похоже, в решении этой проблемы добавлен текст:
Смещение глубины применяется к примитивам топологии треугольника, полученным растеризатор независимо от полигонального режима. Также может быть применено смещение по глубине. к примитивам топологии линий и точек, полученным растеризатором.
Вот и ответ. Часть «может» вам не сильно поможет и предполагает, что вместо этого вам придется применить смещение к полигонам, чтобы их можно было переносить между устройствами. Я также подозреваю, что большинство людей в любом случае сначала думают о применении смещения глубины к многоугольникам, как это сделали вы, и поэтому мягкость его применения к линиям не так уж и вредна.
Почему именно так? Я могу только догадываться, но вполне возможно, что некоторые графические процессоры не имеют оборудования для растеризации строк, которое очень хорошо соответствует спецификации Vulkan, и драйвер может вернуться к рисованию линий с полигонами для определенных настроек конвейера растеризации строк. Таким образом, применяются некоторые настройки растеризации полигонов. (Однажды я работал над большим приложением, в котором нам пришлось выполнять все рисование линий с помощью четырехугольников, поскольку поддержка функций растеризации линий сильно различалась на разных устройствах.)
Спасибо за ответ. В моем случае имеет смысл, что тогда это работает; Я рисую треугольники в каркасном режиме. Если бы мне пришлось рисовать собственные линии (например, если бы я хотел нарисовать грани кубов в виде четырехугольников), мне пришлось бы искать альтернативы.