OpenGL/GLSL Problem: glGetUniformLocation() geht nicht



  • Hallo ich habe (mal wieder) ein Problem mit OpenGL.

    Diesmal gibt die Funktion glGetUniformLocation() andauernd 0 oder -1 zurück.

    Der Code im Programm:

    rotateX = glGetUniformLocation( program, "rotateX");
    rotateY = glGetUniformLocation( program, "rotateY");
    rotateZ = glGetUniformLocation( program, "rotateZ");
    transX = glGetUniformLocation( program, "transX");
    transY = glGetUniformLocation( program, "transY");
    scaleX = glGetUniformLocation( program, "scaleX");
    scaleY = glGetUniformLocation( program, "scaleY");
    

    Die ersten drei(rotateX, rotateY und rotateZ) sind das Problem.
    Die anderen gehen.

    Der Vertex-Shader:

    #version 330 core
    
    layout(location = 0) in vec4 vPosition;
    
    uniform float rotateX;
    uniform float rotateY;
    uniform float rotateZ;
    
    uniform float transX;
    uniform float transY;
    
    uniform float scaleX;
    uniform float scaleY;
    
    mat4 model;
    
    void
    main()
    {
        model = mat4( scaleX, 0     , 0, transX,
    		  0     , scaleY, 0, transY,
    		  0     , 0     , 1, 0     ,
    		  0     , 0     , 0, 1      );
    
        model *= mat4(1, 0          , 0           , 0,
    		  0, cos(rotateX), -sin(rotateX), 0,
    		  0, sin(rotateX), cos(rotateX) , 0,
    		  0, 0          , 0           , 1 );
    
        model *= mat4(cos(rotateY), 0, -sin(rotateY), 0,
    		    0          , 1, 0           , 0,
    		    sin(rotateY), 0, cos(rotateY), 0,
    		    0          , 0, 0           , 1 );
    
        model *= mat4(cos(rotateZ), -sin(rotateZ), 0, 0,
    		    sin(rotateZ), cos(rotateZ), 0, 0,
    		    0          , 0           , 1, 0,
    		    0          , 0           , 0, 1 );
    
        gl_Position = vPosition * model;
    }
    

    Die beiden Dreiecke sollen per WASD verschoben werden, per TFGH skaliert und per IJKL gedreht werden.
    Aber zu den möglichen Fehlern im Shader 😃 kommt es garnicht.

    Danke schonmal im Voraus
    Skybuildhero



  • Wird der Shader erstellt (erfolgreicher Link, Kompilierung)?



  • Ja
    Jedefalls sagt er das.



  • 0 ist ok, -1 nicht; wieso um Himmels Willen baust du diese Matritzen im Shader, anstatt einfach die fertige Matrix an den Shader zu übergeben?



  • Aber es zeigt auch manchmal -1 an.

    Aber das mit der Matrix im Shader ist eine gute Frage...
    ICh werd mal probieren obs so besser geht.



  • Spontan sehe ich da zwar keinen Fehler, aber du solltest wirklich dringend die MAtrix im Programm zusammenbauen, anstatt im Shader.
    Zwar ist die Graphikkarte schneller was das Berechnen angeht, allerdings wird das hier unnötigerweise mehrfach (pro Vertex und Frame) durchgeführt, während die sie eigentlich nur maximal einmal pro Frame neu berechnen müsstest (falls dene Szene nicht bewegt wurde muss z.B. gar keine Berechnung durhgeführt werden)
    Zudem ist es (deutlich) teurer, mehrere kleine Variablen an den Shader zu schicken, als eine große.

    Was der Shader-Compiler gut kann ist es, toten Code zu eliminieren. Falls eine Variable nicht benutzt wird, oder durch irgendein seltsames Konstrukt nicht mehr relevant ist (a = b * 0) wird die komplette uniform Variable aus dem Shader entfernt und getUniformLocation gibt -1 zurück. Sowas ist dann natürlich teilweise schwer zu finden.



  • Baldur schrieb:

    Was der Shader-Compiler gut kann ist es, toten Code zu eliminieren. Falls eine Variable nicht benutzt wird, oder durch irgendein seltsames Konstrukt nicht mehr relevant ist (a = b * 0) wird die komplette uniform Variable aus dem Shader entfernt und getUniformLocation gibt -1 zurück. Sowas ist dann natürlich teilweise schwer zu finden.

    Ja, wobei ich auf den ersten Blick nicht sehe, wieso der Compiler das tun sollte. Aber man kann ja nachfragen, ob der entsprechende uniform active ist...



  • Danke!
    Es läuft jetzt.
    Ich hab jetzt das Matrixerstellen im programm gemacht und sende die fertige Matrix an den Shader.


Anmelden zum Antworten