Bonjour,
Je travail avec les VBO en openGL. les normales sont inversées lorsque les
buffers sont en mémoire graphique.
Voilà comment je créer mes VBO et les stocke en mémoire graphique
A chaque rendu
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 glGenBuffers(Enum_VNBUFFER_COUNT, (GLuint*)m_buffers.get()); glGenVertexArrays(1, &m_vertexArray); // Create our index Array Object glBindVertexArray(m_vertexArray); // Bind our Vertex Array Object so we can use it //vertices glEnableVertexAttribArray(m_Attributes[Enum_VBUFFER_INDEX]); glBindBuffer(GL_ARRAY_BUFFER, m_buffers[Enum_VBUFFER_INDEX]); // Bind our Vertex Buffer Object glBufferData(GL_ARRAY_BUFFER, m_buffersSizes[Enum_VBUFFER_INDEX] * sizeof(GLfloat), m_TBuffer, pParameters->useType()); glVertexAttribPointer(m_Attributes[Enum_VBUFFER_INDEX], 3, GL_FLOAT, GL_FALSE, 0, 0); // Set up our vertex attributes pointer define order in shader glBindBuffer(GL_ARRAY_BUFFER, 0); glDisableVertexAttribArray(m_Attributes[Enum_VBUFFER_INDEX]); // normal glEnableVertexAttribArray(m_Attributes[Enum_NBUFFER_INDEX]); glBindBuffer(GL_ARRAY_BUFFER, m_buffers[Enum_NBUFFER_INDEX]); // Bind our Vertex Buffer Object glBufferData(GL_ARRAY_BUFFER, m_buffersSizes[Enum_NBUFFER_INDEX] * sizeof(GLfloat), m_TBuffer + m_buffersOffsets[Enum_NBUFFER_INDEX - 1], pParameters->useType()); glVertexAttribPointer(m_Attributes[Enum_NBUFFER_INDEX], 3, GL_FLOAT, GL_FALSE, 0, 0); // Set up our vertex attributes pointer glBindBuffer(GL_ARRAY_BUFFER, 0); glDisableVertexAttribArray(m_Attributes[Enum_NBUFFER_INDEX]);
Si je ne charge pas les buffers en mémoire graphique les normales sont dans le bon sens,
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 // vertices glEnableVertexAttribArray(m_Attributes[Enum_VBUFFER_INDEX]); if (m_buffers[Enum_VBUFFER_INDEX] != 0) { //in graphical memory glBindBuffer(GL_ARRAY_BUFFER, m_buffers[Enum_VBUFFER_INDEX]); } else { glVertexPointer(3, GL_FLOAT, 0, m_TBuffer); glVertexAttribPointer(m_Attributes[Enum_VBUFFER_INDEX], 3, GL_FLOAT, GL_FALSE, 0, m_TBuffer); // Set up our vertex attributes pointer define order in shader } glEnableVertexAttribArray(m_Attributes[Enum_NBUFFER_INDEX]); if (m_buffers[Enum_NBUFFER_INDEX] != 0) { // in graphical memory glBindBuffer(GL_ARRAY_BUFFER, m_buffers[Enum_NBUFFER_INDEX]); } else { glNormalPointer(GL_FLOAT, 0, m_TBuffer + m_buffersOffsets[Enum_NBUFFER_INDEX - 1]); glVertexAttribPointer(m_Attributes[Enum_NBUFFER_INDEX], 3, GL_FLOAT, GL_FALSE, 0, m_TBuffer + m_buffersOffsets[Enum_NBUFFER_INDEX - 1]); // Set up our vertex attributes pointer define order in shader }
en revanche si les normales sont en mémoire graphique elles sont inversées.
En mémoire RAM
En mémoire graphique
![]()
Partager