Créer de fausses couleurs.

Comment créer des couleurs artificielles en trompant l'oeil.

Dithering

Voir version :

Pas de dépendances

Télécharger :

#include <sdl/sdl.h>

#ifdef WIN32
#pragma comment(lib,"sdl.lib")
#pragma comment(lib,"sdlmain.lib")
#endif

void waitkey()            // attend qu'on appuie sur ESC
{
    SDL_Event event;
    while(1)            // boucle
    {
        while(SDL_PollEvent(&event))        // aquisition d'evenement
        {
            if (event.type == SDL_KEYDOWN)  // on appuie sur une touche ?
            {
                if (event.key.keysym.sym == SDLK_ESCAPE) return;  // c'est "ESC" ?
            }
        }
        SDL_Delay(1);
    }
}

void SDL_PutPixel32(SDL_Surface *surface, int x, int y, Uint32 pixel)
{
    Uint8 *p = (Uint8*)surface->pixels + y * surface->pitch + x * 4;
    *(Uint32*)p = pixel;
}

void Dithering(SDL_Surface *surface, int x, int y)
{
    unsigned long couleur1 = 0xFF0000;
    unsigned long couleur2 = 0xFFFFFF;
    int i,j;
    for(j=0;j<200;j++)
        for(i=0;i<x;i++)
        {
            SDL_PutPixel32(surface,i,j,couleur1);
        }
    for(j=200;j<400;j++)
        for(i=0;i<x;i++)
        {
            if ((i+j)%2)
                SDL_PutPixel32(surface,i,j,couleur1);
            else
                SDL_PutPixel32(surface,i,j,couleur2);
        }
    for(j=400;j<y;j++)
        for(i=0;i<x;i++)
        {
            SDL_PutPixel32(surface,i,j,couleur2);
        }
}

int main(int argc,char** argv)
{
    SDL_Surface* screen;
    SDL_Init(SDL_INIT_VIDEO);
    screen=SDL_SetVideoMode(800,600,32,SDL_SWSURFACE|SDL_DOUBLEBUF);  
    if (SDL_MUSTLOCK(screen))
        SDL_LockSurface(screen);
    Dithering(screen,800,600);
    if (SDL_MUSTLOCK(screen))
        SDL_UnlockSurface(screen);        
    SDL_Flip(screen);
    waitkey();
    return 0;
}



Commentaires


  Ce petit exemple montre ce qu'est le dithering.
  Avant d'aller plus loin, sachez que cette technique n'est quasiment plus utilisée dans le rendu.

  Bon, lancez le programme, combien voyez vous de couleurs a l'écran (en comptant le blanc) ?

  Si vous dites "3 : un blanc, un rouge et un rose" alors c'est que vous vous etes fait avoir par le dithering.

  En effet : il N'Y A PAS DE ROSE. vérifiez le code, il n'y a que 2 couleurs : le rouge et le blanc.

  Si vous regardez de très pres la zone rose, vous voyez qu'en fait, ce sont des pixels rouges et blancs alternés.
  Du fait, l'oeil croit voir du rose.


Dégradé en dithering
--------------------

  Ici, j'ai simulé un rose médian entre le rouge et le blanc : tout simplement parce que dans mon rectangle de dithering, 
  il y a autant de pixels blancs que de pixels noirs.
  Mais si je voulais, je pourrais faire un rectangle avec plus de pixels rouge que de blanc.
  Ainsi, je pourrais simuler un dégradé du rouge vers le blanc, avec plein de nuances de rose...

  Je peux simuler un dégradé de n'importe quel couleur vers n'importe quelle couleur avec la meme technique
  (changez donc les lignes définissant couleur1 et couleur2 dans le programme)

Pourquoi on utilise le dithering pour le rendu
----------------------------------------------

  Quelques années en arriere, on avait peu de mémoire, on ne pouvait pas se premettre de mettre 24 ou 32 bits par pixels.
  On avait peu de couleurs affichables, 256, voir 16, voir 4.
  Le dithering était alors utilisé pour simuler des couleurs supplémentaires sans prendre davantage de mémoire.

Pourquoi on ne l'utilise plus trop
----------------------------------

  Maintenant, on a beaucoup de mémoire, et la plupart des jeux, ou applications, fonctionnent en profondeur de couleur 24 ou 32 bits
  De ce fait, on parle de "couleurs vraies" : le dithering n'est plus nécessaire, car avec 24 bits, on peut largement couvrir toutes les
  nuances de couleur que l'oeil peut observer via un écran. On ne pourra pas créer de couleurs suplémentaires avec le dithering.

Utilisation du dithering
------------------------

  On peut utiliser le dithering pour avoir une image plus compacte en mémoire (comme auparavant)
  Les imprimantes utilisent également ça :
  Quand on imprime une image en noir et blanc, avec des nuances de gris, en réalité, l'imprimante ne sait qu'envoyer de l'encre noire.
  Il suffit donc de faire un "effet de dithering" en faisant alterner les points d'encre avec des "trous" qui laissent le blanc de la feuille apparaitre :
  On simule ainsi des nuances de gris.