Атрибуты WebGL для каждого элемента в drawElements

Есть ли способ указать атрибуты для индекса элемента в WebGL? Вот что я имею в виду.

Я хочу рисовать фигуры с линиями по краям и жирными точками в вершинах. Итак, вот структура данных для треугольника:

Вершины: [0,0,0, 1,0,0, 0,1,0] Ребра: [0,1, 1,2, 2,0]

Вершины — это ARRAY_BUFFER, а ребра — это ELEMENT_ARRAY_BUFFER. Поэтому, когда я вызываю drawElements на ребрах, используя LINES, я получаю контур треугольника. Теперь я также могу привязать цветовые атрибуты к вершинам. Предположим, я делаю их все красными:

Цвета: [1,0,0, 1,0,0, 1,0,0]

Если я хочу выделить конкретную вершину, я просто пишу bufferSubData поверх цветов, прежде чем рисовать толстые точки для вершин, и возвращаю их обратно перед рисованием ребер. Но что, если я хочу выделить край? Меняю цвета на [1,1,1, 1,1,1, 1,0,0] и желаю всего наилучшего. Ребро (0,1) будет белым, а два других ребра будут окрашены градиентом: красным в вершине 2 и белым в другой (0 или 1).

Итак, могу ли я указать, что хочу использовать определенный цвет для элементов с индексами 0 и 1 и другой цвет для элементов с индексами 2, 3, 4 и 5? И все это без дублирования каждой вершины (например, чтобы данные каждой вершины выглядели как [x,y,z, r,g,b] и располагались два из них рядом в буфере, чтобы ребро могло указывать на обычную или выделенную версию одной и той же вершины).


person StokedOver9k    schedule 16.12.2013    source источник


Ответы (1)


Извините, но нет, это так не работает, вам придется где-то дублировать данные. Вершина — это не просто позиция, это набор всех атрибутов, связанных с этой позицией, поэтому с точки зрения WebGL/OpenGL это разные вершины.

Самое простое решение — просто продублировать вершины с обновленными цветами. Вы можете делать более сложные вещи, например иметь массив цветов, передавать атрибут, который перечисляет вершины (например, вершина 0 получает «0», вершина 1 получает «1» и т. д.), а затем иметь логику в вашем вершинном шейдере. компенсировать. Это много работы и сложности, и не может быть проще или быстрее.

person radical7    schedule 17.12.2013