OpenGL glVertexPointer, glDrawElements не правильно рисует цикл линии - PullRequest
0 голосов
/ 24 октября 2019

Пытаясь нарисовать простой дом, используя GL_LINE_LOOP, тело дома в порядке, но крыша совершенно неправильная:

glClearColor(1.0, 1.0, 1.0, 0.0);

typedef GLfloat vertex[2];

static const
vertex house_roof[3] = {
    {  0.0, 0.4 },
    { -0.3, 0.2 },
    {  0.3, 0.2 }
};

static const
vertex house_body[4] = {
    { -0.2,  0.2 },
    { -0.2, -0.2 },
    {  0.2, -0.2 },
    {  0.2,  0.2 }
};

static const
GLubyte indexes_roof[3] = {0, 1, 2};

static const
GLubyte indexes_body[4] = {0, 1, 2, 3};

glColor3f(0.0, 0.0, 0.0);

glEnableClientState(GL_VERTEX_ARRAY);

glVertexPointer(2, GL_FLOAT, 0, house_roof);
glDrawElements(GL_LINE_LOOP, 3, GL_UNSIGNED_BYTE, indexes_roof);

glVertexPointer(2, GL_FLOAT, 0, house_body);
glDrawElements(GL_LINE_LOOP, 4, GL_UNSIGNED_BYTE, indexes_body);

glDisableClientState(GL_VERTEX_ARRAY);
glFlush();

Это приводит к следующему:

enter image description here

Крыша - это черная вертикальная линия, идущая от (0, 0) до (0, 0,4). Тело нарисовано правильно, но по какой-то причине крыша всегда неправильная. Как мне правильно нарисовать крышу?

РЕДАКТИРОВАТЬ

После работы над полным минимальным примером я вроде решил проблему. Исходный код содержал дом в отдельном файле house.h и house.cpp, импортированном в main.cpp. Где приведенный выше код является функцией отображения дома.

#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>

#include "house.h"

House houses[1];

void loop() {
    glClear(GL_COLOR_BUFFER_BIT);
    houses[0].render();
}

int main(int argc, char** argv) {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowPosition(50, 100);
    glutInitWindowSize(400, 300);
    glutCreateWindow("Test");
    glClearColor(1.0, 1.0, 1.0, 0.0);

    glutDisplayFunc(loop);
    glutMainLoop();
}

Когда я переместил дом и убрал дополнительные методы (еще не реализованные) в один файл, программа начала работать. Просто переместить код. Мне интересно, если я неправильно компилирую, то.

g++ -std=c++17 -o Test main.cpp house.cpp -I./ -lglut -lGL -lGLU
...