GlDrawElements с цветом фасета

Я использую 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 организованы с.т. У меня может быть атрибут в шейдере на вершину. Как я могу добавить данные цвета за грань?

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

Rabbid76 20.03.2018 20:15

Итак, как мне рисовать по цвету треугольника? Только с неиндексированным массивом?

Mercury 20.03.2018 20:27

Вы должны указать один и тот же цвет для каждой из 3 вершин треугольника. Обратите внимание, атрибуты называются вершина-attribute, нет атрибутов лица или примитивных атрибутов.

Rabbid76 20.03.2018 20:30
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
260
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

the data in m_vBuff is organuzed s.t. I can have an attribute in the shader per vertex. How can I add color data which is per facet?

На ум приходят три разные стратегии:

  1. Правильно продублируйте данные вершины.

  2. Использование квалификатора интерполяции flat и провоцирующей вершины: Если вы квалифицируете свои вариации как flat, данные не будут интерполироваться по примитиву, но данные из одной вершины будут использоваться для всего примитива. Вершина, из которой берутся данные, называется провоцирующая вершина, и вы можете выбирать между различными соглашениями через glProvokingVertex(). Если у вас есть вершины A, B, C, D и E, а также треугольники ABC, BCD и CDE, и вы перенаправляете цвет каждой вершины во фрагментный шейдер как flat и используете, например, использование соглашения GL_FIRST_VERTEX, тогда первый треугольник получит цвет A, второй треугольник будет использовать цвет B и так далее. Эта стратегия будет работать только до определенной степени, а не для произвольных сеток, потому что одна вершина может быть связана с более чем тремя треугольниками. Эта стратегия по-прежнему может применяться для уменьшения количества дублирования, которое может возникнуть в варианте 1.

  3. Поместите данные для каждого лица в какое-либо другое хранилище и используйте входные данные фрагментного шейдера gl_PrimitiveID в качестве индекса в этом хранилище. В зависимости от необходимого объема хранилища (и целевой версии GL) наиболее подходящими кажутся Единый буферный объект, Объект текстурного буфера или Объект буфера хранилища шейдеров.

Другие вопросы по теме