Qt 5.5和OpenGL:程序行为奇怪,没有任何明显的原因

时间:2016-03-27 01:05:22

标签: c++ qt opengl shader

我正在编写一个简单的OpenGL应用程序,它具有使用片段着色器更改网格颜色的功能。但是,用于定期更改颜色(uniform float time)的sin(time)变量由于某种原因无法正常运行。

此外,整个网格填充为白色...编辑:我只是忘了绑定当前的shaderProgram。没有做任何事情的统一浮点时间变量仍然没有修复......

PaintGL代码:

void OpenGLWidget::paintGL() {
    static unsigned int frame = 0;

    vao->bind();
    shaders->link();
    shaders->bind();

    // Enabling custom shader atttributes
    int timeIndex = shaders->uniformLocation("time");

    qDebug() << "Time index:" << timeIndex;

    shaders->setUniformValue(timeIndex, time->elapsed());
    shaders->link();

    qDebug() << "Frame " << frame << "| created = " << elems->isCreated() << "| time = " << time->elapsed()/1000.f;

    glDrawElements(GL_TRIANGLE_FAN, rawelems.size(), GL_UNSIGNED_INT, 0);

    vao->release();
    ++frame;
}

片段着色器:

#version 330 core

uniform float time;
out vec3 color;

void main() {
    color = vec3( sin(time), 1.0f, 0.0f );
}

注意我省略了用于放置顶点的​​“顶点”顶点着色器属性 - 也占用了索引0,我不确定这是否是问题,即使它是如何解决它。

qDebug输出(或者其中一些输出):

TimeINDEX: 0

Shader compilation log: ""
Time index: 0
Frame  0 | created =  true | time =  0.268
Time index: 0
Frame  1 | created =  true | time =  0.372
Time index: 0
Frame  2 | created =  true | time =  0.44
...

我想知道问题是否可能是因为我在shader QOpenGLShaderProgram对象中加载了顶点和片段着色器,但在这个阶段我只能在一般方向上猜测

1 个答案:

答案 0 :(得分:1)

原来问题在于:

shaders->link();

之后

shaders->setUniformValue(timeIndex, time->elapsed());

一旦我删除了link()函数调用,一切都正常运行。