Подкласс QtOpenGLWidget ничего не рисует - PullRequest
0 голосов
/ 09 октября 2018

У меня есть простой вершинный и фрагментный шейдер.Я использую их в классе, производном от QtOpenGLWidget. Предполагается, что программа рисует треугольник, но ничего не показывает.GlClearColor отлично работает, и я могу изменить цвет фона.Когда я запускаю программу из командной строки, программа выводит одну строку, но ничего не рисует:

QOpenGLShaderProgram :: attributeLocation (position): шейдерная программа не связана

Когда я вставляю getGLError после команд gl, ни одна из них не сообщает об ошибке.вот определение класса:

class GLCanvas:public QOpenGLWidget , protected QOpenGLFunctions
{
  QMatrix4x4 matrix;
  QOpenGLShaderProgram* shader;
  GLuint posLocation;
  GLuint colLocation;
  GLuint matLocation;
  void cleanup();
public:
  GLCanvas(QWidget* parent);
  void initializeGL() override;
  void paintGL() override;
  void resizeGL(int w, int h) override;

  QStringList getGLinfo();
};



static const char *vertexShaderSource =
    R"(
    #version 330
    in vec3 position;
    void main()
    {
      gl_Position = vec4(position, 1);
    })";


static const char *fragmentShaderSource =
    R"(
    #version 330
    void main()
    {
       gl_FragColor = vec4(0.4,0.4,0.8,1.0);
    })";

GLCanvas::GLCanvas(QWidget* parent): QOpenGLWidget(parent)
{
  setFormat(QSurfaceFormat::defaultFormat());
  matrix.setToIdentity();

  posLocation = -1;
  colLocation = -1;
  matLocation = -1;
}


void GLCanvas::initializeGL()
{
    makeCurrent();
    connect(context(), &QOpenGLContext::aboutToBeDestroyed, this, &GLCanvas::cleanup);
    constexpr int glNoError = 0;
    GLenum error = -1;
    initializeOpenGLFunctions();
    glClearColor(.1f, .1f, .1f, 1.0f);
    error = glGetError();
    if (error != glNoError)
      {
        qDebug() << "glclearcolor failed";
      }

    shader = new QOpenGLShaderProgram(this);
    shader->addShaderFromSourceCode(QOpenGLShader::Vertex, vertexShaderSource);
    error = glGetError();
    if (error != glNoError)
      {
        qDebug() << "failed after adding vertex shader.";
      }

    shader->addShaderFromSourceCode(QOpenGLShader::Fragment, fragmentShaderSource);
    error = glGetError();
    if (error != glNoError)
      {
        qDebug() << "failed after adding fragment shader.";
      }

    Q_ASSERT(shader->link());


    error = glGetError();
    if (error != glNoError)
      {
        qDebug() << "gl error at link.";
      }
    //colLocation = shader->attributeLocation("color");
    //matLocation = shader->uniformLocation("matrix");

    //shader->release();
    posLocation = shader->attributeLocation("position");
    error = glGetError();
    if (error != glNoError)
      {
        qDebug() << "gl error at link.";
      }

    glEnable(GL_DEPTH_TEST);

    //colLocation = shader->attributeLocation("color");
    //matLocation = shader->uniformLocation("matrix");

    //shader->release();


    //glEnable(GL_CULL_FACE);

}
//###################################################################

void GLCanvas::paintGL()
{
     glClear(GL_COLOR_BUFFER_BIT  | GL_DEPTH_BUFFER_BIT);
     GLfloat vertices[] = { 0.0f, 0.707f, .0f,  0.5f, -0.5f, .0f ,-0.5f, -0.5f, .0f};
     Q_ASSERT(shader->bind());
     shader->setAttributeArray(posLocation, vertices, 3, 0);
     glEnableVertexAttribArray(posLocation);
     glDrawArrays(GL_LINES, 0, 3);
/*
     GLfloat lvertices[] = { 0.907f, 0.907f, 0.5f, -0.957f, -0.957f, 0.5f };
     shader->setAttributeArray(posLocation, lvertices, 0, 3);
     glDrawArrays(GL_LINE_STRIP, 0, 2);
     glDisableVertexAttribArray(posLocation);

*/
     //glDisableVertexAttribArray(colLocation);
     shader->release();
  //   qDebug() << getGLinfo();
}

void GLCanvas::resizeGL(int w, int h)
{
  Q_UNUSED(w);
  Q_UNUSED(h);
  //matrix.setToIdentity();
  //matrix.perspective(45.0f, w / float(h), 0.01f, 1000.0f);
  glViewport(0, 0, w, h);
}
/*
void GLCanvas::mousePressEvent(QMouseEvent *event)
{
Q_UNUSED(event);
}

void GLCanvas::mouseMoveEvent(QMouseEvent *event)
{
Q_UNUSED(event);
}
*/
void GLCanvas::cleanup()
{
    if (shader == nullptr)
          return;
    makeCurrent();
    delete shader;
    //shader = nullptr;
    doneCurrent();
}

1 Ответ

0 голосов
/ 10 октября 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...