SFML community forums

Help => General => Topic started by: gremio on March 02, 2014, 07:15:09 pm

Title: RenderTexture inverts pixels?
Post by: gremio on March 02, 2014, 07:15:09 pm
Hi,

I'm trying to make a mask (2d vector of boolean) from a rotated sprite. When I print the mask to the console as 1 for true, and 0 for false, the 1s are never where I would expect them to be. Here is one exemple of a case that I dont understand.

void maskByAngle::buildMasks(bar aBar)
{
        if(aBar.isLeft()){
                int angle = -30;
                Texture wtvTexture;
                Sprite tempSprite;
               
                wtvTexture.loadFromFile("Ressources/bar_left.png");
                tempSprite.setTexture(wtvTexture);
                tempSprite.setOrigin(0,tempSprite.getLocalBounds().height/2);
                while(angle <= 30){
                       
                        RenderTexture newRT;
                        newRT.create(tempSprite.getGlobalBounds().width, tempSprite.getGlobalBounds().height);
                        tempSprite.setPosition(0,0);
                        newRT.draw(tempSprite);
                        Texture myTexture = newRT.getTexture();
                        Image myImage = myTexture.copyToImage();
                        newRT.clear(Color::Black);
                        std::cout << "X = " << myImage.getSize().x << "  Y = " << myImage.getSize().y << endl;
                        vector<vector<bool>> vBBTemp;
                        for(int y = 0; y < myImage.getSize().y; ++y){
                       
                                vector<bool> vBTemp;
                                for(int x = 0; x < myImage.getSize().x; ++x){
                                        if(myImage.getPixel(x,y).a > 200){
                                                vBTemp.push_back(true);
                                                std::cout << 1;
                                        }else{
                                                vBTemp.push_back(false);
                                                std::cout << 0;
                                        }
                                }
                                std::cout << endl;
                                vBBTemp.push_back(vBTemp);
                        }
                        myMasksLeft.push_back(vBBTemp);
                        ++angle;
                }
        }else if(!aBar.isLeft()){
 

In the case I just printed, I get this in the console for the case where the angle = 0.


(http://s27.postimg.org/ram1p301r/console_angle_0.jpg) (http://postimg.org/image/ram1p301r/)

Even if you see a cout mentionning compensation, I am not applying it. Nevertheless, what I see in the console is not far from what I would expect. I expected the image to be a inverted version of this one. The 1s should be top, not at the bottom of the console output. Since my origin is at half-height, I know I'm suppose to "lose" half of the pixels, but why do I lose the bottom ones? Furthermore, I tried to draw the Sprite to my renderwindow before building my image, and It shows exactly what I would expect to find in my console :

(http://s14.postimg.org/keuz8a31p/display_top_left.jpg) (http://postimg.org/image/keuz8a31p/)

Furthermore, I tried something while writting this post and I found that if I print the image like this :
Texture aTexture;
aTexture.loadFromImage(myImage);
Sprite aSprite(aTexture);
myWin.draw(aSprite);
 

I actually get the same result I got by printing in the console. But why!? Why are the pixels inverted in the image?

Hope I was clear.



******************EDIT*********************
Sorry about the language, I didnt notice it was the french section of the forum (I am french canadian....)

Anyways, I tested something using renderTexture and I now know that render texture inverts the pixels. Here is the code I used to test (I tried to make it testable for others but you'll need your own renderwindow) :


        Sprite utilitySprite;
        Texture utilityTexture;

        utilityTexture.loadFromFile("Ressources/meteor.png");
        utilitySprite.setTexture(utilityTexture);

        utilitySprite.setPosition(200,0);
        MyWin.draw(utilitySprite);
       
        RenderTexture newRT;
        Image newImage;
        Texture newTexture;
        utilitySprite.setPosition(0,0);
        newRT.create(utilitySprite.getLocalBounds().width, utilitySprite.getLocalBounds().height);
        newRT.clear(Color::Yellow);
        newRT.draw(utilitySprite);
        newTexture = newRT.getTexture();
        newImage = newTexture.copyToImage();
        Texture aTexture;
        aTexture.loadFromImage(newImage);
        //Sprite newSprite(aTexture);
        Sprite newSprite(newRT.getTexture());
        newSprite.setPosition(400,0);
        MyWin.draw(newSprite);
       

 

here is what was rendered :

(http://s29.postimg.org/8e9z9jpjn/inverted_render_Texture.jpg) (http://postimg.org/image/8e9z9jpjn/)

Am I doing something wrong ? or should I flip the texture myself?
Title: Re: RenderTexture inverts pixels?
Post by: Laurent on March 02, 2014, 08:06:24 pm
Please read the doc and tutorial. It's explained there.
Title: AW: RenderTexture inverts pixels?
Post by: eXpl0it3r on March 02, 2014, 09:01:41 pm
aka rt.display()