Open Scene Graph - Использование DrawElementsUInt: рисование полотна без дублирования вершин - PullRequest
0 голосов
/ 16 марта 2019

В настоящее время я работаю над моделированием материала, подобного ткани, и затем отображаю результаты с помощью Open Scene Graph.Я получил настройку для отображения чего-то похожего на ткань, просто сбросив все вершины в 1 Vec3Array и затем отобразив их с помощью стандартного DrawArrays на основе точек.Однако я пытаюсь добавить грани между вершинами, чтобы дальнейшая часть моего приложения могла визуально видеть ткань.

Это то, что я сейчас пытаюсь сделать для PrimitiveSet

    // create and add a DrawArray Primitive (see include/osg/Primitive).  The first
    // parameter passed to the DrawArrays constructor is the Primitive::Mode which
    // in this case is POINTS (which has the same value GL_POINTS), the second
    // parameter is the index position into the vertex array of the first point
    // to draw, and the third parameter is the number of points to draw.
    unsigned int k = CLOTH_SIZE_X;
    unsigned int n = CLOTH_SIZE_Y;
    osg::ref_ptr<osg::DrawElementsUInt> indices = new osg::DrawElementsUInt(GL_QUADS, (k) * (n));
    for (uint y_i = 0; y_i < n - 1; y_i++) {
        for (uint x_i = 0; x_i < k - 1; x_i++) {
            (*indices)[y_i * k + x_i] = y_i * k + x_i;
            (*indices)[y_i * (k + 1) + x_i] = y_i * (k + 1) + x_i;
            (*indices)[y_i * (k + 1) + x_i + 1] = y_i * (k + 1) + x_i + 1;
            (*indices)[y_i * k + x_i] = y_i * k + x_i + 1;
        }
    }

    geom->addPrimitiveSet(indices.get());

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

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

0  1    2    3    ... k-1
k  k+1  k+2  k+3  ... 2k-1
2k 2k+1 2k+2 2k+3 ... 3k-1 
...

Кто-нибудь сталкивался с этим конкретным вариантом использования ранее и, возможно, у него / нее есть решение моей проблемы?Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 20 марта 2019

Возможно, вы захотите изучить использование DrawArrays с QUAD_STRIP (или TRIANGLE_STRIP, потому что в наши дни квады недовольны). Здесь есть пример: http://openscenegraph.sourceforge.net/documentation/OpenSceneGraph/examples/osggeometry/osggeometry.cpp

Это немного менее эффективно, чем элементы / индексы, но также менее сложно управлять отношениями между двумя связанными контейнерами (вершинами и индексами).

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

...