J'ai réussi à créer un code minimal reproduisant le problème :
#include <GL/glew.h>
#include <SFML/Window.hpp>
#include <SFML/OpenGL.hpp>
#include <SFML/Graphics.hpp>
#include <iostream>
using namespace std;
using namespace sf;
void createSquare(GLuint &vaoID, GLuint &vboID, GLuint &iboID) {
float* vertices = new float[12]; // Sommets du carré
vertices[0] = -0.5; vertices[1] = -0.5; vertices[2] = 0.0; // Coin en bas à gauche
vertices[3] = -0.5; vertices[4] = 0.5; vertices[5] = 0.0; // Coin en haut à gauche
vertices[6] = 0.5; vertices[7] = 0.5; vertices[8] = 0.0; // Coin en haut à droite
vertices[9] = 0.5; vertices[10] = -0.5; vertices[11] = 0.0; // Coin en bas à droite
GLubyte Indices[] = {
// Top
1, 2, 0,
3, 0, 2
};
glGenVertexArrays(1, &vaoID); // Créer le VAO
glBindVertexArray(vaoID); // Lier le VAO pour l'utiliser
glGenBuffers(1, &vboID); // Générer le VBO
glBindBuffer(GL_ARRAY_BUFFER, vboID); // Lier le VBO
glBufferData(GL_ARRAY_BUFFER, 12 * sizeof(GLfloat), vertices, GL_STATIC_DRAW); // Définir la taille, les données et le type du VBO
glVertexAttribPointer((GLuint)0, 3, GL_FLOAT, GL_FALSE, 0, 0); // Définir le pointeur d'attributs des sommets
glGenBuffers(1, &iboID);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, iboID);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(Indices), Indices, GL_STATIC_DRAW);
glEnableVertexAttribArray(0); // Désactiver le VAO
glBindVertexArray(0); // Désactiver le VBO
delete [] vertices; // Supprimer les sommets
}
Texture getTextureFromRenderTexture()
{
RenderTexture renderTexture;
if(!(renderTexture.create(50,50)))
std::cout<<"failed create renderTexture"<<std::endl;
return renderTexture.getTexture();
}
int main()
{
RenderWindow window;
window.create(VideoMode(800, 600), "test bug RenderTexture", Style::Default, ContextSettings(32));
window.setVerticalSyncEnabled(true);
GLenum initialisationGLEW( glewInit() );
if(initialisationGLEW != GLEW_OK)
{
cout << "Erreur d'initialisation de GLEW : " << glewGetErrorString(initialisationGLEW) << endl;
}
Event event;
bool running=true;
unsigned int vaoID; // VAO
unsigned int vboID; // VBO
unsigned int iboID; // IBO
createSquare(vaoID, vboID, iboID);
Texture texture;
while (running)
{
window.setActive();
while (window.pollEvent(event))
{
if (event.type == Event::Closed)
{
// on stoppe le programme
running = false;
}
else if ((event.type == Event::KeyPressed) && (event.key.code == Keyboard::T) )
{
texture = getTextureFromRenderTexture();
}
}
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBindVertexArray(vaoID); // Lier le VAO
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, 0);
glBindVertexArray(0); // Délier le VAO
window.display();
}
window.close();
return 0;
}
Le programme plante sur mon PC nVidia si j'appuie sur T, au niveau du glDrawElements !
J'ai essayé avec ceci à la place de l'utilisation du VAO :
glBegin(GL_LINES);
glVertex2i(0,0);glVertex2i(0,1);
glVertex2i(0,0);glVertex2i(1,0);
glVertex2i(0,0);glVertex3i(0,0,1);
glEnd();
Et cela ne plante pas lors de l'appuie sur T.
De même, testé à l'instant avec seulement "glDrawArrays(GL_TRIANGLES, 0, 3);" (donc sans me servir de l'IBO), et aucun problème. Il semblerait donc que le bug se limite à l'utilisation de glDrawElements.
Et enfin, autre détail, si "texture = getTextureFromRenderTexture();" est placé avant la boucle principale il n'y a aucun problème. Mais dès qu'il est dedans (par forcément au sein donc d'une réponse à un Event), le programme plante.
A noter donc que si je commente le "renderTexture.create(50,50)" il n'y a aucun problème ! La cause du problème semble donc venir de là !
Voilà, je peux difficilement faire plus précis ^^ !