Вот что пока говорят АМД.
https://www.igromania.ru/news/78742/AMD_ne_planiruet_dobavlyat_Di… deokarty.html
То есть пока АМД ничего не предпринимают. А выжидают.
PS: Так же стала доступна трасировка в батле новой. Но не понравилось что только для Windows 10.
https://itndaily.ru/2018/11/14/v-battlefield-v-poyavilas-podderzh… i-nvidia-rtx/
ronniko
А что ты так переживаешь за АМД?
Взял бы RTX и радовался бы (может быть)
Дорого и еще сыро.
Я тоже планирую года три ждать.
Гнаться не вижу смысла.
Я этим переболел, когда лет 11 назад покупал каждый год новую видеокарту.
И так года 4 подряд.
Так что опытом научен лучше не спешить.
У меня 2012 года Radeon HD 7950 с турбо режимом, почти как 7970 и 3гига видеопамяти.
И пока устраивает.
Ужас ! Шесть лет прошло ! Время как летит.
а у меня вообще 980 и всё летает :)
ronniko
> Но не понравилось что только для Windows 10.
DX12 же
Немного дополнений к статье на основе обновленных доков и моих экспериментов.
При созданиеи acceleration structure (vkCreateAccelerationStructureNV) не нужно указывать vertex buffer, index buffer и тд, нужны только поля vertexCount, vertexFormat, indexCount, indexType - они указывают максимальный размер данных структуры, это нужно для рассчета необходимого размера памяти (вызов vkGetAccelerationStructureMemoryRequirementsNV).
Acceleration structure creation uses the count and type information from the geometries, but does not use the data references in the structures.
Далее при вызове vkCmdBuildAccelerationStructureNV поля vertexCount и indexCount должны быть меньше или равны тем значениям, что были при создании структуры.
dst must have been created with compatible VkAccelerationStructureInfoNV where VkAccelerationStructureInfoNV:::type and VkAccelerationStructureInfoNV::flags are identical, VkAccelerationStructureInfoNV::instanceCount and VkAccelerationStructureInfoNV::geometryCount for dst are greater than or equal to the build size and each geometry in VkAccelerationStructureInfoNV::pGeometries for dst has greater than or equal to the number of vertices, indices, and AABBs.
Также при вызове vkCmdBuildAccelerationStructureNV содержимое буферов копируется в acceleration structure, поэтому и память под все вершины и индексы выделяется в самой структуре + еще какой-то резерв, видимо на BVH и прочее. После вызова vkCmdBuildAccelerationStructureNV содержимое буферов можно перезаписать и это ни на что не повлияет. В доках этой информации я не нашел, но пришел к этому экспериментально-логическим методом.
Частично обновить структуру нельзя, надо ребилдить целиком, что может быть медленно. Рекомендаций по решению этой проблемы я не видел.
Чисто теоретически возможно разбить сцену на кластеры по одной acceleration structure в каждом, представить кластер как процедурную геометрию и в intersection шейдере делать трассировку уже по структуре кластера.
/A\
> При созданиеи acceleration structure (vkCreateAccelerationStructureNV) не нужно
> указывать vertex buffer, index buffer и тд
Но ведь мы все равно указываем там VkGeometryNV, так какая разница? Проще сразу заполнить ей все поля и все.
> После вызова vkCmdBuildAccelerationStructureNV содержимое буферов можно перезаписать и это ни на что не повлияет.
Вот этот момент меня сильно смущает. Нет гарантий что AS не станет ссылаться на них. Тем более что в реальной жизни эти буферы шарятся между рейтрейсом и растеризацией.
> Частично обновить структуру нельзя, надо ребилдить целиком, что может быть медленно. Рекомендаций по решению этой проблемы я не видел.
Рекомендации, косвенные, есть - рекомендуется сшивать статику и пихать в как можно меньшее кол-во BLAS, ту динамику что просто меняет трансформацию (едущая тачка) - простой refit (когда мы обновляем только transform в инстансе), он довольно быстрый. Ну и полная динамика (скин например) - там уже отдельные BLAS, которые ребилдятся в отдельном потоке (+ дабл-буфер).
Те же BF V делали 2 пинг-понг TLAS и рефитились / ребилдились в фоне.
> Чисто теоретически возможно разбить сцену на кластеры по одной acceleration structure в каждом, представить кластер как процедурную геометрию и в intersection шейдере делать трассировку уже по структуре кластера.
Для этого и есть TLAS, зачем велосипедить и терять перформанс на ровном месте?
0r@ngE
> Тем более что в реальной жизни эти буферы шарятся между рейтрейсом и растеризацией.
Ну а вдруг будет чистый рейтрейсинг, зачем тогда ненужные буферы хранить.
> Нет гарантий что AS не станет ссылаться на них.
Я как раз искал ответ на вопрос "что будет, если изменить данные в вершином буфере который используется в AS", потому что барьеров на чтение из буфера для билда AS нету.
Для VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_NV доступно только VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_NV и VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_NV а эти access mask отностятся только к AS.
То, что AS выделяет память на хранение всех вершин и индексов уже указывает на то, что последующего доступа к буферам не будет.
И билд и трасировка работают параллельно растеризации, вставлять синхронизации на доступ к вершинному буферу было бы странно.
/A\
> вставлять синхронизации на доступ к вершинному буферу было бы странно.
Если они все будут read-only, то почему бы и нет?
https://vulkan.gpuinfo.org/displayreport.php?id=4751#extensions
у 1080 теперь есть рей трейсинг?
я пошел проверять...
upd: у меня не появилось, странно как-то
/A\
Судя по всей статистике, это только на arch linux.
Dimich
Это вчерашний драйвер под линукс, может и на остальные платформы будут скоро.
А как это вообще возможно? Или таки сделали фолбек?
0r@ngE
> Или таки сделали фолбек?
Видимо сделали.
Вот только зачем? Если производительности не хватает, то никто и пользоваться не будет.
Лучше бы mesh shader добавили.
The complete rule to compute a miss shader binding table record address is:
missProgramShaderBindingTableBaseIndex × missShaderBindingStride + sbtRecordOffset
в спеках похоже ошибка, для miss шейдера берется не sbtRecordOffset, а missIndex
Тема в архиве.