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 :

Les VAOs (plus de précisions)


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de robinsondesbois
    Homme Profil pro
    Etudiant
    Inscrit en
    Avril 2012
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Haute Loire (Auvergne)

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

    Informations forums :
    Inscription : Avril 2012
    Messages : 171
    Par défaut Les VAOs (plus de précisions)
    Bonjour,

    J'ai suivis le tuto relatif à OpenGL 4 sur ce site mais il manque la couleur.
    Je suis donc aller sur le tuto original : http://www.swiftless.com/tutorials/o...vao-color.html

    Mais ça ne marche pas
    Impossible d'afficher la couleur.

    A mon avis le problème viens de la
    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
    glGenVertexArrays(1, &_vaoId[0]);	//create vao
    glBindVertexArray(_vaoId[0]);		//link vao
     
    glGenBuffers(2, _vboId);			//create vbo
     
    glBindBuffer(GL_ARRAY_BUFFER, _vboId[0]);	//link vbo0
    glBufferData(GL_ARRAY_BUFFER, 18 * sizeof(GLfloat), vertices, GL_STATIC_DRAW);
    glVertexAttribPointer((GLuint)0, 3, GL_FLOAT, GL_FALSE, 0, 0);
    glEnableVertexAttribArray(0);
     
    glBindBuffer(GL_ARRAY_BUFFER, _vboId[1]);	//link vbo1
    glBufferData(GL_ARRAY_BUFFER, 18 * sizeof(GLfloat), colors, GL_STATIC_DRAW);
    glVertexAttribPointer((GLuint)1, 3, GL_FLOAT, GL_FALSE, 0, 0);
    glEnableVertexAttribArray(1);
     
    glBindVertexArray(0);

    Mais au cas ou je vous donne le code correspondant.

    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
    void OpenGLContext::createSquare()
    {
    	float *vertices = new float[18];
    	float *colors = new float[18];
     
    	vertices[0] = -0.5;		vertices[1] = -0.5;		vertices[2] = 0.0;	//down left
    	colors[0] = 1.0;		colors[1] = 0.0;		colors[2] = 0.0;
    	vertices[3] = -0.5;		vertices[4] = 0.5;		vertices[5] = 0.0;	//up left
    	colors[3] = 1.0;		colors[4] = 0.0;		colors[5] = 0.0;
    	vertices[6] = 0.5;		vertices[7] = 0.5;		vertices[8] = 0.0;	//up right
    	colors[6] = 1.0;		colors[7] = 0.0;		colors[8] = 0.0;
    	vertices[9] = 0.5;		vertices[10] = -0.5;	vertices[11] = 0.0;	//down right
    	colors[9] = 0.0;		colors[10] = 0.0;		colors[11] = 1.0;
    	vertices[12] = -0.5;	vertices[13] = -0.5;	vertices[14] = 0.0;	//down left
    	colors[12] = 0.0;		colors[13] = 0.0;		colors[14] = 1.0;
    	vertices[15] = 0.5;		vertices[16] = 0.5;		vertices[17] = 0.0;	//up right
    	colors[15] = 0.0;		colors[16] = 0.0;		colors[17] = 1.0;
     
    	glGenVertexArrays(1, &_vaoId[0]);	//create vao
    	glBindVertexArray(_vaoId[0]);		//link vao
     
    	glGenBuffers(2, _vboId);			//create vbo
     
    	glBindBuffer(GL_ARRAY_BUFFER, _vboId[0]);	//link vbo0
    	glBufferData(GL_ARRAY_BUFFER, 18 * sizeof(GLfloat), vertices, GL_STATIC_DRAW);
    	glVertexAttribPointer((GLuint)0, 3, GL_FLOAT, GL_FALSE, 0, 0);
    	glEnableVertexAttribArray(0);
     
    	glBindBuffer(GL_ARRAY_BUFFER, _vboId[1]);	//link vbo1
    	glBufferData(GL_ARRAY_BUFFER, 18 * sizeof(GLfloat), colors, GL_STATIC_DRAW);
    	glVertexAttribPointer((GLuint)1, 3, GL_FLOAT, GL_FALSE, 0, 0);
    	glEnableVertexAttribArray(1);
     
    	glBindVertexArray(0);
     
    	delete[] colors;
    	delete[] vertices;
    }
    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
    void OpenGLContext::renderScene(void)
    {
    	glViewport(0, 0, _width, _height);
    	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
     
    	_viewMatrix = glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.0f, -5.0f));
    	_modelMatrix = glm::scale(glm::mat4(1.0f), glm::vec3(0.5f));
     
    	_shader->bind();
     
    	//on lies les matrices au shader
    	int projectionMatrixLocation = glGetUniformLocation(_shader->id(), "projectionMatrix");
    	int viewMatrixLocation = glGetUniformLocation(_shader->id(), "viewMatrix");
    	int modelMatrixLocation = glGetUniformLocation(_shader->id(), "modelMatrix");
    	glUniformMatrix4fv(projectionMatrixLocation, 1, GL_FALSE, &_projectionMatrix[0][0]);
    	glUniformMatrix4fv(viewMatrixLocation, 1, GL_FALSE, &_viewMatrix[0][0]);
    	glUniformMatrix4fv(modelMatrixLocation, 1, GL_FALSE, &_modelMatrix[0][0]);
     
    	glBindVertexArray(_vaoId[0]);
    	glDrawArrays(GL_TRIANGLES, 0, 6);
    	glBindVertexArray(0);
     
    	_shader->unbind();
     
    	SwapBuffers(_hdc);
    }
    Shader Vertex
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #version 150 core
    in vec3 in_Position;
    in vec3 in_Color;
    out vec3 pass_Color;
     
    uniform mat4 projectionMatrix;
    uniform mat4 viewMatrix;
    uniform mat4 modelMatrix;
     
    void main()
    {
    	gl_position = projectionMatrix * viewMatrix * modelMatrix * vec4(in_position, 1.0);
    	pass_Color = in_Color;
    }
    Shader Fragment
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #version 150 core
    in vec3 pass_Color;
    out vec4 out_Color;
     
    void main()
    {
    	out_Color = vec4(pass_Color, 1.0);
    }
    Init Shader
    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
    void Shader::init(const char *vsFile, const char *fsFile)
    {
    	if (inited)
    		return;
    	inited = true;
     
    	_shaderFp = glCreateShader(GL_FRAGMENT_SHADER);
    	_shaderVp = glCreateShader(GL_VERTEX_SHADER);
     
    	const char *vsText = textFileRead(vsFile);
    	const char *fsText = textFileRead(fsFile);
    	if (vsText == NULL || fsText == NULL)
    	{
    		std::cout<< "ERROR file is not alive !!!";
    		return;
    	}
     
    	glShaderSource(_shaderVp, 1, &vsText, 0);
    	glShaderSource(_shaderFp, 1, &fsText, 0);
     
    	glCompileShader(_shaderVp);
    	glCompileShader(_shaderFp);
     
    	_shaderId = glCreateProgram();
    	glAttachShader(_shaderId, _shaderFp);
    	glAttachShader(_shaderId, _shaderVp);
     
    	glBindAttribLocation(_shaderId, 0, "in_Position");
    	glBindAttribLocation(_shaderId, 1, "in_Color");
     
    	glLinkProgram(_shaderId);
    }

  2. #2
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 035
    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 035
    Billets dans le blog
    12
    Par défaut
    Je suppose que les valeurs en dur que tu passes à glEnableVertexAttribArray et glVertexAttribPointer sont correctes ? Moi je préfère tout d'abord la récupérer via glGetAttribLocation().

    Ensuite, j'initialise d'abord mes VBO puis je prépare mon VAO :
    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
    glGenBuffers(2, _vboId);			//create vbo
    glBindBuffer(GL_ARRAY_BUFFER, _vboId[0]);	//link vbo0
    glBufferData(GL_ARRAY_BUFFER, 18 * sizeof(GLfloat), vertices, GL_STATIC_DRAW);
    glBindBuffer(GL_ARRAY_BUFFER, _vboId[1]);	//link vbo1
    glBufferData(GL_ARRAY_BUFFER, 18 * sizeof(GLfloat), colors, GL_STATIC_DRAW);
    glBindBuffer(GL_ARRAY_BUFFER, 0);	//unlink
     
    glGenVertexArrays(1, &_vaoId[0]);	//create vao
    glBindVertexArray(_vaoId[0]);		//link vao
     
    glBindBuffer(GL_ARRAY_BUFFER, _vboId[0]);	//link vbo0
    glEnableVertexAttribArray(0);
    glVertexAttribPointer((GLuint)0, 3, GL_FLOAT, GL_FALSE, 0, 0);
     
    glBindBuffer(GL_ARRAY_BUFFER, _vboId[1]);	//link vbo1
    glEnableVertexAttribArray(1);
    glVertexAttribPointer((GLuint)1, 3, GL_FLOAT, GL_FALSE, 0, 0);
     
    glBindVertexArray(0);		//link vao
    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
    Membre confirmé Avatar de robinsondesbois
    Homme Profil pro
    Etudiant
    Inscrit en
    Avril 2012
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Haute Loire (Auvergne)

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

    Informations forums :
    Inscription : Avril 2012
    Messages : 171
    Par défaut
    Bonjour,

    Cela ne marche toujours pas.
    Ce qui je ne comprend pas c'est comment le shader sait que c'est une couleur ou un polynôme (on ne lui passe qu'un tableau de point O_o).
    Je pense qu'il dessine deux choses, le carré et le polynôme formé par le tableau de couleur.

  4. #4
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 035
    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 035
    Billets dans le blog
    12
    Par défaut
    Euh ... Dans ton shader tu dois avoir quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    in vec3 vertex;//Correspondrait à ton 0 dans glVertexAttribPointer
    in vec3 colour;//Correspondrait à ton 1 dans glVertexAttribPointer
    ou comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    attribute vec3 vertex;//Correspondrait à ton 0 dans glVertexAttribPointer
    attribute vec3 colour;//Correspondrait à ton 1 dans glVertexAttribPointer
    Comme tu n'es pas assuré que vertex aie comme index 0 et que colours aie 1, je te recommande chaudement de récupérer cet index via glGetAttribLocation.
    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).

  5. #5
    Membre confirmé Avatar de robinsondesbois
    Homme Profil pro
    Etudiant
    Inscrit en
    Avril 2012
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Haute Loire (Auvergne)

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

    Informations forums :
    Inscription : Avril 2012
    Messages : 171
    Par défaut
    Alors oui j'ai ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    in vec3 in_Position;
    in vec3 in_Color;
    Initialisé de telle façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    glBindAttribLocation(_shaderId, 0, "in_Position");
    glBindAttribLocation(_shaderId, 1, "in_Color");
    Donc j'ai au moins compris pourquoi le 0 correspond à la position et le 1 à la couleur. Mais du coup, s'il n'y a pas d'erreur ça devrais marcher

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

Discussions similaires

  1. rendre les skybox plus réaliste
    Par Ekinoks dans le forum Développement 2D, 3D et Jeux
    Réponses: 16
    Dernier message: 19/12/2006, 14h55
  2. [Config PC de joueur] Les petits plus des experts
    Par Manopower dans le forum Ordinateurs
    Réponses: 22
    Dernier message: 30/09/2005, 12h11
  3. [Debutante] trouver les 5 plus grandes valeurs
    Par Sarrus dans le forum Langage SQL
    Réponses: 11
    Dernier message: 25/07/2005, 16h39
  4. [debutant][JNI]Stocker des objet pour les rappeler plus tard
    Par Celenor dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 28/03/2004, 03h28

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