Android Как нарисовать каркас над объектом в OpenGL 2.0? - PullRequest
2 голосов
/ 30 января 2012

У меня есть объект тетраэдра, созданный в openGL ES 2.0.Я пытаюсь показать фактический каркас многоугольника поверх его основного цвета.Есть ли способ достижения этого эффекта?

Кроме того, мой тетраэдр розовый.Как я могу изменить его цвет?

Ответы [ 3 ]

4 голосов
/ 30 января 2012

1: сначала нарисуйте ваш объект как обычно, затем нарисуйте его снова (с другим шейдером, или он будет того же цвета, что и объект и, следовательно, невидимым), используя GLES20.GL_LINES, GL_LINE_LOOP или GL_LINE_STRIP.
Возможно, вы захотите немного увеличить объект при рисовании линий, чтобы при проверке глубины не было решено, что линии находятся за объектом, и игнорируется их.

2: Это делается в вашем шейдере, установите для gl_FragColor значение vec4, содержащее требуемые значения rgba для сплошного цвета.

3 голосов
/ 30 января 2012

В дополнение к тому, что сказал Джейв. Вместо увеличения всего объекта (оптимальное количество которого всегда зависит от объекта и текущего вида) для предотвращения артефактов z-борьбы, вы также можете использовать смещение многоугольника (используя glPolygonOffset), основное применение которого это действительно каркасные наложения.

Это в основном работает, слегка корректируя значения глубины результирующих фрагментов, чего вы не можете достичь по-разному в ES, так как вы не можете записать в буфер глубины (что, по-моему, является причиной того, что они не удалили его из ES, например, они сделали в десктопе GL 3+). Таким образом, вы в основном визуализируете свой твердый объект и линейную версию объекта, используя те же вершины, но используя конфигурацию смещения многоугольника для твердого объекта, которая немного увеличивает значения глубины результирующих фрагментов (отталкивает их от зрителя), таким образом, помещая треугольники всегда за линиями в пространстве вида (или на самом деле в пространстве окна). См. здесь для получения дополнительной информации.

Хотя в случае тетраэдра могут возникнуть некоторые проблемы из-за его очень острых краев.

1 голос
/ 02 августа 2013

Хотя это было здесь некоторое время (уже более года), это также может помочь: Обратите внимание, что вам не нужно использовать другой шейдер для достижения желаемого результата. Вы можете отключить массив атрибутов вершины, а затем указать и загрузить постоянные данные атрибута вершины (цвет линии каркаса), чтобы нарисовать каркас. Например:

float coloredcube[] = { 2, 2, 2, 1, 0, 0, -2, 2, 2, 0, 1, 0, -2, -2, 2, 0,
        0, 1, 2, -2, 2, 1, 1, 0, 2, 2, -2, 1, 0, 1, -2, 2, -2, 0, 1, 1, -2,
        -2, -2, 1, 1, 1, 2, -2, -2, 0, 0, 0

};
short indices[] = { 0, 1, 2, 0, 2, 3, //back

        0, 4, 7, //right
        0, 7, 3,

        7, 6, 2, //bottom
        7, 2, 3,

        4, 5, 6, //front
        4, 6, 7,

        5, 1, 2, //left
        5, 2, 6,

        0, 1, 5, 0, 5, 4 //top
        };

short lineindices[] = { 0, 1, 1, 2, 0, 2, 2, 3,

0, 4, 4, 7, 0, 7, 7, 3,

7, 6, 6, 2, 7, 2, 4, 5,

5, 6, 4, 6, 5, 2, 1, 5, 0, 5, 0, 3 };

glVertexAttribPointer(iPosition, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float),coloredcube);
glEnableVertexAttribArray(iPosition);
glVertexAttribPointer(iColor, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float),coloredcube + 3);
glEnableVertexAttribArray(iColor);

// offset the filled object to avoid the stitching that can arise when the wireframe lines are drawn
glEnable(GL_POLYGON_OFFSET_FILL);
glPolygonOffset(2.0f, 2.0f);
glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_SHORT, indices);
glDisable(GL_POLYGON_OFFSET_FILL);

//Then disable the vertex colors and draw the wire frame with one constant color
glDisableVertexAttribArray(iColor);
glLineWidth(1.0f);
GLfloat color[4] = { 1.0f, 0.0f, 0.0f, 0.5f };
glVertexAttrib4fv(iColor, color);
glDrawElements(GL_LINES, 36, GL_UNSIGNED_SHORT, lineindices);

Подобный пример можно найти в «Руководстве по программированию OpenGL ES 2.0», стр. 109,110.

...