Navigation
Artikel
Stuff
RSS Feeds
|
Tutorials - BloomSprachenübersicht/Programmierung/C / C++/ C#/Spieleprogrammierung/Grafik/Effekte Keywords: Bloom, Lichtquelle, Effekt, Grafik Inhaltsverzeichnis
Was ist Bloom? Top
Was soll dieses Script zeigen? Top
Eine typische Renderloop: Top
Code: // initialisieren (OnCreate) // ScreenMask erstellen die den ganzen Bildschirm einnimmt screenMask = ErstelleQuad(-1.0, -1.0, 1.0, 1.0); // Die ScreenMask soll dabei schon transformierte Vertexe besitzen screenMask->SetTransformed(true); // den Blendmodus für das Quad einstellen (Additive) screenMask->SetBlend(One, One); ... // vorbereiten und rendern(OnRender) // Unsere ScreenMask soll dabei die BloomTextur enthalten screenMask->SetBaseTexture(BloomTextur); // Nun die ScreenMask rendern screenMask->Draw();
Das berechnen der BloomTextur: Top
Code: // initialisieren (OnCreate) // Texturen erstellen // geringere Aufloesungen der beiden texturen kann den Bloomeffekt verstärken // aber es koennte auch zu Grafikartefakten kommen BloomTextur = ErstelleTextur(256, 256); TempTextur = ErstelleTextur(256, 256); currentScreen = ErstelleTextur(FensterBreite, FensterHoehe, FensterBitsPerPixel); // ScreenMask erstellen die den ganzen Bildschirm einnimmt bloomMask = ErstelleQuad(-1.0, -1.0, 1.0, 1.0); // Die ScreenMask soll dabei schon transformierte Vertexe besitzen bloomMask->SetTransformed(true); ... // beim berechnen der BloomTextur // Die ScreenMask soll unseren aktuellen FrameBuffer als Textur benutzen // dazu kopieren wir zuerst diesen in eine dafür vorgesehene Textur CopyFrameBuffer(currentScreen); // Nun können wir die Textur verwenden bloomMask->SetBaseTexture(currentScreen); // Blur Filter der ScreenMask zuweisen damit unser ergebnis anständig aussieht bloomMask->SetShader("HorizontalerBlurFilter"); // ab jetzt können wir endlich damit beginnen zu rendern, insgesammt wird 3 mal gerendert RenderToTexture(BloomTextur); // den nächsten Shader bloomMask->SetShader("VertikalerBlurFilter"); // die neue Textur bloomMask->SetBaseTexture(BloomTextur); // wieder rendern, diesmal auf eine andere Textur weil ansonsten Fehler auftreten könnten RenderToTexture(TempTextur); // Nun wird der eigentliche BloomShader zugewiesen // dies könnte man auch in einen der anderen Shader zuweisen, aber um den Vorgang // etwas zu verdeutlichen zeige ich das hier so. bloomMask->SetShader("BloomShader"); // die neue Textur bloomMask->SetBaseTexture(TempTextur); // nun der letzte Rendervorgang RenderToTexture(BloomTextur);
RenderToTexture Renderloop: Top
Die verbesserte RenderLoop die Bufferfehler vermeidet: Top
Ideen für den BloomShader: Top
Beispielshadercode (GLSL): Top
Code: uniform sampler2D texture0_2D; uniform float ddx; uniform float ddy; void main(void) { //Initialisierungen vec4 outp = vec4(0.0, 0.0, 0.0, 0.0); // Texturen auslesen // und vertikal bluren (gauss) outp += 0.015625 * texture2D(texture0_2D, gl_TexCoord[0].xy + vec2(ddx*-3.0, 0.0) ); outp += 0.09375 * texture2D(texture0_2D, gl_TexCoord[0].xy + vec2(ddx*-2.0, 0.0) ); outp += 0.234375 * texture2D(texture0_2D, gl_TexCoord[0].xy + vec2(ddx*-1.0, 0.0) ); outp += 0.3125 * texture2D(texture0_2D, gl_TexCoord[0].xy + vec2(0.0, 0.0) ); outp += 0.234375 * texture2D(texture0_2D, gl_TexCoord[0].xy + vec2(ddx*1.0, 0.0) ); outp += 0.09375 * texture2D(texture0_2D, gl_TexCoord[0].xy + vec2(ddx*2.0, 0.0) ); outp += 0.015625 * texture2D(texture0_2D, gl_TexCoord[0].xy + vec2(ddx*3.0, 0.0) ); gl_FragColor = outp; }
Code: uniform sampler2D texture0_2D; uniform float ddx; uniform float ddy; void main(void) { //Initialisierungen vec4 outp = vec4(0.0, 0.0, 0.0, 0.0); // Texturen auslesen // und horizontal bluren (gauss) outp += 0.015625 * texture2D(texture0_2D, gl_TexCoord[0].xy + vec2(0.0, ddy*-3.0) ); outp += 0.09375 * texture2D(texture0_2D, gl_TexCoord[0].xy + vec2(0.0, ddy*-2.0) ); outp += 0.234375 * texture2D(texture0_2D, gl_TexCoord[0].xy + vec2(0.0, ddy*-1.0) ); outp += 0.3125 * texture2D(texture0_2D, gl_TexCoord[0].xy + vec2(0.0, 0.0) ); outp += 0.234375 * texture2D(texture0_2D, gl_TexCoord[0].xy + vec2(0.0, ddy*1.0) ); outp += 0.09375 * texture2D(texture0_2D, gl_TexCoord[0].xy + vec2(0.0, ddy*2.0) ); outp += 0.015625 * texture2D(texture0_2D, gl_TexCoord[0].xy + vec2(0.0, ddy*3.0) ); gl_FragColor = outp; }
Code: uniform sampler2D texture0_2D; uniform vec4 Contrast; uniform vec4 Brightness; vec4 saturate(vec4 inp) { return clamp(inp, 0.0, 1.0); } void main(void) { //Initialisierungen vec4 outp = vec4(0.0, 0.0, 0.0, 0.0); // Texturen auslesen outp = texture2D(texture0_2D, gl_TexCoord[0].xy ); //Kontrast vec4 c = vec4(2.0,2.0,2.0,1.0) * (vec4(1.0,1.0,1.0,1.0) - Contrast); outp = saturate((outp - vec4(0.5,0.5,0.5,0.5)) * c + vec4(0.5,0.5,0.5,0.5)); //Farben pushen outp *= Brightness; //Helligkeit vec4 b = (vec4(1.0,1.0,1.0,1.0) - Contrast * vec4(2.0,2.0,2.0,1.0)); outp = saturate(outp + b); gl_FragColor = outp; }
Schlusswort Top
Gibt es noch irgendwelche Fragen, oder wollen Sie über den Artikel diskutieren? Sprachenübersicht/Programmierung/C / C++/ C#/Spieleprogrammierung/Grafik/Effekte/Bloom |