-
Bonjour,
Je cherche depuis quelques temps a essayé différents "trucs" en opengl et sfml.
Et je me demandé si on peut dessiner en OpenGL dans un sf::RenderTexture ?
j'ai essayé 2/3 manipulations a partir de l'exemple fourni mais j'ai l'impression que seul sf::RenderWindow peut faire un rendu OpenGL ?
-
Les deux classes fonctionnent exactement de la même manière, c'est le même code qui tourne derrière (cf. la classe de base sf::RenderTarget).
Si tu as un souci n'hésite pas à poster un code minimal qui reproduit le problème, et on l'examinera.
-
pour les tests, j'ai prix l'exemple du cube en bois openGL fourni dans les exemples SFML.
Le problème c'est que des que je creer un sf::RenderTexture, mon cube ne s'affiche plus, je sais pas comment lui dire de dessiner sur ce sf::RenderTexture ou un autre ... ?
si j'appel pas sf::RenderTexture::create(...) , le cube s'affiche normalement.
#include <SFML/Graphics.hpp>
#include <SFML/OpenGL.hpp>
int main()
{
// Create the main window
sf::RenderWindow window(sf::VideoMode(800, 600), "SFML OpenGL");
window.setVerticalSyncEnabled(true);
sf::RenderTexture render;
if (!render.create(800, 600))
return -1;
/* texture opengl bois*/
GLuint texture = 0;
{
sf::Image image;
if (!image.loadFromFile("resources/texture.jpg"))
return EXIT_FAILURE;
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, image.getSize().x, image.getSize().y, GL_RGBA, GL_UNSIGNED_BYTE, image.getPixelsPtr());
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
}
// Enable Z-buffer read and write
glEnable(GL_DEPTH_TEST);
glDepthMask(GL_TRUE);
glClearDepth(1.f);
// Setup a perspective projection
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(90.f, 1.f, 1.f, 500.f);
// Bind our texture
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texture);
glColor4f(1.f, 1.f, 1.f, 1.f);
// boucle principale
while (window.isOpen())
{
// Process events
sf::Event event;
while (window.pollEvent(event))
{
// Close window : exit
if (event.type == sf::Event::Closed)
window.close();
}
// Clear the depth buffer
glClear(GL_DEPTH_BUFFER_BIT);
// Apply some transformations
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
// Draw a cube
float size = 20.f;
/* position du cube */
glTranslated(0,0,-size*4);
glRotated(45,1,1,0);
/* desin du cube */
glBegin(GL_QUADS);
glTexCoord2f(0, 0); glVertex3f(-size, -size, -size);
glTexCoord2f(0, 1); glVertex3f(-size, size, -size);
glTexCoord2f(1, 1); glVertex3f( size, size, -size);
glTexCoord2f(1, 0); glVertex3f( size, -size, -size);
glTexCoord2f(0, 0); glVertex3f(-size, -size, size);
glTexCoord2f(0, 1); glVertex3f(-size, size, size);
glTexCoord2f(1, 1); glVertex3f( size, size, size);
glTexCoord2f(1, 0); glVertex3f( size, -size, size);
glTexCoord2f(0, 0); glVertex3f(-size, -size, -size);
glTexCoord2f(0, 1); glVertex3f(-size, size, -size);
glTexCoord2f(1, 1); glVertex3f(-size, size, size);
glTexCoord2f(1, 0); glVertex3f(-size, -size, size);
glTexCoord2f(0, 0); glVertex3f(size, -size, -size);
glTexCoord2f(0, 1); glVertex3f(size, size, -size);
glTexCoord2f(1, 1); glVertex3f(size, size, size);
glTexCoord2f(1, 0); glVertex3f(size, -size, size);
glTexCoord2f(0, 1); glVertex3f(-size, -size, size);
glTexCoord2f(0, 0); glVertex3f(-size, -size, -size);
glTexCoord2f(1, 0); glVertex3f( size, -size, -size);
glTexCoord2f(1, 1); glVertex3f( size, -size, size);
glTexCoord2f(0, 1); glVertex3f(-size, size, size);
glTexCoord2f(0, 0); glVertex3f(-size, size, -size);
glTexCoord2f(1, 0); glVertex3f( size, size, -size);
glTexCoord2f(1, 1); glVertex3f( size, size, size);
glEnd();
// Finally, display the rendered frame on screen
render.display();
window.draw( sf::Sprite(render.getTexture()) );
window.display();
}
// Don't forget to destroy our texture
glDeleteTextures(1, &texture);
return EXIT_SUCCESS;
}
-
Avant de dessiner sur la render texture, il faut appeler render.setActive(true). Pour la fenêtre pas besoin, puisque tu n'utilises que des fonctions SFML (qui le font automatiquement).
-
ca marche pas mieux ><, je ne sais pas trop ou les placer les setActive(true) ?
...
/* desin du cube */
render.setActive(true);
glBegin(GL_QUADS);
glTexCoord2f(0, 0); glVertex3f(-size, -size, -size);
glTexCoord2f(0, 1); glVertex3f(-size, size, -size);
glTexCoord2f(1, 1); glVertex3f( size, size, -size);
glTexCoord2f(1, 0); glVertex3f( size, -size, -size);
glTexCoord2f(0, 0); glVertex3f(-size, -size, size);
glTexCoord2f(0, 1); glVertex3f(-size, size, size);
glTexCoord2f(1, 1); glVertex3f( size, size, size);
glTexCoord2f(1, 0); glVertex3f( size, -size, size);
glTexCoord2f(0, 0); glVertex3f(-size, -size, -size);
glTexCoord2f(0, 1); glVertex3f(-size, size, -size);
glTexCoord2f(1, 1); glVertex3f(-size, size, size);
glTexCoord2f(1, 0); glVertex3f(-size, -size, size);
glTexCoord2f(0, 0); glVertex3f(size, -size, -size);
glTexCoord2f(0, 1); glVertex3f(size, size, -size);
glTexCoord2f(1, 1); glVertex3f(size, size, size);
glTexCoord2f(1, 0); glVertex3f(size, -size, size);
glTexCoord2f(0, 1); glVertex3f(-size, -size, size);
glTexCoord2f(0, 0); glVertex3f(-size, -size, -size);
glTexCoord2f(1, 0); glVertex3f( size, -size, -size);
glTexCoord2f(1, 1); glVertex3f( size, -size, size);
glTexCoord2f(0, 1); glVertex3f(-size, size, size);
glTexCoord2f(0, 0); glVertex3f(-size, size, -size);
glTexCoord2f(1, 0); glVertex3f( size, size, -size);
glTexCoord2f(1, 1); glVertex3f( size, size, size);
glEnd();
render.setActive(false);
// Finally, display the rendered frame on screen
render.display();
window.draw( sf::Sprite(render.getTexture()) );
window.display();
-
je ne sais pas trop ou les placer les setActive(true) ?
Avant chaque (groupe d') appel OpenGL qui concerne la render texture. Donc avant de faire tes initialisations aussi.
-
j'ai maintenant compris comment fonctionner le setActive() ( après quelques tests ^^ ), par contre ca n'affiche rien quand j'utilise le sf::RenderTexture.
je pense que le probléme vient de la fin du code ici :
window.draw( sf::Sprite(render.getTexture()) );
enfin je crois ... sinon je voie pas ou ?
le code actuel :
#include <SFML/Graphics.hpp>
#include <SFML/OpenGL.hpp>
/* desin du cube */
void cube()
{
float size = 20.f;
glBegin(GL_QUADS);
glTexCoord2f(0, 0); glVertex3f(-size, -size, -size);
glTexCoord2f(0, 1); glVertex3f(-size, size, -size);
glTexCoord2f(1, 1); glVertex3f( size, size, -size);
glTexCoord2f(1, 0); glVertex3f( size, -size, -size);
glTexCoord2f(0, 0); glVertex3f(-size, -size, size);
glTexCoord2f(0, 1); glVertex3f(-size, size, size);
glTexCoord2f(1, 1); glVertex3f( size, size, size);
glTexCoord2f(1, 0); glVertex3f( size, -size, size);
glTexCoord2f(0, 0); glVertex3f(-size, -size, -size);
glTexCoord2f(0, 1); glVertex3f(-size, size, -size);
glTexCoord2f(1, 1); glVertex3f(-size, size, size);
glTexCoord2f(1, 0); glVertex3f(-size, -size, size);
glTexCoord2f(0, 0); glVertex3f(size, -size, -size);
glTexCoord2f(0, 1); glVertex3f(size, size, -size);
glTexCoord2f(1, 1); glVertex3f(size, size, size);
glTexCoord2f(1, 0); glVertex3f(size, -size, size);
glTexCoord2f(0, 1); glVertex3f(-size, -size, size);
glTexCoord2f(0, 0); glVertex3f(-size, -size, -size);
glTexCoord2f(1, 0); glVertex3f( size, -size, -size);
glTexCoord2f(1, 1); glVertex3f( size, -size, size);
glTexCoord2f(0, 1); glVertex3f(-size, size, size);
glTexCoord2f(0, 0); glVertex3f(-size, size, -size);
glTexCoord2f(1, 0); glVertex3f( size, size, -size);
glTexCoord2f(1, 1); glVertex3f( size, size, size);
glEnd();
}
/* chargement texture */
GLuint chargerTexture( const std::string &lien )
{
GLuint texture = 0;
sf::Image image;
if (!image.loadFromFile( lien ))
return EXIT_FAILURE;
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, image.getSize().x, image.getSize().y, GL_RGBA, GL_UNSIGNED_BYTE, image.getPixelsPtr());
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
return texture;
}
///////////////////////////////////////////////////////////////////////////////////////
int main()
{
GLuint texture = 0;
// Create the main window
sf::RenderWindow window(sf::VideoMode(800, 600), "SFML OpenGL");
sf::RenderTexture render;
if (!render.create(800, 600))
return -1;
/* dessin sur le render */
render.setActive(true);
{
// Enable Z-buffer read and write
glEnable(GL_DEPTH_TEST);
glDepthMask(GL_TRUE);
glClearDepth(1.f);
// Setup a perspective projection
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(90.f, 1.f, 1.f, 500.f);
// charger texture
texture = chargerTexture("resources/texture.jpg");
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texture);
glColor4f(1.f, 1.f, 1.f, 1.f);
}
// boucle principale
while (window.isOpen())
{
// Process events
sf::Event event;
while (window.pollEvent(event))
{
// Close window : exit
if (event.type == sf::Event::Closed)
window.close();
}
/* dessin sur le render */
render.setActive(true);
{
// Clear the depth buffer
glClear(GL_DEPTH_BUFFER_BIT);
// Apply some transformations
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
/* position du cube */
glTranslated(0,0,-60);
glRotated(45,1,1,0);
/* dessin du cube */
cube();
}
// rendu
render.display();
window.draw( sf::Sprite(render.getTexture()) );
window.display();
}
// Don't forget to destroy our texture
glDeleteTextures(1, &texture);
return EXIT_SUCCESS;
}
-
suite du post de dessus.
je n'ais toujours pas réussi a afficher le cube dans le sf::RenderTexture, par contre si je le change par un sf::RenderWindow j’obtiens bien le cube sur une deuxième fenêtre.
Pour le sf::RenderTexture, il ne dessine pas le cube sur la fenêtre principale. je pense avoir oublier de déclarer ou configurer quelques choses ?.
window.draw( sf::Sprite( render.getTexture() );
une personne a une idée ?
-
Désolé, j'ai pas trop le temps de faire des tests en ce moment :-\
Mais en tout cas je n'ai pas trouvé d'erreur qui saute aux yeux dans ton code.
-
y a pas de problème Laurent.
Je vais continuer a chercher un peu ( et regarder les sources de la SFML au passage pour essayer d'un peu mieux comprendre comment ca marche ).