2016-03-27 15 views
0

Ich schreibe eine einfache OpenGL-Anwendungen, die die Möglichkeit bietet, die Farbe eines Netzes mit einem Fragment-Shader zu ändern. Jedoch ist die uniform float time Variable, die verwendet wird, um die Farbe (sin(time)) regelmäßig zu ändern, aus irgendeinem Grund nicht funktionsfähig.Qt 5.5 und OpenGL: Programm verhält sich merkwürdig ohne ersichtlichen Grund

Darüber hinaus ist das gesamte Netz in einer weißen Farbe ausgefüllt ... EDIT: Ich habe einfach vergessen, das aktuelle ShaderProgramm zu binden. Der einheitliche Schwimmer Zeitvariable nichts zu tun, ist immer noch nicht, obwohl fester ...

Der PaintGL Code:

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; 
} 

die Fragment-Shader:

#version 330 core 

uniform float time; 
out vec3 color; 

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

Hinweis ich die "Vertex" weggelassen Vertex-Shader-Attribut, das zum Platzieren der Scheitelpunkte verwendet wird - das nimmt auch den Index 0 in Anspruch, ich bin mir nicht sicher, ob dies das Problem ist und selbst, wie es zu lösen ist.

qDebug Ausgang (oder ein Teil davon sowieso):

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 
... 

I gefragt, ob vielleicht das Problem, dass sein kann habe ich die Vertex- und Fragment-Shader sowohl loaded im shader QOpenGLShaderProgram Objekt, aber zu diesem Stadium I kann nicht mehr tun, als nur Schätzungen in eine allgemeine Richtung zu werfen.

Antwort

1

Stellt sich das Problem in der Leitung war aus:

shaders->link(); 

kurz nach

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

Sobald ich den Link() Funktionsaufruf alles entfernt normal lief.

Verwandte Themen