IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

OpenGL Discussion :

[OpenGL] Blur Gaussian Shader


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 16
    Par défaut [OpenGL] Blur Gaussian Shader
    Bonjour à tous,
    J'ai une application C++ utilisant la librairie OpenGL qui affiche notamment à l'écran un ensemble de cercle blanc.
    Je souhaite maintenant utiliser un shader GLSL me permettant de floutter l'ensemble des cercles.
    J'utilise pour cela le Shader suivant (Horitontal Blur) (je ne l'ai pas inventé!)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    //VERTEX
    varying vec2 vTexCoord;
     
    // remember that you should draw a screen aligned quad
    void main(void)
    {
       gl_Position = ftransform();
     
       // Clean up inaccuracies
       vec2 Pos;
       Pos = sign(gl_Vertex.xy);
     
       gl_Position = vec4(Pos, 0.0, 1.0);
       // Image-space
       vTexCoord = Pos * 0.5 + 0.5;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    //FRAGMENT
    uniform sampler2D RTScene; // the texture with the scene you want to blur
    varying vec2 vTexCoord;
     
    const float blurSize = 1.0/512.0; // I've chosen this size because this will result in that every step will be one pixel wide if the RTScene texture is of size 512x512
     
    void main(void)
    {
       vec4 sum = vec4(0.0);
     
       // blur in y (vertical)
       // take nine samples, with the distance blurSize between them
       sum += texture2D(RTScene, vec2(vTexCoord.x - 4.0*blurSize, vTexCoord.y)) * 0.05;
       sum += texture2D(RTScene, vec2(vTexCoord.x - 3.0*blurSize, vTexCoord.y)) * 0.09;
       sum += texture2D(RTScene, vec2(vTexCoord.x - 2.0*blurSize, vTexCoord.y)) * 0.12;
       sum += texture2D(RTScene, vec2(vTexCoord.x - blurSize, vTexCoord.y)) * 0.15;
       sum += texture2D(RTScene, vec2(vTexCoord.x, vTexCoord.y)) * 0.16;
       sum += texture2D(RTScene, vec2(vTexCoord.x + blurSize, vTexCoord.y)) * 0.15;
       sum += texture2D(RTScene, vec2(vTexCoord.x + 2.0*blurSize, vTexCoord.y)) * 0.12;
       sum += texture2D(RTScene, vec2(vTexCoord.x + 3.0*blurSize, vTexCoord.y)) * 0.09;
       sum += texture2D(RTScene, vec2(vTexCoord.x + 4.0*blurSize, vTexCoord.y)) * 0.05;
     
       gl_FragColor = sum;
    }
    Pour le moment j'ai un écran noir ...

    J'arrive à loader et linker correctement ce shader mais mes connaissances étant vraiment limitées je n'arrive pas à comprendre:

    1/ Comment et à quoi binder l'attribut "uniform sampler2D RTScene" dans mon programme?
    2/ A quel moment le faire?
    3/ Dans mon idée je pensais que l'ensemble des pixels étaient dans un buffer et je voulais appliquer le shader à l'ensemble de ce buffer, est-ce que c'est la bonne façon de faire?

    Merci d'avance pour tous vos éclaircissements ...
    ++
    Greg

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 158
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 158
    Billets dans le blog
    152
    Par défaut
    Bonjour,

    Pour que le flou fonctionne, il faut d'abord faire un rendu vers une texture (en utilisant un FBO), puis afficher la texture telle un quad sur tout l'écran. Ainsi, le fragment shader sera exécuté sur tout les pixels de la texture (donc de l'image des cercles) et le blur sera effectif.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    uniform sampler2D RTScene;
    Vous passerer l'ID de la texture à cette uniform.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

Discussions similaires

  1. Blur pixel shader
    Par saturn1 dans le forum Unity
    Réponses: 5
    Dernier message: 18/11/2013, 17h02
  2. OpenGL VBO et shaders : rien ne s'affiche
    Par laurencew dans le forum OpenGL
    Réponses: 7
    Dernier message: 15/05/2011, 22h27
  3. [Débutant inside] OpenGL et les shaders
    Par bloomenthal dans le forum OpenGL
    Réponses: 11
    Dernier message: 02/06/2010, 18h06
  4. OpenGL/C++/Shader ne fonctionnant pas
    Par Guildem dans le forum OpenGL
    Réponses: 13
    Dernier message: 06/10/2005, 09h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo