glBlend funktioniert nicht für leuchtende Texturen?

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

Aufgrund der Corona-Krise: Die Veröffentlichung von Stellenangeboten und -gesuchen ist bis 31.12.2020 kostenfrei. Das beinhaltet auch Angebote und Gesuche von und für Freischaffende und Selbstständige.

  • glBlend funktioniert nicht für leuchtende Texturen?

    Langsam bekomme ich die Krise mit der Blendfunktion :cursing:

    Der Standardmodus geht ganz gut mit "GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA" dort werden transparente Anteile wie eine Folie dargestellt. So geht Farbe auf den Hintergrund über aber er wird nicht übermäßig aufgehellt.

    Wenn ich jetzt aber Texturen wie ein Lichtschein verwenden will, z.B. bei Partikeln von Licht etc. dann will ich das die Textur aufhellend wirkt, und wenn sich zwei transparent Rote treffen, soll das Rot doppelt so stark rüber kommen, ihr versteht. Das ganze sieht auch so aus wie ich mir vorstelle wenn ich "GL_ONE, GL_ONE_MINUS_SRC_ALPHA" verwende. ABER es wäre ja zu schön wenn das die Lösung wäre, wenn ich das verwende ist meine alpha Einstellung auf einmal Tod, so als wäre da immer Wert 1 gesetzt.

    "glColor4f(colR, colG, colB, colA); // Deckungskraft/Transparentz für Farbkanäle sowie für Alphakanal festlegen"
    Das geht nicht mehr wirklich.

    Ein reduzieren von colA fadet mir sonst schön die Textur aus, immer schwächer bis sie bei 0 verschwindet.
    Und das geht jetzt gar nicht mehr wenn ich "GL_ONE, GL_ONE_MINUS_SRC_ALPHA" verwende.

    Ich habe jetzt die Erklärungen rauf und runter gelesen aber ich habe das einfach nicht finden können. Im Grunde suche ich genau das, nur eben das ich mit Programm gesteuertem Alpha noch schön ausfaden kann wie gehabt.

    Kann doch nicht sein das ich der einzige will der Texturen leuchten lassen und ausfaden lassen können will ;)

    PS: Habe ein Bild angehangen, dort sieht man Links wie es in Photoshop aussieht, und Rechts mit der "GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA" Einstellung in OGL, es sieht so aus als hätte die Textur einen Schatten, und das will ich nicht wenn ich diesen "glow" Effekt wie ein Licht einsetzen möchte. Deshalb der Versuch den zweiten Blend Modus einzuführen.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von RayJunx () aus folgendem Grund: Dateianhang hinzugefügt

  • Bei den BlendFunc bekomme ich nach all der Zeit immernoch eine Kriese. Wenn Du einfach nur addieren willst, sollte es dann nicht GL_SRC_ALPHA,GL_DST_ALPHA sein? Eventuell passt sogar GL_ONE,GL_ONE. Ansonsten auf default lassen und im shader händisch blenden, sollte das am einfachsten nachzuvollziehende und zu "tweaken" sein.

    Ich glaube, ich hatte mal eine Seite gesehen, die alle Photoshop-Operation in GL (oder zumindest als Formel) auflisten, da kannst Du mal Google bemühen. Und ich glaube in irgend einem dieser OpenGL-Wikis gibt es auch ein Beispiel für jede Kombination. Aber wiegesagt, Blending aktivieren und im Shader selber machen :D
    C++
  • In meinem Buch hab ich ein Beispiel (Photoshop Filter) mit nem Shader nachgebaut. Hier der Fragment-Shader, der die eigentlich Arbeit macht.

    Quellcode

    1. uniform sampler2D baseTexture;
    2. uniform sampler2D blendTexture;
    3. uniform float opacity;
    4. uniform int mode;
    5. void main(void)
    6. {
    7. vec4 base = texture2D(baseTexture, gl_TexCoord[0].xy);
    8. vec4 blend = texture2D(blendTexture, gl_TexCoord[0].xy);
    9. vec4 result;
    10. //Normal
    11. if(mode == 0)
    12. result = blend;
    13. //Average
    14. else if(mode == 1)
    15. result = (base+blend)*0.5;
    16. //Multiply
    17. else if(mode == 2)
    18. result = base*blend;
    19. // Screen
    20. else if(mode == 3)
    21. result = 1.0-((1.0-blend)*(1.0-base));
    22. // Darken
    23. else if(mode == 4)
    24. result = min(blend, base);
    25. //Lighten
    26. else if(mode == 5)
    27. result = max(blend, base);
    28. // Difference
    29. else if(mode == 6)
    30. result = abs(blend-base);
    31. // Soft Light
    32. else if(mode == 7)
    33. result = 2.0*base*blend+base*base-2.0*base*base*blend;
    34. // Color Dodge
    35. else if(mode == 8)
    36. result = base / (1.0-blend);
    37. // Color Burn
    38. else if(mode == 9)
    39. result = 1.0 - (1.0-base) / blend;
    40. // Behind
    41. else if(mode == 10)
    42. {
    43. if(result.a == 0.0)
    44. result = blend;
    45. else
    46. result = base;
    47. }
    48. // Clear
    49. else if(mode == 11)
    50. {
    51. result.rgb = blend.rgb;
    52. result.a = 0.0;
    53. }
    54. // Add
    55. else if(mode == 12)
    56. result = blend + base;
    57. // Substract
    58. else if(mode == 13)
    59. result = base - blend;
    60. // Inverse Difference
    61. else if(mode == 14)
    62. result = 1.0-abs(1.0-base-blend);
    63. // Exclusion
    64. else if(mode == 15)
    65. result = base + blend-(2.0*base*blend);
    66. result = clamp (result, 0.0, 1.0);
    67. gl_FragColor = mix(base, result, opacity);
    68. }
    Alles anzeigen