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 :

Comment faire du shadow mapping sans shader?


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Profil pro
    Responsable technique
    Inscrit en
    Février 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Responsable technique

    Informations forums :
    Inscription : Février 2006
    Messages : 366
    Par défaut Comment faire du shadow mapping sans shader?
    Salut,

    Le titre me semble assez explicite lol. En fait, j'ai une carte graphique intel Q965 qui ne supporte pas les shader et j'aimerais faire du shadow mapping. J'ai effectué un render to texture pour recupérer le depth buffer dans une texture. Mais ensuite, je n'arrive pas à transformer ma texture et à la plaquer sur le sol.

    Voici le code:

    Initialisation:
    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
     
    GLuint TextureId;
    format=GL_DEPTH_COMPONENT;
    texture_width=512;
    texture_height=512
     
    // create a texture object
        glGenTextures(1, &TextureId);
        glBindTexture(GL_TEXTURE_2D, TextureId);
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
        //glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
        //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
        //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
        glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE); // automatic mipmap generation included in OpenGL v1.4
        glTexImage2D(GL_TEXTURE_2D, 0, format, texture_width, texture_height, 0, format, GL_UNSIGNED_BYTE, 0);
        glBindTexture(GL_TEXTURE_2D, 0);
    Boucle de jeu:
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
    ViewportPositionX=0;
    ViewportPositionY=0;
    ViewportWidth=512;
    ViewportHeight=512;
    Fovy=60.0;
    Aspect=512/512;
    ZNear=1.0;
    ZFar=100.0;
    RealTextureWidth=512;
    RealTextureHeight=512;
     
    glViewport(ViewportPositionX, ViewportPositionY, ViewportWidth, ViewportHeight);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gluPerspective(Fovy, Aspect, ZNear, ZFar);
    	glClearColor(1, 1, 1, 1);
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glMatrixMode(GL_MODELVIEW);
    	glLoadIdentity();
     
    	gluLookAt(Light->GetPositionX(),Light->GetPositionY(),Light->GetPositionZ(),Light->GetTargetX(),Light->GetTargetY(),Light->GetTargetZ(),Light->GetUpVector().x,Light->GetUpVector().y,Light->GetUpVector().z);
     
        glPushAttrib(GL_COLOR_BUFFER_BIT | GL_PIXEL_MODE_BIT); // for GL_DRAW_BUFFER and GL_READ_BUFFER
        glDrawBuffer(GL_BACK);
        glReadBuffer(GL_BACK);
     
        DrawScene();
     
    glEnable(GL_TEXTURE_2D);
     
    	// copy the framebuffer pixels to a texture
        glBindTexture(GL_TEXTURE_2D, TextureId);
        glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, RealTextureWidth, RealTextureHeight);
        glBindTexture(GL_TEXTURE_2D, 0);
    	glDisable(GL_TEXTURE_2D);
     
    	glPopAttrib();
     
    	// back to normal viewport and projection matrix
    	glViewport(0, 0, GSEApplication->GetSizeX(), GSEApplication->GetSizeY());
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
    	gluPerspective(GSEApplication->GetVerticalAngle(), (float)(GSEApplication->GetSizeX())/GSEApplication->GetSizeY(), GSEApplication->GetDepthMinimumView(), GSEApplication->GetDepthMaximumView());
     
    	glMatrixMode(GL_MODELVIEW);
    	glLoadIdentity();
     
        // clear framebuffer
        glClearColor(0, 0, 0, 0);
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
     
    	gluLookAt(GSECamera->GetPositionX(),GSECamera->GetPositionY(),GSECamera->GetPositionZ(),GSECamera->GetTargetX(),GSECamera->GetTargetY(),GSECamera->GetTargetZ(),GSECamera->GetUpVector().x,GSECamera->GetUpVector().y,GSECamera->GetUpVector().z);
     
    DrawScene();
    Voila ce que j'obtient (Le quad blanc represente ma texture de profondeur):


    J'ai déjà fait plein de recherche pour des tutoriaux et des codes sur google. J'ai tenté d'adapter les codes sans succès.

    Donc j'aimerais savoir comment puis je plaquer ma texture sans shader?

    Merci

  2. #2
    Rédacteur
    Avatar de bafman
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    2 574
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Par défaut
    tu a tout ce qu'il fait ici :
    http://www.paulsprojects.net/tutorials/smt/smt.html
    en gros, si tu ne passe pas par un shader, tu doit mettre ta depth texture en mode projective avec la matrice de la lumière, et activer les paramètres de comparaison via une extension.
    * Il est infiniment plus simple de faire rapidement un code qui marche que de faire un code rapide qui marche
    * pour faciliter les recherches, n'oubliez pas de voter pour les réponses pertinentes
    Mes articles

  3. #3
    Membre très actif
    Profil pro
    Responsable technique
    Inscrit en
    Février 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Responsable technique

    Informations forums :
    Inscription : Février 2006
    Messages : 366
    Par défaut
    Citation Envoyé par bafman Voir le message
    tu a tout ce qu'il fait ici :
    http://www.paulsprojects.net/tutorials/smt/smt.html
    en gros, si tu ne passe pas par un shader, tu doit mettre ta depth texture en mode projective avec la matrice de la lumière, et activer les paramètres de comparaison via une extension.
    J'ai deja testé ce tuto. Mais non seulement la fin du code ne fonctionne pas bien mais en plus je ne comprends pas bien ce qui est fait à la fin du code. Je comprends ce que le bloc de ligne fait mais pas ce que chaque ligne fait.

    La partie que je ne comprends pas est celle là:

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
    static MATRIX4X4 biasMatrix(0.5f, 0.0f, 0.0f, 0.0f,
    								0.0f, 0.5f, 0.0f, 0.0f,
    								0.0f, 0.0f, 0.5f, 0.0f,
    								0.5f, 0.5f, 0.5f, 1.0f);	//bias from [-1, 1] to [0, 1]
    	MATRIX4X4 textureMatrix=biasMatrix*lightProjectionMatrix*lightViewMatrix;
     
    	//Set up texture coordinate generation.
    	glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
    	glTexGenfv(GL_S, GL_EYE_PLANE, textureMatrix.GetRow(0));
    	glEnable(GL_TEXTURE_GEN_S);
     
    	glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
    	glTexGenfv(GL_T, GL_EYE_PLANE, textureMatrix.GetRow(1));
    	glEnable(GL_TEXTURE_GEN_T);
     
    	glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
    	glTexGenfv(GL_R, GL_EYE_PLANE, textureMatrix.GetRow(2));
    	glEnable(GL_TEXTURE_GEN_R);
     
    	glTexGeni(GL_Q, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
    	glTexGenfv(GL_Q, GL_EYE_PLANE, textureMatrix.GetRow(3));
    	glEnable(GL_TEXTURE_GEN_Q);
     
    	//Bind & enable shadow map texture
    	glBindTexture(GL_TEXTURE_2D, shadowMapTexture);
    	glEnable(GL_TEXTURE_2D);
     
    	//Enable shadow comparison
    	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE_ARB, GL_COMPARE_R_TO_TEXTURE);
     
    	//Shadow comparison should be true (ie not in shadow) if r<=texture
    	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC_ARB, GL_LEQUAL);
     
    	//Shadow comparison should generate an INTENSITY result
    	glTexParameteri(GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE_ARB, GL_INTENSITY);
     
    	//Set alpha test to discard false comparisons
    	glAlphaFunc(GL_GEQUAL, 0.99f);
    	glEnable(GL_ALPHA_TEST);
     
    	DrawScene(angle);
     
    	//Disable textures and texgen
    	glDisable(GL_TEXTURE_2D);
     
    	glDisable(GL_TEXTURE_GEN_S);
    	glDisable(GL_TEXTURE_GEN_T);
    	glDisable(GL_TEXTURE_GEN_R);
    	glDisable(GL_TEXTURE_GEN_Q);
     
    	//Restore other states
    	glDisable(GL_LIGHTING);
    	glDisable(GL_ALPHA_TEST);

  4. #4
    Membre Expert
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 579
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 579
    Par défaut
    notes que ta texture de profondeur doit être générée depuis le point de vue de la lumière (tu positionne ta caméra à la position de la source lumineuse qui génère l'ombre)

    ce qui ne semble pas être le cas sur ta capture, à moins que ce soit par hasard ou par défaut que ta lumière est à la même position que ta caméra ?
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  5. #5
    Membre très actif
    Profil pro
    Responsable technique
    Inscrit en
    Février 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Responsable technique

    Informations forums :
    Inscription : Février 2006
    Messages : 366
    Par défaut
    Citation Envoyé par shenron666 Voir le message
    notes que ta texture de profondeur doit être générée depuis le point de vue de la lumière (tu positionne ta caméra à la position de la source lumineuse qui génère l'ombre)

    ce qui ne semble pas être le cas sur ta capture, à moins que ce soit par hasard ou par défaut que ta lumière est à la même position que ta caméra ?
    C'est par défaut. J'ai supposé que ma lumière était attaché à ma caméra. C'est juste par flemme de me trimbaler les 4 matrices nécessaires. En supposant ca je réduit à 2 et je valide l'implémentation.

    Est ce un cas particulier ou l'algo doit tout de meme fonctionner si la position de la lumiere = la position de la camera?

  6. #6
    Membre très actif
    Profil pro
    Responsable technique
    Inscrit en
    Février 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Responsable technique

    Informations forums :
    Inscription : Février 2006
    Messages : 366
    Par défaut
    Pour info, voila ce que j'ai quand j'intègre le code du tutorial de paul project (le modèle est animé):



    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
    static GSEMATRIX4X4 biasMatrix(0.5, 0.0f, 0.0f, 0.0f,
    								0.0f, 0.5, 0.0f, 0.0f,
    								0.0f, 0.0f, 0.5, 0.0f,
    								0.5, 0.5, 0.5, 1.0f);
     
    	GSEMATRIX4X4 textureMatrix=biasMatrix*cameraProjectionMatrix*cameraViewMatrix;
     
    	//Set up texture coordinate generation.
    	glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
    	glTexGenfv(GL_S, GL_EYE_PLANE, textureMatrix.GetRow(0));
    	glEnable(GL_TEXTURE_GEN_S);
     
    	glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
    	glTexGenfv(GL_T, GL_EYE_PLANE, textureMatrix.GetRow(1));
    	glEnable(GL_TEXTURE_GEN_T);
     
    	glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
    	glTexGenfv(GL_R, GL_EYE_PLANE, textureMatrix.GetRow(2));
    	glEnable(GL_TEXTURE_GEN_R);
     
    	glTexGeni(GL_Q, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
    	glTexGenfv(GL_Q, GL_EYE_PLANE, textureMatrix.GetRow(3));
    	glEnable(GL_TEXTURE_GEN_Q);
     
    	//Bind & enable shadow map texture
    	glBindTexture(GL_TEXTURE_2D, TextureRenderer->GetTextureId());
    	glEnable(GL_TEXTURE_2D);
     
    	//Enable shadow comparison
    	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE_ARB, GL_COMPARE_R_TO_TEXTURE);
     
    	//Shadow comparison should be true (ie not in shadow) if r<=texture
    	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC_ARB, GL_LEQUAL);
     
    	//Shadow comparison should generate an INTENSITY result
    	glTexParameteri(GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE_ARB, GL_INTENSITY);
     
    	//Set alpha test to discard false comparisons
    	glAlphaFunc(GL_GEQUAL, 0.99);
    	glEnable(GL_ALPHA_TEST);
     
    	DrawScene();
     
    	//Disable textures and texgen
    	glDisable(GL_TEXTURE_2D);
     
    	glDisable(GL_TEXTURE_GEN_S);
    	glDisable(GL_TEXTURE_GEN_T);
    	glDisable(GL_TEXTURE_GEN_R);
    	glDisable(GL_TEXTURE_GEN_Q);
     
    	//Restore other states
    	glDisable(GL_ALPHA_TEST);

  7. #7
    Membre Expert
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 579
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 579
    Par défaut
    Citation Envoyé par drcd Voir le message
    C'est par défaut. J'ai supposé que ma lumière était attaché à ma caméra. C'est juste par flemme de me trimbaler les 4 matrices nécessaires. En supposant ca je réduit à 2 et je valide l'implémentation.

    Est ce un cas particulier ou l'algo doit tout de meme fonctionner si la position de la lumiere = la position de la camera?
    si tu places toujours ta lumière à la même position que la caméra, tu ne verras jamais l'ombre puisqu'elle sera toujours projetée derrière le modèle
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  8. #8
    Membre très actif
    Profil pro
    Responsable technique
    Inscrit en
    Février 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Responsable technique

    Informations forums :
    Inscription : Février 2006
    Messages : 366
    Par défaut
    Citation Envoyé par shenron666 Voir le message
    si tu places toujours ta lumière à la même position que la caméra, tu ne verras jamais l'ombre puisqu'elle sera toujours projetée derrière le modèle
    Cette fois la lumiere est à une position fixe (3.0,3.0,3.0) et ca ne change rien:


+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 01/05/2008, 16h13
  2. Réponses: 4
    Dernier message: 26/04/2007, 08h41
  3. comment faire un group by sans erreur
    Par phpaide dans le forum Langage SQL
    Réponses: 7
    Dernier message: 21/04/2006, 09h11
  4. Réponses: 19
    Dernier message: 28/01/2005, 09h52
  5. Comment faire du bump mapping
    Par CladStrife dans le forum DirectX
    Réponses: 7
    Dernier message: 01/01/2004, 05h07

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