[as3 - cs4] classe effet hdr glow

Soyez le premier à donner votre avis sur cette source.

Vue 8 417 fois - Téléchargée 846 fois

Description

Cette classe permet de créer très facilement en 1 ligne de code un effet de High Dynamic Range Glow sur n'importe quel display object de l'application.

Le bloom ou HDRGlow comme je l'appel ici est le phénomène observé lorsque l'on place un objet très lumineux derrière un autre objet plus ou moins réfléchissant. On peut voir avec une sorte de glow la lumière de l'objet lumineux part dessus l'objet le recouvrant... (les exemples parlent d'eux même)

Normalement, on parle pour cet effet de Bloom, j'utilise le mot Glow car c'est un filtre Glow que j'utilise au final dans la classe, bien que cela soit totalement invisible aux yeux de l'utilisateur.

Il faut savoir pour finir que l'effet de "bloom" est une "simulation", un vrai effet bloom se calcul sur une scène 3D, cependant les résultats sont assez satisfaisants.

Source / Exemple :


La classe HDRGlow est fournie avec deux exemples pour l'illustrer, ainsi qu'une autre classe "ColorUtils" qui possèdes plusieurs méthodes de conversions en rapport avec les couleurs (utilisée par la classe HDRGlow).

Les deux exemples sont dans le dossier BIN.
Les sources sont dans le dossier SRC.

La classe HDRGlow est extrêmement commentée! Ainsi vous pourrez bien comprendre à quoi correspondent les paramètres des fonctions, comment elles fonctionnent, et éventuellement les modifier pour les plus curieux.

Conclusion :


Comment créer un effet HDR Glow? Rien de plus simple :

import stefbuetFX.HDRGlow;
var HDR:HDRGlow=new HDRGlow(monObjet);
addChild(HDR);

Vous pouvez appliquer le même effet glow sur l'objet lumineux automatiquement via la fonction static : setupTargetGlow();

De plus, vous pouvez accéder aux données bitmapdata de l'effet calculé directement en utilisant la méthode static drawHDR() sans avoir besoin d'instancier d'objet de la classe. (Détaillé dans les commentaires).

Note:
Niveau expert pour le code (comprendre comment il marche?)
mais moins que débutant pour l'utiliser!

Voila, en espérant que certains y trouverons un intérêt pratique!

Stef.

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
3
Date d'inscription
mercredi 10 mars 2004
Statut
Membre
Dernière intervention
29 septembre 2009

Très bel effet et très pratique. Cela dit, si j'applique une interpolation de mouvement sur l'objet cible du HDRGlow, j'obtiens une erreur :
TypeError: Error #1009: Il est impossible d'accéder à la propriété ou à la méthode d'une référence d'objet nul.
l'erreur porte sur var mat2:Matrix=context.getChildAt(i).transform.matrix;

pourtant, mon code as est simpliste :

import classes.stefbuetFX.HDRGlow;
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.filters.GlowFilter;
var HDR:HDRGlow=new HDRGlow(rect);
addChild(HDR);

Quelqu'un serait il en mesure de m'aider ?
Messages postés
30
Date d'inscription
samedi 10 mai 2008
Statut
Membre
Dernière intervention
25 février 2010

Après avoir regardé longuement les sources, je dois dire que c'est plutôt du beau travail, l'effet est bien sûr réussi, mais c'est plutôt le code qui m'a impressionné. En tout cas le résultat est concluent et la manière pour y arriver est franchement convaincante. Bien joué !!!
Messages postés
169
Date d'inscription
lundi 11 décembre 2006
Statut
Membre
Dernière intervention
25 janvier 2014
1
Super rendu ! Bonne source.
Messages postés
576
Date d'inscription
mercredi 5 janvier 2005
Statut
Membre
Dernière intervention
12 mai 2009

Salut,

Ouf, j'ai enfin réussi à trouver une solution pour palier aux problèmes de crénelage! J'ai aussi corrigé l'erreur dans la classe Exemple01 et changé la méthode d'affichage de l'effet. En effet simplement utiliser l'evenement MOUSE_MOVE au lieu de ENTER_FRAME n'aurait rien changé car l'objet HDRGlow s'update automatiquement via ENTER_FRAME. J'ai donc utilisé la fonction drawHDRGlow static sans utiliser le reste de la classe HDRGlow (technique détaillé dans la doc de la classe) et ainsi je n'appel cette fonction qui calcul l'effet uniquement lors des evenements MOUSE_MOVE et la il y a bcp moins de calculs effectués!

Stef.
Messages postés
6138
Date d'inscription
dimanche 21 décembre 2003
Statut
Modérateur
Dernière intervention
4 septembre 2013
11
Effet très sympa, mais juste quelques remarques/conseils :

- il y a des erreurs dans Exemple01.as : il faut changer "public function Exemple00()" par "public function Exemple01()" pour que ça foncitonne
- L'EnterFrame est trop "bouffe-source" et n'utilise pas les capacités réelle de la machine, le mieux est de le remplacer par un MOUSE_MOVE sur le stage et d'ajouter "e.updateAfterEvent()" à la fin de la fonction "update". Par contre, tu perds le calcul de frameRate ...
- Il est dommage de voir cet effet de crénelage moche sur les surfaces non planes vectorielles. J'ai testé avec un gif transparent (sans % d'alpha) et ça passe nickel, par contre il y a des erreurs d'approximations sur les png avec dégradés alpha.

Un premier jet très prometteur, mais quelques réglages fins à faire ...

Peg'

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.