Reflexion Shader für 3d - ich hab ihn fasst zusammen, helft mir :)

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Reflexion Shader für 3d - ich hab ihn fasst zusammen, helft mir :)

    Hi @ all,

    hab mich ein wenig mit Mathe bseonders der WInkelberechnung zweier 3d Vektoren beschäftigt.
    Ich will einen Shader bauen der das Licht reflektiert und Flächen damit zum Glänzen bringt.

    Mein Versuch ähnelt schon etwas einer Reflexion ist aber noch sehr unrealistisch.

    So schaut der Shader aus:

    Vertex Shader:

    GML-Quellcode

    1. [/b]
    2. attribute vec3 in_Position; // (x,y,z)
    3. //attribute vec3 in_Normal; // (x,y,z) unused in this shader.
    4. attribute vec4 in_Colour; // (r,g,b,a)
    5. attribute vec2 in_TextureCoord; // (u,v)
    6. varying vec2 v_vTexcoord;
    7. varying vec3 v_vColour;
    8. varying float reflection;
    9. uniform vec3 Cam;
    10. uniform vec3 LightPos;
    11. void main()
    12. {
    13. vec4 object_space_pos = vec4( in_Position.x, in_Position.y, in_Position.z, 1.0);
    14. gl_Position = gm_Matrices[MATRIX_WORLD_VIEW_PROJECTION] * object_space_pos;
    15. v_vColour = in_Colour.rgb;
    16. v_vTexcoord = in_TextureCoord;
    17. vec3 normal, normal2, normal3;
    18. float angle, angle2;
    19. normal = normalize(object_space_pos.xyz);
    20. normal2 = normalize(Cam);
    21. normal3 = normalize(LightPos);
    22. angle = acos(dot(normal, normal2));
    23. angle2 = acos(dot(normal, normal3));
    24. reflection = max(float(mod((angle - angle2 + 360.0), 360.0) * 0.005), 0.7);
    25. }[b]
    Alles anzeigen


    Fragment Shader:

    GML-Quellcode

    1. [/b]
    2. varying vec2 v_vTexcoord;
    3. varying vec3 v_vColour;
    4. varying float reflection;
    5. void main() {
    6. gl_FragColor = vec4(reflection * v_vColour.rgb, 1.0) * texture2D( gm_BaseTexture, v_vTexcoord );
    7. }



    Ihr könnt ja den Shader selber mal ausprobieren. Wie gesagt er wird einer realistischen Reflexion nicht gerecht, aber es sieht schon irgendie nach einer Reflexion aus.

    Kann mir vielleicht jemand helfen das Teil besser zumachen?
  • Die ganzen Berechnungen sollten im Fragment Shader durchgeführt werden. Ansonsten bekommt man nichts schönes hin. Zudem gibt es für diese Berechnung extra die Funktion reflect(vecA, vecB).
    Bei mir hat diese Seite extrem geholfen. Zwar ist es nicht für den Gamemaker geschrieben, es ist aber möglich alles zu übertragen. Das wonach du suchst nennt sich specular lightning,

  • Hm... das ist so aber nicht ganz richtig was du sagst. Bin mir ziemlich sicher. Denn wenn ich alle Berechnungen im Fragmentshader ausführe muss die GPU das für jeden Pixel tun. Im Vertexshader hingegen nur für jedes Vertex. Oder versteh ich was falsch?

    Aber danke dir für den link. Werd ich ich mich mal reinlesen :)
  • Es stimmt das die Berechnungen für jeden Pixel durchgeführt werden muss. Das ist auch der Sinn des Fragmentshaders. Allerdings schreiben wir das Jahr 2016, wo das performance technisch absolut gar keine Rolle mehr spielt. Und der Qualitätsunterschied ist enorm. Z.B wenn du eine Fläche hast, die mit 4 Vertexen dargestellt wird, so ist es quasi unmöglich den Lichtpunkt zu reflektieren. Das ist so als ob du einen großen Kreis mit 4 Pixeln zeichnen möchtest.