2016-03-27 26 views
0

Bir parça gölgelendiriciyi kullanarak bir ağın rengini değiştirme yeteneğine sahip basit bir OpenGL uygulaması yazıyorum. Ancak, rengin periyodik olarak değiştirilmesi için kullanılan uniform float time değişkeni (sin(time)) bazı nedenlerle işlevsizdir.Qt 5.5 ve OpenGL: Program herhangi bir neden olmadan garip bir şekilde davranıyor

Ayrıca, tüm kafes beyaz renkte doldurulur ... DÜZENLEME: Sadece geçerli shaderProgramı bağlamayı unuttum. hiçbir şey yapmıyor üniforma şamandıra zamanı değişken hala ... gerçi sabit değildir

PaintGL kodu:

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

fragmanı shader: Ben "köşe" atladık

#version 330 core 

uniform float time; 
out vec3 color; 

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

Not verteks yerleştirmek için kullanılan köşe shader özniteliği - bu da indeksi 0 alır, ben sorun bu ise ve nasıl çözülürse emin değilim.

qDebug çıkışı (veya yine de bazı), belki de problem olabilir merak

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

Bu işte shader QOpenGLShaderProgram nesnesinde yüklenen her iki köşe ve shader parçası vardır, ancak Aşama, sadece genel bir doğrultuda tahminler atmaktan fazlasını yapamaz.

cevap

1

sorun hattında olduğu ortaya çıktı:

shaders->link(); 

Sadece bağlantı() işlev çağrısı her şey normal ran kaldırıldı kez

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

sonra.

İlgili konular