Keep calm and carry on.

Eclairage 2D avec GLSL

Le 18 novembre 2012 dans code, glsl et dans gamedev

Pour un nouveau projet sur lequel je viens de commencer à travailler, j'avais besoin d'implémenter un système robuste d'éclairage 2D. J'ai aujourd'hui terminé l'éclairage par une lumière ponctuelle.

Le système se base sur 4 images : la carte diffuse (la couleur), le carte de gloss (la "brillance" ou réflexivité du matériau), la carte d'émission (la quantité de lumière émise par chaque pixel), et une carte de normales.

Ci-dessous, un exemple avec ces 4 cartes dans l'ordre puis un exemple de rendu.

lumière

Et maintenant un exemple en vidéo. Les deux briques lumineuses sont issues de la carte d'émission. (Avec Maxo qui parle derrière).

Je ne donne pas le code source, c'est secret. :3

Convertisseur EGA

Le 11 avril 2012 dans code et dans java

Bonjour,

Aujourd'hui j'ai écrit en Java un utilitaire inutile qui convertit une image au format de couleurs EGA. Voilà un exemple : l'image de base :

ega original

Une fois passé dans le convertisseur :

ega converted

Très moche hein ? Heureusement, j'ai implémenté le tramage de Floyd-Steinberg :

ega dither

Vous pouvez trouver le code source sur GitHub. Voilà la lien de téléchargement : EGAConverter.jar.

Utilisation :

java -jar EGAConverter.jar input_file.ext output_file.png [raw|dither]

-Steven

Fragment shaders

Le 25 mars 2012 dans code, glsl et dans gamedev

Bonjour,

Hier j'ai joué un peu avec les fragment shaders en GLSL.

Tout d'abord, j'ai utilisé le module PostFX de la SFML. Mais ce module utilise une version simplifiée de GLSL et qui limite les possibilités des shaders. (Par exemple, impossible de définir des fonctions hors du bloc effect correspondant au main.)

Voilà l'exemple d'un shader qui ne fait rien d'intéressant en PostFX et en GLSL :

PostFX :

texture framebuffer

effect
{
    _out = framebuffer(_in);
}

GLSL :

uniform sampler2D framebuffer;

void main(void)
{
    gl_FragColor = texture2D(framebuffer, gl_TexCoord[0].xy);
}

Donc j'ai du recoder toute la classe PostFX de SFML pour fonctionner avec les shaders GLSL. En fait je me suis contenté d'adapter la classe existante, ce qui rend le code plutôt dégueulasse. Je ne le donne pas car c'est un simple chargement de shader/création d'un program. Le particularité est que le shader est appliqué à un grand rectangle qui prend tout l'écran. Une copie de l'écran est envoyée au shader via framebuffer.

J'ai codé 4 shaders : un effet vintage, un infrarouge, un bloom (qui reste à améliorer) et un effet de distortion pour simuler de l'eau par exemple.

Voici une vidéo de démonstration puis le code source des shaders :

-Steven

Problem, calculator ?

Le 11 mars 2012 dans maths

Aujourd'hui, j'ai voulu calculer le 5ème nombre de Fermat.

Avec Maple :

2^2^5 + 1 = 4294967297

Avec ma TI-82 :

2^2^5 + 1 = 1025

TI

Minesweeper

Le 20 février 2012 dans code, java et dans projet

Salut,

J'ai pas mal bossé ces derniers temps sur un projet que j'avais en pose depuis longtemps : un démineur. Rien de très fantastique mais tout est expliqué sur la page du projet.

Amusez-vous bien.

-Steven

Nouvelle série : Minecraft Orasia

Le 28 janvier 2012 dans minecraft et dans orasia

Bonjour,

Je commence aujourd'hui une nouvelle série sur le serveur Minecraft Orasia.

J'espère qu'elle vous plaira.

Voir la page de la série.

-Steven

Primalité relative

Le 08 janvier 2012 dans maths et dans code

Bonjour,

Le week-end dernier, mon prof de maths m'a envoyé un mail où il me proposait une méthode pour exploiter la primalité relatives d'entiers, après avoir vu ma vieille image des entiers premiers entre eux qui date de quelques années maintenant.

La primalité relative donne un sens à "très premiers entre eux" et à "peu premiers entre eux". On compare la somme des exposants dans la décomposition en facteurs premiers du pgcd des deux entiers avec la somme des sommes des exposants dans la décomposition en facteurs premiers de chaque entiers :

Pour x entier >0 :
taille(x) = somme des exposants dans la décomposition de x en facteurs premiers.

Pour a,b entiers >1 :
mesure_de_primalite_relative(a,b) = 2*taille(PGCD(a,b))/(taille(a)+taille(b))
(c'est un rationnel entre 0 et 1)

J'ai décidé d'implémenter ça en Python, parce que ça faisait longtemps que je n'en avait pas fait. (C'est une bonne raison hein ?) J'aurai pu utiliser une librairie d'arithmétique comme GMP mais je n'en connaissais pas pour Python et je trouvais ça plus marrant de tout faire from scratch.

Voici donc le code source. Il se décompose en plusieurs fichiers :

Quand je dis "dépend de", je veux dire qu'il est par exemple nécessaire de déterminer les premiers de 1 à 10000 pour utiliser factors.py.

Il y a deux paramètres modifiables dans main.py :

On aura : plus foncé = plus premiers entre eux, plus clair = moins premiers entre eux.

Voici le résultat pour N = 2, S = 2048 :

rel_prim_2-2048
(Cliquer pour agrandir)

Il faudrait ouvrir l'image dans un éditeur afin de pouvoir zoomer sans interpolation.

D'un point de vue performances, la détermination des entiers premiers a pris ici 3 ms et les calculs de primalité relative 46 s avec un processeur Intel Core i3 à 2.40 Ghz.

Comme pour la fois précédente, je ne pense pas que l'on puisse en tirer grand chose, je vous laisse tout de même explorer.

J'ai alors déterminé l'histogramme de l'image.

rel_prim-hist

La moyenne de primalité relative est donc d'environ 0.42. Encore une fois, ça n'a pas grand intérêt.

C'était fun à coder en tout cas.

-Steven

 1