【问题标题】:OpenGL + Qt 4.8 is not drawing anythingOpenGL + Qt 4.8 没有绘制任何东西
【发布时间】:2014-02-28 23:29:34
【问题描述】:

我一直在尝试在 Qt 中使用带有着色器和简单顶点数组的 OpenGL。我基本上希望在屏幕中间绘制一个平原,但是当我运行程序时什么都没有出现。我的代码基于 Qt 的“纹理”示例,在我看来一切都一样,但它不起作用!

这是我的 glwidget.cpp 的代码:

#include "glwidget.h"

GLWidget::GLWidget(QWidget *parent):QGLWidget(parent)
{
    timer.start(10);
    //connect(&timer, SIGNAL(timeout()), this, SLOT(updateGL()));

    Object aux;

    QVector3D auxV;
    auxV.setX(0.4); auxV.setY(0.4); auxV.setZ(1.0);
    aux.vertices.append(auxV);

    auxV.setX(0.4); auxV.setY(-0.4); auxV.setZ(1.0);
    aux.vertices.append(auxV);

    auxV.setX(-0.4); auxV.setY(-0.4); auxV.setZ(1.0);
    aux.vertices.append(auxV);

    auxV.setX(-0.4); auxV.setY(-0.4); auxV.setZ(1.0);
    aux.vertices.append(auxV);

    Objects.append(aux);
}

GLWidget::~GLWidget()
{
}

void GLWidget::initializeGL()
{
    #define PROGRAM_VERTEX_ATTRIBUTE 0

    printf("Objects Size: %d\nObj1 Size: %d\n", Objects.size(), Objects.at(0).vertices.size());
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_CULL_FACE);

    //printf("Version: %s\n", glGetString(GL_VERSION));

    vShader= new QGLShader (QGLShader::Vertex, this);
    vShader->compileSourceFile("../src/shaders/editorVshader.glsl");

    fShader= new QGLShader (QGLShader::Fragment, this);
    fShader->compileSourceFile("../src/shaders/editorFshader.glsl");

    editor= new QGLShaderProgram (this);
    editor->addShader(vShader);
    editor->addShader(fShader);
    editor->bindAttributeLocation("vertices", PROGRAM_VERTEX_ATTRIBUTE);
    editor->link();
    editor->bind();
}

void GLWidget::paintGL()
{
    glClearColor(0.4765625, 0.54296875, 0.6171875, 1.0);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glLoadIdentity();
    glTranslatef(0.0f, 0.0f, -10.0f);

    glVertexPointer(3, GL_FLOAT, 0, Objects.at(0).vertices.constData());
    glEnableClientState(GL_VERTEX_ARRAY);

    QMatrix4x4 auxM;
    auxM.ortho(-0.5, 0.5, 0.5, -0.5, 4.0, -15.0);
    auxM.translate(0.0f, 0.0f, -10.0f);
    editor->setUniformValue("modelmatrix", auxM);

    editor->enableAttributeArray(PROGRAM_VERTEX_ATTRIBUTE);

    //editor->enableAttributeArray(editor->attributeLocation("vertices"));
    //editor->setAttributeArray(editor->attributeLocation("vertices"), Objects.at(0).vertices.constData(), 3);

    editor->setAttributeArray (PROGRAM_VERTEX_ATTRIBUTE, Objects.at(0).vertices.constData());
    glDrawArrays(GL_QUADS, 0, 4);
}

void GLWidget::resizeGL(int w, int h)
{
    int side = qMin(w, h);
    glViewport((w - side) / 2, (h - side) / 2, side, side);

    //glViewport(0, 0, w, h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-0.5, 0.5, -0.5, 0.5, 4.0, -15.0);
    glMatrixMode(GL_MODELVIEW);
    updateGL();
}

这是我的 vShader:

attribute highp vec4 vertices;
attribute highp mat4x4 modelmatrix;

void main (void)
{
gl_Position= modelmatrix*vertices;
}

还有我的 fShader:

void main(void)
{
    gl_FragColor= vec4(0.0, 0.1, 1.0, 1.0);
}

你看到那里的错误了吗?

【问题讨论】:

  • 您的着色器完全混乱。 highp 精度限定符在 GLSL 1.10 中不可用,同样mat4x4 在 1.10 中不存在。您至少需要包含#version 120。您是否尝试将 OpenGL ES 着色器与桌面 GL 混合搭配?
  • 你是对的,mat4x4 是错误的。我改变了那个。但我使用的着色器与示例基本相同,它们甚至不使用#version 的东西(我也在 Qt 的其他程序中使用过),它们可以工作,我的不行。
  • 我刚刚注意到的另一件事是 modelmatrix 作为统一值而不是作为属性传递。它已更改,但仍然无法正常工作。

标签: qt opengl fragment-shader vertex-shader vertex-array


【解决方案1】:

您正在混合使用 OpenGLES1.1(例如调用 glOrtho、glTranslate)和 2.0(使用着色器)。你在混合纹理+重绘的例子吗?您应该只举一个使用 OpenGL / ES/ 1.1 或 2.0 的示例 - http://qt-project.org/doc/qt-5.0/qtopengl/textures.html,然后进行更改,看看代码是如何工作的。

【讨论】:

    【解决方案2】:

    我发现了问题所在。

    你说得对,prabindh,我正在混合 OpenGL 版本,问题与此有关。从 OpenGL ES 指令中清理代码后,我还添加了模型、视图和投影矩阵,以便将它们传递给着色器。有效!实际上,我认为飞机一直都在那里,但我只是看不到它,因为“相机正在瞄准其他地方”。

    但我并没有混合示例,而是基于纹理示例中的所有代码。我仍然不明白为什么它的代码有效而我的却没有。但无论如何,在那之后一切都很好。

    感谢您的回答和您的 cmets!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-02
      • 1970-01-01
      • 2020-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多