SFML community forums

Help => Graphics => Topic started by: glorifiedelbow on March 28, 2020, 10:03:28 pm

Title: Can't change position of sf::Sprite
Post by: glorifiedelbow on March 28, 2020, 10:03:28 pm
Hello! I'm trying to set up SFML with GLEW so I can directly use OpenGL calls instead of being limited to the SFML graphics package. As a simple test, I tried to render a single triangle to a sf::RenderTexture, and then render that texture onto a sf::RenderWindow by attaching it to a sf::Sprite. My triangle rendered correctly at first, but then I tried adding in some code to make the sprite move around, but the code seemed to have no effect and my triangle still rendered to stretch across the whole screen. This makes me wonder if I'm really rendering to the RenderTexture or if I'm somehow rendering my triangle directly to the window without realizing it. Anyway, here's my code:

#include <gl/glew.h>

#include <SFML/Graphics.hpp>
#include <iostream>

#include "Shader.h"

int main()
{

        sf::RenderWindow window(sf::VideoMode(800, 600), "OpenGL 4.3", sf::Style::Default);
        window.setVerticalSyncEnabled(true);

        sf::ContextSettings settings;
        settings.majorVersion = 4;
        settings.minorVersion = 3;
       
        sf::RenderTexture gl_renderTarget;
        gl_renderTarget.create(800, 600, settings);
        gl_renderTarget.setActive(true);
       
        sf::Sprite gl_rendering(gl_renderTarget.getTexture());

        if (glewInit() != GLEW_OK)
        {

                std::cout << "Failed to initialize GLEW.\n";

                int qqq; std::cin >> qqq;
                return -1;

        }

        // Just a simple class that I wrote for handling shaders
        ShaderProgram shader("shader.vs", "shader.fs");

        GLfloat verts[] = {
                -1.0f, -1.0f,
                1.0f, -1.0f,
                1.0f, 1.0f
        };
       
        GLuint vao;
        glGenVertexArrays(1, &vao);
        glBindVertexArray(vao);

        GLuint vbo;
        glGenBuffers(1, &vbo);
        glBindBuffer(GL_ARRAY_BUFFER, vbo);
        glBufferData(GL_ARRAY_BUFFER, sizeof(verts), verts, GL_STATIC_DRAW);

        glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(float), (void*)0);
        glEnableVertexAttribArray(0);

        glBindVertexArray(0);

        while (window.isOpen())
        {

                sf::Event event;
                while (window.pollEvent(event))
                {
                        if (event.type == sf::Event::Closed)
                                window.close();
                }

                gl_renderTarget.setActive(true);

                glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

                glBindVertexArray(vao);
                shader.use();
                glDrawArrays(GL_TRIANGLES, 0, 3);
               
                // As far as I understand, this should be making the triangle rotate every iteration, but instead it is stationary
                gl_rendering.rotate(10.0f);
                window.draw(gl_rendering);

                window.display();

        }

        return 0;
}
 

Any help would be greatly appreciated  :D I don't usually ask for help on forums like this, but I've been stuck on this for hours and I don't think I'm gonna figure it out anytime soon. This is my first time using SFML, so I'm sorry if it's something super obvious that I'm just overlooking.
Title: Re: Can't change position of sf::Sprite
Post by: Hapax on March 30, 2020, 04:20:09 pm
The Graphics Module* in SFML also uses OpenGL. It needs its own state so you need to switch OpenGL states between using the graphics module and manual OpenGL.

There's more information about it here:
https://www.sfml-dev.org/tutorials/2.5/window-opengl.php#using-opengl-together-with-the-graphics-module

*sf::Sprite is a part of the graphics module.
Title: Re: Can't change position of sf::Sprite
Post by: glorifiedelbow on March 30, 2020, 08:23:27 pm
Thanks for your reply! I actually saw that page, but I guess I just have a misunderstanding of how OpenGL works and what "states" are. I've only ever used OpenGL by itself and not in combination with a second graphics library. I'll do a little more research on OpenGL and then come back to this project. :)
Title: Re: Can't change position of sf::Sprite
Post by: Hapax on March 31, 2020, 05:48:06 pm
"The easiest solution is to let SFML do it for you"

glDraw...

window.pushGLStates();

window.draw(...);

window.popGLStates();

glDraw...

 8)

Can't say I fully understand the underlying mechanics of the sharing of OpenGL with SFML but this is the official 'easy' solution, although you can do more manual switching if optimisation is needed. It shows how in tha same tutorial :)