2017-08-29 1 views
2

Ce que je suis en train de faire:texture générée sfml n'est pas dessiné à la fenêtre

  • dessiner une texture à une fenêtre

:: sf généré Résultat attendu:

  • Une texture de remplissage de fenêtre (dans l'exemple de code: un fond vert)

Le résultat:

  • Une fenêtre vide (noir)

Ce que je l'ai fait jusqu'à présent:

  • chargement essayé dans une texture d'un fichier: Travaux
  • essayé enregistrer la texture générée dans un fichier: fonctionne
  • essayé de générer une texture plus petite, dans les limites de Texture.getMaximumSize()
  • rétrécit le code à un minimum

Les outils que j'utilise:

  • OS: Kde Neon 5.10 (basé sur Ubuntu 16.04), le noyau Linux 4.4
  • système de construction: qmake
  • version de: 2,3

Exemple de code (complètement dépouillé, et inutile sous cette forme, mais il affiche le problème):

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

using namespace std; 

int main() 
{ 
    // width and height of the window 
    // this will not exceed max size of texture 
    uint width = 128; 
    uint height = 128; 

    // create new window 
    sf::RenderWindow * window = new sf::RenderWindow(sf::VideoMode(height,width), "Mandelbrot"); 

    // create pixel array 
    vector<sf::Uint8> * pixels = new vector<sf::Uint8>(height * width * 4); 

    // fill array with collors; 
    for (uint i = 0; i < height*width; i++) 
    { 
     pixels->at(i*4 + 2) = 255; 
    } 

    // create texture 
    sf::Texture * texture = new sf::Texture(); 
    texture->create(width,height); 
    texture->update(pixels->data()); 

    // create sprite to hold the texture 
    sf::Sprite * sprite = new sf::Sprite(); 
    sprite->setTexture(*texture); 
    sprite->setTextureRect(sf::IntRect(0, 0, width, height)); 

    // draw the sprite 
    window->draw(*sprite); 

    // draw buffer to screen 
    window->display(); 

    // close window on system close action 
    sf::Event event; 
    while (window->waitEvent(event)) 
    { 
     if (event.type == sf::Event::Closed) 
     { 
      // close window 
      window->close(); 
      return 0; 
     } 
    } 

return 1; 
} 

Répondre

0

Vous n'êtes pas le réglage du canal alpha de chaque pixel (Format RGBA). Il doit être 255 pour une image entièrement opaque:

for (uint i = 0; i < height*width; i++) 
{ 
    pixels->at(i*4 + 3) = 255; // alpha 
    pixels->at(i*4 + 2) = 255; // blue 
} 
+0

Merci! alpha est le quatrième composant, donc 'pixels-> at (i * 4 + 3) = 255;' était ce dont j'avais besoin – Riscky

+0

@Riscky désolé je me suis trompé de commande - corrigé – meowgoesthedog

0

Je pense que vous ne définissez pas tous les pixels de la texture, mais seulement tous les quatre, en commençant par 2. Essayez ceci:

for (uint i = 0; i < height*width; i++) 
    { 
     pixels.at(i*4 + 0) = 255; 
     pixels.at(i*4 + 1) = 221; 
     pixels.at(i*4 + 2) = 255; 
     pixels.at(i*4 + 3) = 255; 
    }