@0ct0g3n

QT OpenGL как отрисовать линию массивом?

Всем добрый день/вечер.
Уже третий день бьюсь, и не могу разобраться, как нарисовать линию в OpenGL передавая координаты массивом (glDrawArrays). В OpenGL'е не силен, годных туторов по OpenGL в Qt найти не могу.
Пробую такой код
void CGLMap::paintGL()
{
    glClear(GL_COLOR_BUFFER_BIT);

    GLuint VBO;
    float arr[4];
    arr[0] = -0.5;
    arr[1] = -0.5;
    arr[2] = 5;
    arr[3] = 5;
    glGenBuffers(1, &VBO);
    glBindBuffer(GL_ARRAY_BUFFER, VBO);
    glBufferData(GL_ARRAY_BUFFER, sizeof(arr), arr, GL_STATIC_DRAW);
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);
    glColor4f(255.0, 0.0, 0.0, 1.0);
    glDrawArrays(GL_LINES, 0, sizeof(arr));
}

Не рисует. Подскажите, пожалуйста, буду благодарен.
  • Вопрос задан
  • 4372 просмотра
Пригласить эксперта
Ответы на вопрос 3
Копипаст это плохо(если не знаешь, что копипастиш)!
-glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);
+glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0);

Вы рисуете линии, следовательно, нужно только 2значения из буфера, а не 4. Подозреваю, что в примере рисовали квадраты:)

З.Ы. Тестировал в OpenTK, все заработало.

UPD. Извиняюсь за задержку как-то долго я не заходил в linux. Возможно я опоздал, но все равно код будет полезет тем кто прийдет сюда из гугла. Тестировал я ваш код таким образом:
#include "widget.h"

Widget::Widget(QWidget *parent)
    : QOpenGLWidget(parent)
{
}
GLuint VBO;
GLfloat arr[4];

void Widget::initializeGL()
{
    glewExperimental = true;
    glewInit();
    glClearColor(0,0,0,1);
    glColor3f(1,1,1);

    arr[0] = -1;
    arr[1] = -1;
    arr[2] = 1;
    arr[3] = 1;

    glGenBuffers( 1, &VBO);
    glBindBuffer(GL_ARRAY_BUFFER, VBO);
    glBufferData(GL_ARRAY_BUFFER, sizeof(arr), arr, GL_STATIC_DRAW);
    glEnableVertexAttribArray(0);
}

void Widget::paintGL()
{
    glClear(GL_COLOR_BUFFER_BIT);
    glLoadIdentity();

    glColor4f(1.0f, 0.0, 0.0, 1.0);
    glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0);

    glDrawArrays(GL_LINES, 0, sizeof(arr));
}

void Widget::resizeGL(int w, int h)
{
    glViewport(0,0,w,h);
}
Ответ написан
@TriKrista
Не важно с какими библиотеками OpenGL находится в связке, код, в принципе, будет везде одинаков.

Посмотрите в книге "OpenGL супер книга" там есть описание данной функции(glDrawArrays).
Так же можно взглянуть на проект там используется данная функция.
Ответ написан
Комментировать
donkaban
@donkaban
Умею рисовать тени
А сам шейдер где?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы