Bonjour,
J'ai un petit problème. Je souhaite afficher un triangle. Je suis partie d'un exemple qui utilsie des VAO mais je ne souhaite pas utilsier de VAO, mais uniquement des VBO.
Voici le code qui fonctionne sous QT avec VAO.
Je l'ai modifier pour ne plus utiliser de VAO, mais j'ai un écran noir !
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 void MyGLWindow::initialize() { m_program = new QOpenGLShaderProgram(m_context); // create shader program m_program->addShaderFromSourceFile(QOpenGLShader::Vertex, "D://QTMobile//MyProjects_Desktop//vertexColors.vert"); // load vertex shader m_program->addShaderFromSourceFile(QOpenGLShader::Fragment, "D://QTMobile//MyProjects_Desktop//vertexColors.frag"); // load fragment shader m_program->link(); // compile and link shader program const float vertexData[] = { // x y z w 0.0f, 0.5f, 0.0f, 1.0f, 0.5f, -0.366f, 0.0f, 1.0f, -0.5f, -0.366f, 0.0f, 1.0f, // R G B A 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, }; // create Vertex Buffer Object glGenBuffers(1, &VB_Position); glBindBuffer(GL_ARRAY_BUFFER, VB_Position); glBufferData(GL_ARRAY_BUFFER, sizeof(vertexData), vertexData, GL_STATIC_DRAW); glBindBuffer(GL_ARRAY_BUFFER, 0); } void MyGLWindow::render() { m_context->makeCurrent(this); // context is current glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClear(GL_COLOR_BUFFER_BIT); glUseProgram(m_program->programId()); // active shader program GLuint positionIndex = glGetAttribLocation(m_program->programId(), "position"); GLuint colorIndex = glGetAttribLocation(m_program->programId(), "color"); glBindVertexArray(VAO); glDrawArrays(GL_TRIANGLES, 0, 3); glBindVertexArray(0); glUseProgram(0); m_context->swapBuffers(this); }
Je n'ai rien modifié d'autre. Qu'est ce qui cloche ?
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72 void MyGLWindow::initialize() { m_program = new QOpenGLShaderProgram(m_context); // create shader program m_program->addShaderFromSourceFile(QOpenGLShader::Vertex, "D://QTMobile//MyProjects_Desktop//vertexColors.vert"); // load vertex shader m_program->addShaderFromSourceFile(QOpenGLShader::Fragment, "D://QTMobile//MyProjects_Desktop//vertexColors.frag"); // load fragment shader m_program->link(); // compile and link shader program const float vertexData[] = { // x y z w 0.0f, 0.5f, 0.0f, 1.0f, 0.5f, -0.366f, 0.0f, 1.0f, -0.5f, -0.366f, 0.0f, 1.0f, // R G B A 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, }; // create VBO glGenBuffers(1, &VB_Position); glBindBuffer(GL_ARRAY_BUFFER, VB_Position); glBufferData(GL_ARRAY_BUFFER, sizeof(vertexData), vertexData, GL_STATIC_DRAW); glBindBuffer(GL_ARRAY_BUFFER, 0); // create VAO glGenVertexArrays(1, &VAO); glBindVertexArray(VAO); glBindBuffer(GL_ARRAY_BUFFER, VB_Position); glEnableVertexAttribArray(0); glEnableVertexAttribArray(1); glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0); glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 0, (void*)48); glBindVertexArray(0); glBindBuffer(GL_ARRAY_BUFFER, 0); } void MyGLWindow::render() { m_context->makeCurrent(this); // context is current glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClear(GL_COLOR_BUFFER_BIT); glUseProgram(m_program->programId()); // active shader program GLuint positionIndex = glGetAttribLocation(m_program->programId(), "position"); GLuint colorIndex = glGetAttribLocation(m_program->programId(), "color"); glBindBuffer(GL_ARRAY_BUFFER, VB_Position); glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0); glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 0, (void*)48); glEnableVertexAttribArray(0); glEnableVertexAttribArray(1); glDrawArrays(GL_TRIANGLES, 0, 3); glDisableVertexAttribArray(0); glDisableVertexAttribArray(1); glBindBuffer(GL_ARRAY_BUFFER, 0); glUseProgram(0); m_context->swapBuffers(this); }
J'ai essayé aussi de séparer les tabelaux de position et couleur et écran noir aussi.
Merci
Partager