Я использую glDrawElements для рисования индексной сетки:
voi
d init()
{
//allocate vbo, copy actual data (m_indices,m_vertices).
//m_indices is a vector of mx3 indices of the facet.
//m_vertices is nx6 xyzrgb vertex points
m_vBuff.create();
m_iBuff.create();
m_vBuff.setUsagePattern(QOpenGLBuffer::StaticDraw);
m_iBuff.setUsagePattern(QOpenGLBuffer::StaticDraw);
m_vBuff.bind();
m_vBuff.allocate(m_vertices.data(), int(m_vertices.size() * sizeof(VertData)));
m_vBuff.release();
m_iBuff.bind();
m_iBuff.allocate(m_indices.data(), int(m_indices.size() * sizeof(uint32_t)));
m_iBuff.release();
}
и использование:
...
m_vBuff.bind();
m_iBuff.bind();
//define attribute which can be used in the shader
int vp = shader->attributeLocation("a_xyz");
shader->enableAttributeArray(vp);
shader->setAttributeBuffer(vp, GL_FLOAT, 0, 3, sizeof(VertData));
int vc = shader->attributeLocation("a_rgb");
shader->enableAttributeArray(vc);
shader->setAttributeBuffer(vc, GL_FLOAT, 3 * sizeof(float), 3, sizeof(VertData));
glDrawElements(GL_TRIANGLES, m_iBuff.size() / sizeof(uint32_t), GL_UNSIGNED_INT, NULL);
m_vBuff.release();
m_iBuff.release();
данные в m_vBuff организованы с.т. У меня может быть атрибут в шейдере на вершину. Как я могу добавить данные цвета за грань?
Итак, как мне рисовать по цвету треугольника? Только с неиндексированным массивом?
Вы должны указать один и тот же цвет для каждой из 3 вершин треугольника. Обратите внимание, атрибуты называются вершина-attribute, нет атрибутов лица или примитивных атрибутов.





the data in
m_vBuffis organuzed s.t. I can have an attribute in the shader per vertex. How can I add color data which is per facet?
На ум приходят три разные стратегии:
Правильно продублируйте данные вершины.
Использование квалификатора интерполяции flat и провоцирующей вершины:
Если вы квалифицируете свои вариации как flat, данные не будут интерполироваться по примитиву, но данные из одной вершины будут использоваться для всего примитива. Вершина, из которой берутся данные, называется провоцирующая вершина, и вы можете выбирать между различными соглашениями через glProvokingVertex(). Если у вас есть вершины A, B, C, D и E, а также треугольники ABC, BCD и CDE, и вы перенаправляете цвет каждой вершины во фрагментный шейдер как flat и используете, например, использование соглашения GL_FIRST_VERTEX, тогда первый треугольник получит цвет A, второй треугольник будет использовать цвет B и так далее. Эта стратегия будет работать только до определенной степени, а не для произвольных сеток, потому что одна вершина может быть связана с более чем тремя треугольниками. Эта стратегия по-прежнему может применяться для уменьшения количества дублирования, которое может возникнуть в варианте 1.
Поместите данные для каждого лица в какое-либо другое хранилище и используйте входные данные фрагментного шейдера gl_PrimitiveID в качестве индекса в этом хранилище. В зависимости от необходимого объема хранилища (и целевой версии GL) наиболее подходящими кажутся Единый буферный объект, Объект текстурного буфера или Объект буфера хранилища шейдеров.
Вы не можете, атрибуты из записи данных для каждой вершины. Таким образом, каждый атрибут для каждой вершины, нет атрибутов для каждой грани (примитив треугольника).