Пытаясь нарисовать простой дом, используя 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();
Это приводит к следующему:
Крыша - это черная вертикальная линия, идущая от (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