Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

16.05.2017, 17:03

Shader Frage (glow Shader)

Hallo,

ich hab einen shader (glow.glsl) and ich würde gern ein Farbinput zufügen (für R G und B jeweils einen wert)

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
extern Image glowImage;
extern float glowTime;

vec4 effect(vec4 color, Image texture, vec2 texture_coords, vec2 pixel_coords) {
    vec3 glowInfo = Texel(glowImage, texture_coords).rgb;

    if(glowInfo.r != glowInfo.g) {
        float glowStrength = glowTime + glowInfo.b;
        if(mod(glowStrength, 2.0) < 1.0) {
            glowInfo.b = mod(glowStrength, 1.0);
        } else {
            glowInfo.b = 1.0 - mod(glowStrength, 1.0);
        }

        return Texel(texture, texture_coords) * (glowInfo.g + glowInfo.b * (glowInfo.r - glowInfo.g));
    }
    
    return vec4(Texel(texture, texture_coords).rgb * glowInfo.r, 1.0);
}


Der Input scheint mir über "extern" zu funktionieren. Den Farbwert nimmt der Shader nun aus dem glowImage input. Jedoch möchte ich diesen gerne selbst festlegen.

Als kleines extra Schmankerle wäre noch cool wenn der glow Effect einen kurzen Moment dunkel verbleiben könnte bevor er wieder heller wird.

Anbei auch noch wie das ganze dann ingame aussieht:

(Link)


(Link)


Das schnelle blinken soll dann in Rot erfolgen und zwar wenn der Lebensbalken fast am Ende ist.

Jemand einen Hinweis was zu googeln ist bzw in welcher Programmiersprache der Shader geschrieben ist?

edit: hab gerade gemerkt, dass das hier besser zu Grafik anstelle von Programmierung passt :-/

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

16.05.2017, 17:13

ich hab einen shader (glow.glsl)

Jemand einen Hinweis was zu googeln ist bzw in welcher Programmiersprache der Shader geschrieben ist?

s.o. ;)

3

16.05.2017, 17:19

ok ok .... hau mich nicht gleich xD

und jetzt muss ich mich tiefgreifend mit der OpenGL shading language auseinander setzten? ;(

edit: ist es richtig das Farbwerte nicht in 0 bis 255 angegeben werden? Ich müsste vielleicht so was machen wie

extern int Inputvariable

vec3 glowInfo = ( Inputvariable ).rgb;


aber kann die Inputvariable dann werte zwischen 0 und 255 enthalten?????

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »NoAim91« (16.05.2017, 17:47)


TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

4

16.05.2017, 19:49

@David: Ich verstehe deine Antwort, allerdings finde ich den OpenGL kram auch besch...eiden zu googlen, man findet ja nichts einheitliches, je nach OpenGL Version muss man andere Spielregeln beachten, bei HLSL ist das deutlich einfacher. Selbst John Carmack sagt ja, dass das GLSL Zeug "is a mess".

@NoAim91: Ja du solltest dich schon damit beschäftigen, wie mit jeder Sprache. Allerdings ist der beste Tipp den ich dir geben kann: Such dir ein Tutorial, z.B. das hier und klau den shader, bis er läuft. So bin ich am besten gefahren.

SlinDev

Treue Seele

Beiträge: 142

Wohnort: Lübeck

Beruf: Programmierer

  • Private Nachricht senden

5

16.05.2017, 21:40

Welche engine nutzt du da?
Sowohl das "extern" aber vor allem das "Texel" und "Image" ist soweit ich weiß nicht teil von GLSL.

Um dein Problem zu lösen musst du wie du selbst schon festgestellt hast irgendwie die Farbe in den Shader bekommen, dazu gibt es in GLSL normalerweise Uniforms oder Uniform Buffer, die dann gleich mehrere Uniforms enthalten. Dabei muss die Engine irgendwie die wissen welche Uniforms dein Shader nutzt und dann der Grafikkarte entsprechend die gewünschten Werte dafür geben. Wie du das ganze dann benutzen kannst ist stark von der Implementierung in der Engine abhängig.

Die Werte im Shader sind meistens 16 oder 32 bit floats und Farben werden meistens in Werten zwischen 0 und 1 ausgedrückt, was du dann am besten schon in deinem Programm entsprechend anpasst und dem Shader schon gleich die Werte im 0-1 Bereich gibts. Dazu musst du ja einfach nur deinen Farbwert für jeden Kanal durch 255 teilen (Wenn du sowas wie Gamma beachtest musst du eventuell die Farbe noch umrechnen...). Außerdem kannst du gleich alle drei Werte auf einmal als vec3 dem Shader geben und brauchst die nicht einzeln pro Farbkanal.

6

16.05.2017, 22:39

Ok bin schon mal etwas schlauer was das mit dem Texel ist:

Quellcode

1
Texel(texture, texture_coords); // This reads a color from our texture at the coordinates


Den Farbcode bekomme ich auch in den Shader:

Quellcode

1
extern vec4 Color


was nicht mehr bedeutet als das in "Color" 4 werte enthalten sind .... (R,G,B,Transparenz?!)



vec4 = 1.Farbe, 2.Image, 3. coordinaten, 4. coordinaten

Quellcode

1
return vec4(Texel(texture, texture_coords).rgb * glowInfo.r, 1);


Der return überschreibt nur die ersten beiden von den 4 oben initialisierten Werten?! (und den zweiten auch nur mit einer statischen 1)
Ich frage mich allerdings warum Texel().rgb * glowInfo.r ... also warum nur den Roten Kanal? Oder versteh ich das falsch?

Außerdem verstehe ich nicht warum bei dem return texel(TEXTURE..) steht anstelle von texel(glowImage) ... es muss doch nochmal auf den input Bezug genommen werden?!?!


edit1: Kleiner Nachtrag:
Ich hab den Code soweit geändert das schon mal der gesamte Charakter im gleichlang pulsiert. Vorher hatten die verschiedenen Farben ihr eigenes auf und ab in der Helligkeit.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »NoAim91« (16.05.2017, 22:51)


Werbeanzeige

Ähnliche Themen