alpha in einer Surface, wo keiner sein sollte

  • GM 8

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

  • alpha in einer Surface, wo keiner sein sollte

    'n Abend miteinander,Ich stehe gerade ein bisschen auf dem Schlauch, und komme nicht weiter.
    Mich plagt gerade ein Problem, mit einer Surface.
    Beim erstellen und ersten "bedrawen", erhält die Surface einen Alhpa wert, an einer Stelle an der keiner sein sollte.
    Spoiler anzeigen
    //create surface and draw grid on it
    gridSurf = surface_create(room_width,room_height);
    surface_set_target(gridSurf);
    draw_set_alpha(1);
    draw_set_blend_mode(bm_normal);
    draw_set_color(c_gray);
    draw_rectangle(0,0,room_width,room_height,0);
    draw_set_color(c_white);
    draw_sprite(whiteShadowSpr,0,(room_width / 2) - 400 , 150 - 200);
    draw_rectangle(global.xBar - 1,global.yBar - 1,global.xBar + (global.gridSize * global.gridWidth) + 1,global.yBar + (global.gridSize * global.gridHeight) + 1,1);
    draw_set_blend_mode(bm_subtract);
    draw_set_color(c_white);
    draw_rectangle(global.xBar ,global.yBar ,global.xBar + (global.gridSize * global.gridWidth) ,global.yBar + (global.gridSize * global.gridHeight) ,0);
    draw_set_blend_mode(bm_normal);
    draw_set_color(c_black);
    surface_reset_target();

    Das sollte eigentlich keine große sache sein, jedoch zeichnet er mir das Sprite "whiteShadowSpr" nicht tatsächlich auf die surface, sonder verfährt mit ihr, als hätte ich den Blend Mode bm_subtract aktiviert. Sie zieht also ihren Farb wert, vom Alpha wert(ist das so?) der Surface ab.
    Was auch immer da genau passiert, es entsteht eine Transparenz in der Surface von der ich nicht sagen kann, wo sie her kommt.


    Ich hoffe jemand sieht meinen fehler, oder kennt sich besser mit surfaces aus als ich, und kann mich hierbei aufklären. Das einzige Sprite das ich benutze ist ledigleich ein weißer Fleck auf transparentem hintergrund, der zum Rand ausläuft.

    Ich habe hier Zitate verwendet, da er mir codezeilen immer alle in eine einzige zeile packt...
    LG Partik.
  • Das hat mit dem Blend Mode bm_normal zu tun.
    Da wird nämlich bei genauerer Betrachtung ein Alpha-Wert Quadriert, wo er gar nicht quadriert werden sollte.
    So einfach lässt sich das leider auch ned lösen, es sei denn, du kannst etwas mit Vormultiplizierter Transparenz (siehe gmc.yoyogames.com/index.php?showtopic=474273) anfangen.
    Da gibt's das Problem dann nimmer.

    PS: ich hab da in den Entwürfen noch ein Tutorial zu dem Thema 'rumfliegen, ich sollte es wirklich mal fertig machen xD

    - Tobi97
  • Das ist ein schwierigeres Thema und es ist schwer, alles in einem Post zu erklären, aber es liegt daran, dass bm_normal nicht genau das tut, was viele von ihm verlangen.

    Die Formel für die End-Farbe ist:
    resultierendeFarbe(rot, grün, blau, alpha) = (neueFarbe(rot, grün, blau, alpha) * neueFarbe.alpha) + (jetzigeFarbe(rot, grün, blau, alpha) * (1-neueFarbe.alpha))

    Wenn man jetzt zum Beispiel einen Pixel mit der Farbe (1, 1, 1, 0.5) (1 ist in diesem Fall der höchst mögliche Wert) auf einen Pixel mit der Farbe (0, 0, 0, 1) zeichnet, erwartet man wohl die Farbe (0.5, 0.5, 0.5, 1):
    Das ist aber leider nicht so.

    Aufgelöst erhält man dann (nur den Alphawert betrachtet):
    resultierendeAlpha = (0.5 * 0.5) + (1 * (1-0.5)) = 0.25 + 0.5 = 0.75

    Das ist leider etwas ganz anderes, als das, was man erwarten würde.
    Ich hoffe, das hat es etwas verdeutlicht :).

    Noch zum Schluss: Wenn du z.B. einen Sprite im Room zeichnest, tritt dieser "Fehler" auch auf. Da der Backbuffer (eine Surface, auf die du alles im Raum zeichnest) die Alphawerte ignoriert, weiß man es nur nicht.

    - Tobi97