Могу ли я вызывать шейдер с другим массивом для каждого вызова или мне следует создать несколько шейдеров?

Я пытаюсь определить лучший способ обработки пользовательских пунктирных линий с помощью шейдеров в Three.js (webgl). Эти пунктирные линии могут иметь разные узоры. Я надеюсь, что смогу написать единственный шейдер, который будет обрабатывать любой штриховой шаблон. Шаблон будет задан массивом значений (например, [0.125, -0.125, 0.250, -0.250]), где отрицательное значение — это длина пробела, а положительное — длина тире.

Я новичок в шейдерах и не уверен, что это возможно. Если я правильно понимаю, единый массив не подходит, потому что я хочу, чтобы этот массив менялся в соответствии с шаблоном, нарисованным на конкретном линейном объекте. Но я не думаю, что массив атрибутов был бы уместным, потому что он кажется массивом значений, которые связаны с вершинами. Итак, возможно ли то, что я хочу сделать, или мне нужно динамически создавать шейдеры для каждого шаблона?

Я правильно понимаю это до сих пор? Какие-либо предложения? Это моя первая (и, надеюсь, единственная) работа с шейдерами.


person bzuillsmith    schedule 24.03.2014    source источник
comment
Посмотрите, поможет ли это: threejs.org/examples/webgl_lines_dashed.html. И найдите «пунктир» в ShaderLib.js.   -  person WestLangley    schedule 25.03.2014
comment
Да, я уже рассмотрел это. Это очень простой шейдер только с gapSize и dashSize, и он не соответствует ни одному из моих требований. Спасибо хоть   -  person bzuillsmith    schedule 26.03.2014
comment
Ваш проект звучит интересно. Если вы готовы поделиться своим результатом, это было бы здорово! Но будьте осторожны, шейдеры могут расти на вас. :-)   -  person WestLangley    schedule 26.03.2014


Ответы (1)


Вы должны использовать либо униформу, либо атрибут; в WebGL нет ничего «промежуточного» между ними, и другие возможные реализации, в конце концов, будут зависеть от юниформ или атрибутивных (или константных) данных.

  • Если вы используете униформу, вы можете установить шаблон тире для всех линий в вызове отрисовки, но не для отдельных линий внутри него.

  • Если вы используете атрибут, вы должны дублировать выбор шаблона штриховки для каждой вершины в линии. Это ничем не отличается от обычной обработки, например. цветные линии, где вы должны указать (один и тот же) цвет в каждой вершине.

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

person Kevin Reid    schedule 24.03.2014
comment
Спасибо за подтверждение моих подозрений и за советы. Я, вероятно, пойду по пути всех данных в единый массив или текстуру и использую атрибут для поиска нужного шаблона. Спасибо еще раз! - person bzuillsmith; 26.03.2014