Геометрический шейдер, MaxVertexCount не может быть известен

В настоящее время я работаю над шейдером, в котором количество вершин не определяется количеством треугольников, мой шейдер ставит куб через каждые X единиц.

Это означает, что я не могу заранее знать, сколько кубов он создаст, и я не знаю, сколько вершин он займет.

Однако вы должны поставить maxvertexcount[x]. Что мне положить в x?

Как мне обойти это?

Примечание. Я новичок в геометрических шейдерах и почти ничего о них не знаю.


person Subject009    schedule 06.06.2014    source источник


Ответы (1)


Вы на самом деле знаете, сколько вершин потребуется ("взять" как в input) для каждого вызова.

Это определяется примитивной топологией; треугольник (полоса), например, принимает 3, а смежность треугольника принимает 6. MaxVertexCount обязательно должен быть известен, потому что существует ограничение реализации на количество вершин, которые вы можете выводить за вызов.

Если вы достигнете этого предела при одном вызове, вам придется заставить графический процессор вызывать ваш геометрический шейдер несколько раз (функция Shader Model 5.0). D3D называет этот процесс < em>"Создание экземпляров шейдера геометрии" и дает uint InstanceID : SV_GSInstanceID для определения того, какой дублирующийся вызов (экземпляр) выполняется.

Ваше описание проблемы на самом деле затрудняет точный ответ. Не могли бы вы включить код HLSL, чтобы показать, что вы на самом деле пытаетесь сделать?

person Andon M. Coleman    schedule 07.06.2014
comment
Я пытаюсь превратить здание в кирпичи, чтобы постепенно его строить. Итак, 1 треугольник -> несколько (количество зависит от размера треугольника) кирпичей. Разве Maxvertexcount не число, которое вы выводите? Если это ввод, то это всего лишь 3 (с использованием треугольника). - person Subject009; 07.06.2014
comment
Да, но вы говорили о взятых вершинах в части вашего вопроса. Для меня это подразумевает ввод. Что-то вроде потребляемого и производимого. Maxvertexcount — это максимальное количество вершин, которые может вывести один вызов, вы можете вывести всего 3 вершины, если хотите, если вы выводите треугольники. Но есть верхняя граница количества вершин, которые вы можете вывести за один вызов, как я уже упоминал. Обычно это порядка 256 или около того; это означает, что один вызов вашего GS может вывести до 85 треугольников, если вы используете MaxVertexCount = 256. - person Andon M. Coleman; 07.06.2014
comment
Причина, по которой вы не можете просто установить максимальное количество вершин на 256 и забыть об этом, заключается в том, что D3D использует эту информацию для повышения эффективности параллельного выполнения. Выходные данные GS должны сохранять порядок выполнения для правильной работы отрисовки, а это означает, что каждый GS должен резервировать n-множество вершин в кэш-буфере после преобразования. Если вы установите слишком высокое значение, вы повредите эффективность кэша GS. Честно говоря, это не большая проблема на современном оборудовании DX11, у них большие кеши, но когда впервые появились геометрические шейдеры (DX10), это была серьезная проблема. - person Andon M. Coleman; 07.06.2014
comment
Я вижу, но тогда моя проблема все еще остается, если это действительно большой треугольник, мне, возможно, придется вывести 2056 вершин или даже больше, и если я установлю такое высокое число, это даст ошибку. - person Subject009; 07.06.2014
comment
Правильно, вы не можете вывести более 256 вершин за один вызов. Для этого вам нужен экземпляр GS. D3D11 гарантирует до 32 экземпляров, что позволит вам вывести 8192 вершины или 2730 треугольников, запустив GS 32 раза. - person Andon M. Coleman; 07.06.2014
comment
Хорошо, но я новичок, так что... Как мне запустить GS несколько раз? - person Subject009; 07.06.2014
comment
@Subject009: подразделение - это задание, которое больше предназначено для шейдера тесселяции, геометрический шейдер не так эффективен для этого типа задач. - person mrvux; 08.06.2014