OpenGL Vertexshader



  • Versuch mal:

    gl_Position = gl_ModelViewProjectionMatrix * vec4(in_position, 0, 1);
    

    Vierter Wert also eine 1 anstelle einer 0.

    Warum das alles so kompliziert sein muss frag ich mich auch. 😃
    Ist nicht einfach da durchzublicken und zu lernen. Kaum hat man was gelernt, stellt man fest, dass dies nicht mehr die aktuelle Vorgehensweise ist.
    Hab mir damals die Tutorials auf delphigl.com und die NeHe Tutorials angeschaut (alles immidiate mode) um dann festzustellen, dass dies alles wieder gleich vergessen werden kann - da man nur noch mit VBOs arbeitet.

    Und so isses leider mit vielem 🙂
    Wirklich aktuelle Tutorials und Literatur findet man für OpenGL leider extrem wenig. Da siehts bei DirectX / Direct3D ganz anders aus - super Tutorials gleich in der MSDN - wird sofort auf vertex buffer eingegangen, mit Shadern gearbeitet etc.
    Sowas würde man sich auch für OpenGL wünschen.



  • gl_Position = gl_ModelViewProjectionMatrix * vec4(in_position, 0, 1);
    

    Vierter Wert also eine 1 anstelle einer 0.

    Pikkolini schrieb:

    Und wie speicherst du deine ganze Matrizen in Arrays, irgendwie hab ich von diesem ganzen neuem Zeug noch nichts gehört, und wär cool, wenn es irgendeine Seite gibt, wo mal einem Unwissenden auf die Sprünge geholfen wird.

    Naja, es handelt sich um 4x4 Matrizen, also 16 Werte (column-major-order).
    Also hab speicher ich 16 Werte in nem vector (STL-Container) oder arrays und arbeite auf denen. Beim rendern übergeb ich sie einach an die shader.

    Warum das alles so kompliziert sein muss frag ich mich auch. 😃
    Ist nicht einfach da durchzublicken und zu lernen. Kaum hat man was gelernt, stellt man fest, dass dies nicht mehr die aktuelle Vorgehensweise ist.
    Hab mir damals die Tutorials auf delphigl.com und die NeHe Tutorials angeschaut (alles immidiate mode) um dann festzustellen, dass dies alles wieder gleich vergessen werden kann - da man nur noch mit VBOs arbeitet.

    Und so isses leider mit vielem 🙂
    Wirklich aktuelle Tutorials und Literatur findet man für OpenGL leider extrem wenig. Da siehts bei DirectX / Direct3D ganz anders aus - super Tutorials gleich in der MSDN - wird sofort auf vertex buffer eingegangen, mit Shadern gearbeitet etc.
    Sowas würde man sich auch für OpenGL wünschen.



  • Also das Viereck seh ich jetzt wieder, nur ist da nichts verschoben...
    Was gibt der vierte Wert eigentlich an?
    Und ist es sinnvoll, zu D3D zu wechseln, wenn ich eh nur für Windows programmieren möchte?



  • Pikkolini schrieb:

    Also das Viereck seh ich jetzt wieder, nur ist da nichts verschoben...
    Was gibt der vierte Wert eigentlich an?

    Der Wert wird genutzt, um die NDC coordinate (normalized device coordinate) zu berechnen. Dabei werden die clip-Koordinaten durch diesen Wert (w) geteilt.
    Dazu auch mal hier schaue: OpenGL Transformation

    Pikkolini schrieb:

    Und ist es sinnvoll, zu D3D zu wechseln, wenn ich eh nur für Windows programmieren möchte?

    Das kann man so pauschal nicht sagen, das musst du für dich selbst entscheiden. Es gibt sowohl für OpenGL als auch für D3D pros und contras.
    Die meisten empfinden allerdings das Erlernen von OpenGL einfacher, was natürlich immer ein subjektives Empfinden ist.



  • Ok, das mit der Transformation habe ich jetzt verstanden.
    Alllerdings erklärt das nicht, wieso das Viereck nicht verschoben wird.



  • Ich glaube du darfst nicht direkt die Werte von in_position ändern.

    Stattedessen erstellt du dir lokal eine Kopie und arbeitest damit weiter:

    #version 120
    
    in vec2 in_position;
    uniform int move;
    
    void main(void)
    {
        vec2 tmpPosition = in_position;
       if (move != 0)
       {
          tmpPosition.x += 1.0f;
       }
       gl_Position = gl_ModelViewProjectionMatrix * vec4(tmpPosition, 0, 0);
    }
    


  • Wie immer ist es richtig 😃
    Wie kannst du dir in so wenigen Tagen so viel Wissen aneignen?
    Aber eine Frage bleibt noch immer.
    Kann ich im Shader eine Variable definieren, die jeden Programablauf "überlebt"? Also das ganz ohne Umweg über den Hauptspeicher die Position um einen Pixel erhöht wird.



  • Ähm, verstehe jetzt nicht genau was du meinst.
    Welchen Umweg über den Hauptspeicher?

    Ich lese die OpenGL Superbible und nebenbei noch "Beginning OpenGL - Game Programming 2nd Edition" und eben die Reference Pages und Specifications.



  • Also ich könnte ja jetzt in meinem C++ Programm die Variable move definieren und diese dann bei jedem Rendervorgang um eins erhöhen. Das meine ich mit Umweg über den Hauptspeicher.
    Jetzt ist meine Frage, ob ich auch ohne diesen Umweg direkt im Shader eine Variable bei jedem Rendervorgang um 1 erhöhen kann.



  • Das Problem ist, dass der VertexShader nicht nur einmal aufgerufen wird pro render-Durchlauf, sondern eben für jedes Vertice. Daher wird das so nicht funktionieren und du musst eben über eine uniform-Variable gehen.


Anmelden zum Antworten