Shader für den RGB-Versetzungs/Verwacklungs Effekt

  • Allgemein

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

  • Shader für den RGB-Versetzungs/Verwacklungs Effekt

    Ich wollte einen RGB-Versetzungs/Effekt erstellen den man auch später als Verwacklungs Effekt benutzen könnte. ich möchte mich mal was konkreter ausdrücken. Man stelle sich vor, das man drei Bilder hat. Sie sind im Grunde nur die Rot/Grün und Blau Varianten des Originals. Also z.B. Bild_Rot Bild_Gruen Bild_Blau. Wenn man die 3 übereinanderlegen würde, entstände das Vollständige Originalbild mit allen Farben. Wenn man aber jetzt die einzelnen Bild_Farben um 1~10px versetzt, entsteht dieser RGB-Versatz. Das ist im Grunde schon der Effekt. Wenn man diese Verwacklung noch steuern könnte, in dem man die Position der "Ebenen" (unserer einzelnen RGB Bilder) ändern könnte währe der Hammer.

    Das währe doch ein toller Effekt. Man könnte den mit anderen Kombinieren (zB Scanline) und hätte so einen TV-Screen "Simulator" bei dem der Empfang zu schwach ist und das Signal nur Fehlerhaft ankommt. Man könnte auch einfach einen Alten kaputten Röhren-Fehrnsehapparatt, bei dem die einzelnen Farben falsch eingestell sind, darstellen.

    Wenn mir einer helfen könnte und mir einpaar Tips geben könnte währe super. Ich habe vor zwei Tagen mit Shadern begonnen und ernte bereits erste Früchte. Shader sind mega cool. Programmieren allerdings nicht easy. :thumbsup:
    http://gamemakerscript.blogspot.de/
  • Im Shader müsstest du doch relativ einfach den aktuellen Pixel aus den unterschiedlichen Farbkanälen verschobener Pixel zusammensetzen können, um diesen Effekt zu erzielen.
    Ich hab mich selbst aber noch kaum mit Shader-Programmierung beschäftigt (das überlass ich meinen Programmierern ;) ) und kann dir deshalb nicht wirklich mit Code weiterhelfen.
    Vielleicht bringt dich das hier noch auf weitere Ideen: piratehearts.com/blog/2014/03/28/crt-simulation/
    Einige meiner Spiele:
  • Dies ist tatsächlich ziemlich einfach zu realisieren:
    Fragment Shader:

    Quellcode

    1. varying vec2 v_vTexcoord;
    2. varying vec4 v_vColour;
    3. void main()
    4. {
    5. gl_FragColor = v_vColour * vec4(texture2D( gm_BaseTexture, v_vTexcoord).r, texture2D( gm_BaseTexture, v_vTexcoord+vec2(0.01,0.) ).g, texture2D( gm_BaseTexture, v_vTexcoord+vec2(0.02,0.) ).b, 1.);
    6. }

    Sieht auch ganz nett aus.
    EDIT: Zum Steuern musst du einfach uniforme Variablen verwenden. Die konstanten Vektoren können durch diese dann einfach ersetzt werden.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Chris987 ()

  • Herzlichen Dank.
    Habe die Methode probiert und etwas erweitert. Sieht schonmal super aus. Haben shader eigentlich auch eigene timer so wie in GM der get_timer()? Ich führe derzeit die Zeit von Game Maker zum shader über shader_set_uniform_f() zu, aber ich glaube das geht auch Eleganter! Ich habe derzeit 3 Variablen für die Entfernung, wie weit sich das R,G & B Signal versichieben soll und 3 Variablen die die Richtung angeben.

    LG & THX
    http://gamemakerscript.blogspot.de/