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 :

Deferred Shading ne fonctionne pas sur Nvidia [OpenGL 4.x]


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 51
    Par défaut Deferred Shading ne fonctionne pas sur Nvidia
    Bonsoir,

    BUT:
    Je travail actuellement sur mon moteur 3D qui supporte à la fois du Forward Shading et du Deferred Shading.
    Problème:
    J'ai deux pc sur lesquels j'effectue des testes:
    -PC Portable avec un GPU Intel
    -PC "fix" avec une GPU Nvidia GTX770 (driver: 372.54)
    Le rendu en Forward Shading fonctionne sur les deux PC. Cependant le rendu en Deferred Shading ne fonctionne que sur le PC portable
    et OpenGL (glGetError()) ne me donne aucune erreur.
    La seul différence majeur entre ces deux techniques est l'utilisation des FBO donc je pense que le problème vient de là.


    Initialisation du GBuffer:
    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
    //Génération des buffers
    	glGenFramebuffers(1, &m_fbo);
    	glBindFramebuffer(GL_FRAMEBUFFER, m_fbo);
    	glFramebufferParameteri(GL_FRAMEBUFFER, GL_FRAMEBUFFER_DEFAULT_WIDTH, m_width);
    	glFramebufferParameteri(GL_FRAMEBUFFER, GL_FRAMEBUFFER_DEFAULT_HEIGHT, m_height);
    	glFramebufferParameteri(GL_FRAMEBUFFER, GL_FRAMEBUFFER_DEFAULT_SAMPLES, 0);
     
    	//Générer les textures et les binds avec leur buffers
    	//Diffuse
    	glGenTextures(1, &m_textureDiffuse);
    	glBindTexture(GL_TEXTURE_2D, m_textureDiffuse);
    	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, m_width, m_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
    	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    	glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_textureDiffuse, 0);
    	//Position
    	glGenTextures(1, &m_texturePosition);
    	glBindTexture(GL_TEXTURE_2D, m_texturePosition);
    	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, m_width, m_height, 0, GL_RGBA, GL_FLOAT, NULL);
    	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    	glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, m_texturePosition, 0);
    	//Normal
    	glGenTextures(1, &m_textureNormal);
    	glBindTexture(GL_TEXTURE_2D, m_textureNormal);
    	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16F, m_width, m_height, 0, GL_RGBA, GL_FLOAT, NULL);
    	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    	glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT2, GL_TEXTURE_2D, m_textureNormal, 0);
     
    	//Depth
    	glGenTextures(1, &m_depthtexture);
    	glBindTexture(GL_TEXTURE_2D, m_depthtexture);
    	glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, m_width, m_height, 0, GL_DEPTH_COMPONENT, GL_FLOAT, 0);
    	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    	glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, m_depthtexture, 0);
     
    	if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
    		throw new std::exception("ERROR: Can't initialize the GBuffer");
     
    	glBindFramebuffer(GL_FRAMEBUFFER, 0);
    Geometry Pass:
    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
    glBindFramebuffer(GL_FRAMEBUFFER, m_fbo);
    			glEnable(GL_TEXTURE_2D);
    			glEnable(GL_DEPTH_TEST);
    			glDepthFunc(GL_LESS);
     
    			glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    			glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
     
    			GLenum buffers[] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2 };
    			glDrawBuffers(3, buffers);
     
    			Mesh* mesh = m_staticmesh[i]->GetMesh();
    			glm::mat4 trans = m_staticmesh[i]->GetTransform();
     
    			glUniformMatrix4fv(glGetUniformLocation(DS_GeometryShader, "uModel"), 1, GL_FALSE, glm::value_ptr(trans));
    			glUniformMatrix4fv(glGetUniformLocation(DS_GeometryShader, "uView"), 1, GL_FALSE, glm::value_ptr(m_activecamera->ViewMatrix()));
    			glUniformMatrix4fv(glGetUniformLocation(DS_GeometryShader, "uProjection"), 1, GL_FALSE, glm::value_ptr(m_activecamera->ProjectionMatrix()));
     
    			Material* material = m_staticmesh[i]->GetMaterial();
     
    			//Use DiffuseMap or BaseColor
    			if (material->useDiffuse && material->diffuse != NULL)
    			{
    				glUniform1i(glGetUniformLocation(DS_GeometryShader, "uUseDiffuseMap"), true);
     
    				glActiveTexture(GL_TEXTURE0);
    				glBindTexture(GL_TEXTURE_2D, material->diffuse->GetID());
    				glUniform1i(glGetUniformLocation(DS_GeometryShader, "uDiffuseMap"), /*GL_TEXTURE*/ 0);
    			}
    			else
    			{
    				glUniform1i(glGetUniformLocation(DS_GeometryShader, "uUseDiffuseMap"), false);
    				glUniform4fv(glGetUniformLocation(DS_GeometryShader, "uBaseColor"), 1, glm::value_ptr(material->baseColor));
    			}
     
    			glBindVertexArray(mesh->GetVAO());
    			glDrawArrays(GL_TRIANGLES, 0, mesh->vertices.size());
    			glBindVertexArray(0);
    Shaders:
    Geometry.fragment:
    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
    #version 400 core
     
    layout(location = 0) out vec4 out_diffuse;
    layout(location = 1) out vec4 out_position;
    layout(location = 2) out vec4 out_normal;
     
    in vec4 fFragPos;
    in vec2 fUV;
    in vec3 fNormal;
     
    uniform bool uUseDiffuseMap;
    uniform vec4 uBaseColor;
     
    uniform sampler2D uDiffuseMap;
     
    void main()
    {
    	if(uUseDiffuseMap)
    	{
    		out_diffuse = texture(uDiffuseMap, fUV);
    	}
    	else
    	{
    		out_diffuse = uBaseColor;
    	}
     
    	out_position = fFragPos;
    	out_normal = vec4(fNormal.xyz, 1);
    }
    Je vous ai mis l'essentiel, si vous avez besoin de plus dites le moi
    Merci !

  2. #2
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 033
    Billets dans le blog
    12
    Par défaut
    Salut!

    As-tu pu vérifier que les différentes textures de la geometry pass sont écrites? (Avec des blits en lieu et place de la light pass, par exemple)
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 129
    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 129
    Billets dans le blog
    149
    Par défaut
    Bonjour,

    Faites-vous un appel à glGetError() à chaque appel OpenGL ? (je tiens à rappeler qu'il est préférable d'utiliser l'extension KHR_debug, maintenant).
    Avez-vous essayé gDEBugger pour mieux comprendre le problème ? (vérification des tampons).
    Quel est votre rendu sur les deux machines ?
    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.

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 51
    Par défaut
    Je viens de debugger le programme avec gDEBugger et les textures de la geometry pass sont noirs donc le problème vient bien de l'écriture des textures. D'ailleurs cet outil est vraiment génial !

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 51
    Par défaut
    J'ai repassé en vue tout mon code 3 fois et j'ai rien trouvé d'anormal ... Ce que je ne comprend pas c'est surtout le fait que cela fonctionne parfaitement sur un pc et pas sur l'autre !
    D'ailleurs j'ai testé le programme sur une carte AMD, même problème (black-screen) ... à croire que mon programme est conçu pour des processeur intel.
    Lorsque je vérifie les textures avec gDEBugger, elle sont toutes noirs. Et en changeant la couleur du glClear en rouge par exemple, les textures sont bien rouges donc c'est pas un problème de binding de texture au fbo.

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 129
    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 129
    Billets dans le blog
    149
    Par défaut
    Cela me semble être un binding qui n'est pas désactivé à la fin de son utilisation ?
    On peut faire du debogage des FBO avec glBlitFramebuffer
    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.

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 51
    Par défaut
    Je ne suis pas retourné sur ce post depuis longtemps, entre temps j'ai trouvé mon erreur. Le problème venait du fait que dans le vertex shader (de la geometry pass), je n'utilisais pas gl_Position. Une erreur simple mais importante . Cela fonctionnait sans chez Intel et c'est plutôt bizarre, je n'ai pas trouvé plus d'informations à propos.

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

Discussions similaires

  1. Requete qui ne fonctionne pas sur toutes les versions de MySQL
    Par goldorax113 dans le forum Requêtes
    Réponses: 2
    Dernier message: 06/06/2006, 11h04
  2. Réponses: 4
    Dernier message: 03/04/2006, 08h50
  3. Réponses: 7
    Dernier message: 10/02/2006, 18h00
  4. TXMLDocument, ne fonctionne pas sur tous les PC
    Par Neilos dans le forum C++Builder
    Réponses: 4
    Dernier message: 05/10/2005, 22h33
  5. Code qui ne fonctionne pas sur Mac
    Par malbaladejo dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 14/01/2005, 11h08

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