Проблема преобразования устаревшего конвейера в современный openGL - PullRequest
0 голосов
/ 08 февраля 2020

Я нахожусь в процессе преобразования приложения openGL ver 1.0 в более современную версию. Я застрял на функции и мне нужна помощь.

В основном мы читаем в точках данных из формата файла [.SLC], тогда данные находятся внутри структуры данных vector<vector<vector<float, float, float>>>

. старый рендеринг:

for [size of first vector]
   for [size of second vector]

       glBegin(GL_LINE_LOOP);       
           for [size of third vector]
                glVertex3f(float, float, float);
       glEnd();

этот 3-х слой l oop представляет отдельный объект, который я пытаюсь визуализировать с помощью одного вызова некоторого метода, подобного этому. Кажется, я не могу понять это правильно.

glVertexAttribPointer(vp, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), nullptr);
glDrawElements(GL_LINE_LOOP, indices.size() / sizeof(uint32_t), GL_UNSIGNED_INT, NULL);

Может кто-нибудь, пожалуйста, укажите мне в правильном направлении. Если вам нужна дополнительная информация, пожалуйста, дайте мне знать, и я постараюсь объяснить дальше. Спасибо

Моя проблема - собрать коллекцию вершин / индексов для отправки в функцию рендеринга.

Как показывает пример, есть 3 цикла. Я думал, что как раз перед началом 3-го oop начала собирать данные вершин.

Эта часть проста, но коллекция индексов смущает меня. Если у 3-й l oop есть вершина [N], у меня также должен быть индекс [N].

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

1 Ответ

3 голосов
/ 08 февраля 2020

[...] есть ли способ объединить все данные и отправить их как один вызов?

Если вы хотите сделать несколько GL_LINE_LOOP примитивы с вызовом при отрисовке, тогда я рекомендую использовать Перезапуск примитивов :

Функция перезапуска примитивов позволяет вам сообщать OpenGL, что конкретное значение индекса означает, а не исходить вершина с этим индексом, но для начала нового Примитива

Включите GL_PRIMITIVE_RESTART и определите индекс перезапуска с помощью glPrimitiveRestartIndex (например, 0xFFFFFFFF):

glEnable( GL_PRIMITIVE_RESTART );
glPrimitiveRestartIndex( 0xFFFFFFFF );

Например, если вы хотите нарисовать 2 линейных цикла (с одним вызовом отрисовки) с индексами (0, 1, 2) и (3, 4, 5, 6), вам нужно определить следующий индексный массив:

std::vector<uint32_t> indices{ 0, 1, 2, 0xFFFFFFFF, 3, 4, 5, 6 };
...