рисование нескольких предметов с помощью opengl (современный) - PullRequest
0 голосов
/ 27 августа 2018

Дополнительный вопрос к QtOpenGLWidget рисованию треугольника

Я хочу нарисовать треугольник и несколько линий, я написал этот код (с замечательной помощью людей из сообщества stackoverflow), он рисует треугольник и линии. Однако, когда я хочу нарисовать треугольник и линии одновременно, я не вижу линий.

  GLfloat vertices[] = { 0.0f, 0.707f, 0.5f, -0.5f, -0.5f, 0.5f, 0.5f, -0.5f, 0.5f };
 GLfloat colors[] = { 1.f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f};
 shader->setAttributeArray(posAttribute, vertices, 3, 0);
 shader->setAttributeArray(colAttribute, colors, 3, 0);
 glEnableVertexAttribArray(posAttribute);
 glEnableVertexAttribArray(colAttribute);
 glDrawArrays(GL_TRIANGLES, 0, 3);
 glDisableVertexAttribArray(posAttribute);
 glDisableVertexAttribArray(colAttribute);

 GLfloat lvertices[] = { 0.907f, 0.907f, 0.5f, -0.957f, -0.957f, 0.5f };
 GLfloat lcolors[] =   { 1.0f,    0.0f, 0.0f,    1.0f,    .0f , 0.0f};
 shader->setAttributeArray(posAttribute, lvertices, 3, 0);
 shader->setAttributeArray(colAttribute, lcolors, 3, 0);
 //glLineWidth(.03f);
 glDrawArrays(GL_LINE_STRIP, 0, 6);
 glDisableVertexAttribArray(posAttribute);
 glDisableVertexAttribArray(colAttribute);

Что я делаю не так?

1 Ответ

0 голосов
/ 27 августа 2018

После отрисовки полигонов вы отключаете атрибуты вершин (glDisableVertexAttribArray), но не включаете их снова, перед рисованием линий.

Пропустите отключение атрибутов вершин после прорисовки полигонов, чтобы решить проблему.


Кроме того, функция глубины по умолчанию (glDepthFunc) - GL_LESS. Если проверка глубины включена, то фрагмент отбрасывается, если фрагмент был нарисован в той же позиции, чья глубина (координата z) меньше или равна глубине нового фрагмента. Это означает, что фрагмент покрыт предыдущим.

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

// clear color buffer and depth buffer
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

// enable the depth test
glEnable(GL_DEPTH_TEST);

// enable vertex attributes
glEnableVertexAttribArray(posAttribute);
glEnableVertexAttribArray(colAttribute);

// draw the polygons
GLfloat vertices[] = { 0.0f, 0.707f, 0.5f, -0.5f, -0.5f, 0.5f, 0.5f, -0.5f, 0.5f };
GLfloat colors[] = { 1.f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f};
shader->setAttributeArray(posAttribute, vertices, 3, 0);
shader->setAttributeArray(colAttribute, colors, 3, 0);
glDrawArrays(GL_TRIANGLES, 0, 3);

// disable the depth test
glDisable(GL_DEPTH_TEST);

// draw the lines
GLfloat lvertices[] = { 0.907f, 0.907f, 0.5f, -0.957f, -0.957f, 0.5f };
GLfloat lcolors[] =   { 1.0f,    0.0f, 0.0f,    1.0f,    .0f , 0.0f};
shader->setAttributeArray(posAttribute, lvertices, 3, 0);
shader->setAttributeArray(colAttribute, lcolors, 3, 0);
glDrawArrays(GL_LINE_STRIP, 0, 6);

// disable vertex attributes
glDisableVertexAttribArray(posAttribute);
glDisableVertexAttribArray(colAttribute);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...