GLSL - Kommunikation zwischen OpenGL-Kontext und Shader



  • Eine Texturkoordinate liegt ja im Bereich [0..1[
    Du musst also lediglich den "Index" (0..n) durch die Texturbreite dividieren.
    Wenn Deine Textur zb. 64 "Pixel" breit ist, liegt der erste "Pixel" bei (0, 0) der zweite bei (1/64, 0), (2/64, 0), usw.

    Desweiteren moechtest Du fuer jeden Ausgabe-Pixel die naechste Texturzeile adressieren. Diese Koordinate kannst Du Dir vom Rasterizer interpolieren lassen indem Du Deinem Polygon einfach eine Texturkoordinate mitgibst (rechts=0, links=1).



  • hmm, leider macht mein kleines Programm immer noch nicht das was es soll.
    Eine Frage die sich mir z.B. noch stellt:

    Wenn ich die Textur als einzige Eingabe für den Shader nutze, (und nichts rendere) wird der Vertexshader (oder Geometryshader) doch erst gar nicht verwendet, oder?
    Müsste ich ein Quad mit der Textur rendern oder gibts da eine andere elegante Lösung?



  • o.k. die Frage hat sich erledigt 😉

    Aber ich hab noch eine Frage praktischer Natur:

    ich habe einen Vertex-Shader und einen Geometry-Shader und will einen einfachen Vector erst von OpenGL an den Vertex-Shader, dann vom Vertex-Shader an den Geometry-Shader übergeben.

    Nach einigen Tests, scheint aber mindestens die Übergabe zwischen den Shadern schon schief zu laufen:

    Vertexshader;

    #version 120
    
    uniform vec4 normal; //da kommt was rein
    varying vec4 var_normal; //das will ich raus schicken
    
    void main(void)
    {
      gl_FrontColor = gl_Color;
      gl_Position = gl_ModelViewProjectionMatrix*gl_Vertex;
    
      //var_normal = normal;
      var_normal = vec4(1.0,0.0,0.0,1.0); //fester Wert, zum testen
    }
    

    Geometry-Shader(Snippet):

    varying in vec4 var_normal;
    

    Leider kommt nix an. Erst wenn ich den Vector im Geometry-Shader mit dem entsprechenden Wert belege, sehe ich ein Ergebnis. Fehlt noch irgendein Schlüsselwort, oder sowas in der Art?

    Grüße,
    mtx



  • Wenn ich die Textur als einzige Eingabe für den Shader nutze, (und nichts rendere) wird der Vertexshader (oder Geometryshader) doch erst gar nicht verwendet, oder?

    Ich weiss jetzt nicht so richtig was meinst.
    Wenn Du nichts "renderst", dh keine Vertexdaten schickst, kommt auch der Pixel-Shader zwangslaeufig nicht zum Einsatz.
    Wenn Dein Shader ein Vertex-Programm beinhaltet (glAttachObjectARB) laufen Deine Vertexdaten da auch durch, sonst eben durch die Fixed-Function-Pipeline.
    In letzterem Fall muss Dein Pixel-Programm die Parameter eben von den vorgeschriebenen "Registern" (zb gl_TexCoord[0].xyzw) lesen.
    Persoenlich finde ich es uebersichtlicher, immer ein Vertex-Programm zu benutzen weil die Parameter-Uebergabe zwischen Vertex- & Pixel-Programm einheitlich ist.
    Wenn es *gar nicht* das tut was Du erwartest, guckst Du am besten mal in den Error-String vom Shader-Compiler (glGetInfoLogARB).

    Geometry-Shader(Snippet):

    varying in vec4 var_normal;
    

    Sehr knappes Snippet 😉
    Willst Du denn jetzt Geometry Shader oder Pixel-Shader verwenden?
    Im Geometry-Shader gehoert "var_normal" ja zu einem (indizierten) Vertex...



  • hat etwas länger gedauert, aber: es hat doch noch geklappt.
    Lag nicht an meinem Code, sondern an einer verwendeten Klasse 🙂

    Vielen Dank!



  • Hallo zusammen,

    ich habe im Moment das Problem, dass ich eine float Variable an meinen Shader übergeben möchte und da irgendwie nichts ankommt.

    Dabei gehe ich vor wie im Orange Book und Super Bible beschrieben.

    GLint glGetUniformLocation(GLuint program, const char *name); 
    
    GLint glVertexAttrib{1,2,3,4}fv(GLint location, GLfloat *v);
    

    Doch irgendwie bleiben die Objekte komplett schwarz oder weiß.

    Der Zugriff darauf findet erst im Fragment-Shader statt. Dort habe ich sie wie folgt definiert;

    uniform float fade;
    

    In meinen Szenen Prozeduren definiere ich mir jedes Mal diese fade Variable und übergebe diese. Ist diese Vorgehensweise vielleicht falsch? Muss diese Variable vielleicht an einer anderen Stelle definiert werden, in den Beispielen aus den oben genannten Büchern sind diese global definiert, aber unter C++ finde ich das eher unschön?

    Mfg

    FireballGFX



  • glVertexAttrib{1,2,3,4}fv

    Nimm mal lieber glUniform1234fvARB.



  • Hallo zusammen,

    wie ist das eigentlich, da ich meine fade Variable im Fragment Shader benötige, kann ich dann einfach per Uniform darauf zugreifen oder muss ich sie im Vertex Shader definieren und zugleich als varying? Wenn ich die Anwendung debugge, dann kommt er auch in den glUniform2fARB Teil. Aber trotzdem scheint im Shader nichts anzukommen. Alle Objekte sind komplett weiß.

    C++ Code

    GLfloat fade = 0.5f;
    ...
    uniformFade = glGetUniformLocation(progObj[LIGHT_SHADER], "fade");
    	if (uniformFade != -1)
    	{
    		glUniform2fARB(uniformFade, 1, fade);
    	}
    
    ...
    uniform float fade;
    ...
    
    void main(void)
    {
            float specularExp;
    
    	if(fade == 0.5f)
    	{
    		specularExp = 89.0;
    	}
    
    ...
    

    Mfg

    Fireball



  • glUniform2fARB

    Du schreibst zwei floats an die Position von "fade".

    if(fade == 0.5f)
    

    Sowas wird haeufig scheitern weil die Praezision der GPU-Register nicht eindeutig festgelegt ist.



  • Super, dass war der Fehler!! Danke dir!


Anmelden zum Antworten