проблема с QOpenGLWidget, QOpenGLWindow - PullRequest
0 голосов
/ 12 июля 2020

Может ли кто-нибудь сказать мне, почему следующий код в моем paintGL не отрисовывается при использовании функции DrawArrays? Я использую Qt 5.14.2 в Qt Creator на последней Windows 10.

Несколько комментариев;

Я экспериментирую, пытаясь понять различия между реализациями OpenGL в Qt, используя следующие объявления. Со временем я напишу свое приложение, используя реализацию, которая мне нравится больше всего.

  1. class OpenGLWindow: publi c QWindow, publi c QOpenGLFunctions

Это работает хорошо, когда я помещаю следующий код в функцию render (), вообще никаких проблем, очень хорошо !!

class myOpenGLWidget: publi c QOpenGLWidget, publi c QOpenGLFunctions

Я помещаю код в функцию paintGL. Я могу раскрасить фон, но glDrawArrays () ничего не делает. Однако я могу нарисовать треугольник, код между операторами glBegin и glEnd успешен. Я не получаю ошибок. Я проверяю результат вызова m_program-> bind (), и он оказывается верным.

class myQOpenGLWindow: publi c QOpenGLWindow, protected QOpenGLFunctions

То же, что и # 2, за исключением того, что я помещаю код в функцию render (). Я могу раскрасить фон, но glDrawArrays () ничего не делает. Однако я могу нарисовать треугольник, код между операторами glBegin и glEnd успешен. Я проверяю результат вызова m_program-> bind (), и он оказывается верным.

Если кому-то нужно спросить, я делаю это таким образом после просмотра десятков различных руководств, это лучшая информация что мне удалось найти.

спасибо !!

{// Нарисуйте сцену:

QOpenGLFunctions *f = QOpenGLContext::currentContext()->functions();

const qreal retinaScale = devicePixelRatio();

f->glViewport(0, 0, width() * retinaScale, height() * retinaScale);

f->glClearColor(red, green, blue, 1.0f);
f->glClear(GL_COLOR_BUFFER_BIT);

QMatrix4x4 matrix;
matrix.perspective(60.0f, 4.0f / 3.0f, 0.1f, 100.0f);
matrix.translate(0, 0, 0);
matrix.rotate(0, 1, 0, 0);

m_program->setUniformValue(m_matrixUniform, matrix);

glBegin(GL_TRIANGLES);
    glColor3f(1.0, 0.0, 0.0);
    glVertex3f(-0.5, -0.5, 0);
    glColor3f(0.0, 1.0, 0.0);
    glVertex3f( 0.5, -0.5, 0);
    glColor3f(0.0, 0.0, 1.0);
    glVertex3f( 0.0,  0.5, 0);
glEnd();

//f->glBindTexture(GL_TEXTURE_2D, 0);

bound = m_program->bind();

GLfloat line_vertices[2160];

for (int v=0;v<360;v++)
    {
    line_vertices[(6*v)]=-3.5+float(v)/25;
    line_vertices[(6*v)+1]=1.1+qSin(5*2*v*(M_PI)/180);
    line_vertices[(6*v)+2]=-5;
    line_vertices[(6*v)+3]=-3.5+float(v+1)/25;
    line_vertices[(6*v)+4]=1.1+qSin(5*2*(v+1)*(M_PI)/180);;
    line_vertices[(6*v)+5]=-5;
    }

GLfloat line_colors[2160];

for (int v=0;v<360;v++)
    {
    line_colors[(6*v)]=1.0;
    line_colors[(6*v)+1]=0;
    line_colors[(6*v)+2]=0;
    line_colors[(6*v)+3]=1.0;
    line_colors[(6*v)+4]=0;
    line_colors[(6*v)+5]=0;
    }

f->glVertexAttribPointer(m_posAttr, 3, GL_FLOAT, GL_FALSE, 0, line_vertices);
f->glVertexAttribPointer(m_colAttr, 3, GL_FLOAT, GL_FALSE, 0, line_colors);

f->glEnableVertexAttribArray(m_posAttr);
f->glEnableVertexAttribArray(m_colAttr);

f->glDrawArrays(GL_LINES, 0, 360);

f->glDisableVertexAttribArray(m_colAttr);
f->glDisableVertexAttribArray(m_posAttr);

m_program->release();

}

Ответы [ 2 ]

0 голосов
/ 21 июля 2020

Я считаю, что это именно то, что вы ищете, когда спрашиваете, как я настроил свой VAO, поправьте меня, если я ошибаюсь.

// Create Shader (Do not release until VAO is created)
m_program = new QOpenGLShaderProgram(this);
m_program->addShaderFromSourceCode(QOpenGLShader::Vertex, ogl_vertexShaderSource);
m_program->addShaderFromSourceCode(QOpenGLShader::Fragment, ogl_fragmentShaderSource);
m_program->link();
m_posAttr = m_program->attributeLocation("posAttr");
m_colAttr = m_program->attributeLocation("colAttr");
m_matrixUniform = m_program->attributeLocation("matrix");

m_program->release();
0 голосов
/ 21 июля 2020

GL_VERSION = 4.6.0

Вот фрагмент кода, в котором я определяю положение и цвет вершин, VBO, различные настройки буферов положения и цвета, а затем функцию glDrawArrays. Я пробовал этот код в функциях render () и paintgl (). Я не получаю ошибок, но и красивых строк тоже. Однако вершины треугольника, определенные между begin () и end (), отображаются.

GLfloat line_vertices [2160];

for (int v=0;v<360;v++)
    {
    line_vertices[(6*v)]=-3.5+float(v)/25;
    line_vertices[(6*v)+1]=1.1+qSin(5*2*v*(M_PI)/180);
    line_vertices[(6*v)+2]=-5;
    line_vertices[(6*v)+3]=-3.5+float(v+1)/25;
    line_vertices[(6*v)+4]=1.1+qSin(5*2*(v+1)*(M_PI)/180);;
    line_vertices[(6*v)+5]=-5;
    }

GLfloat line_colors[2160];

for (int v=0;v<360;v++)
    {
    line_colors[(6*v)]=1.0;
    line_colors[(6*v)+1]=0;
    line_colors[(6*v)+2]=0;
    line_colors[(6*v)+3]=1.0;
    line_colors[(6*v)+4]=0;
    line_colors[(6*v)+5]=0;
    }

QOpenGLBuffer m_vertexBufferCube;
QOpenGLBuffer m_colorBufferCube;

m_program->setUniformValue(m_matrixUniform, matrix);

m_vertexBufferCube.create();
m_vertexBufferCube.setUsagePattern(QOpenGLBuffer::StaticDraw);
m_vertexBufferCube.allocate(line_vertices, 3 * 360 * sizeof(float));

m_colorBufferCube.create();
m_colorBufferCube.setUsagePattern(QOpenGLBuffer::StaticDraw);
m_colorBufferCube.allocate(line_colors, 3 * 360 * sizeof(float));

bound = m_vertexBufferCube.bind();
//m_program->setAttributeBuffer("vertexPosition", GL_FLOAT,0,3);
m_program->setAttributeBuffer(m_posAttr, GL_FLOAT,0,3);

m_colorBufferCube.bind();
//m_program->setAttributeBuffer("colorPosition", GL_FLOAT,0,3);
m_program->setAttributeBuffer(m_colAttr, GL_FLOAT,0,3);

//glVertexAttribPointer(m_posAttr, 3, GL_FLOAT, GL_FALSE, 0, line_vertices);
//glVertexAttribPointer(m_colAttr, 3, GL_FLOAT, GL_FALSE, 0, line_colors);

//glEnableVertexAttribArray(m_posAttr);
//glEnableVertexAttribArray(m_colAttr);

glDrawArrays(GL_LINES, 0, 360);
...