Bienvenue, Invité. Merci de vous connecter ou de vous inscrire. Avez-vous oublié d'activer ?

Voir les contributions

Cette section vous permet de consulter les contributions (messages, sujets et fichiers joints) d'un utilisateur. Vous ne pourrez voir que les contributions des zones auxquelles vous avez accès.


Sujets - nico69

Pages: [1]
1
Graphique / Shader, texture & vertexarray
« le: Mai 13, 2017, 09:41:58 pm »
Bonjour,

Je débute actuellement dans le domaine des shader, et j'essaye de les faire fonctionner avec la sfml.

J'ai réalisé un shader en me basant sur un sprite, qui fonctionne.
Maintenant, je veut l'utiliser sur des vertexarray, et le rendu n'est pas le même.

Sans Shader (droite vertexarray, gauche sprite):
https://www.hostingpics.net/viewer.php?id=579046sans.png
Avec shader
https://www.hostingpics.net/viewer.php?id=779144avec.png

J'ai l'impression, lors de l'utilisation d'un shader, les coordonnées de texture ne sont pas normalisés sur un vertexarray, mais le sont correctement sur un sprite (si je change la couleur en bas a droite de la texture, tout le redu change de couleur du coté du vertexarray avec shader).

Voici mon code :
#include <SFML/Graphics.hpp>
#include <SFML/Graphics/Glsl.hpp>
#include "ressource.h"
#include <iostream>
#include <random>

sf::VertexArray quad(sf::FloatRect rect, sf::Vector2f offset)
{
    sf::VertexArray array(sf::Quads, 4);
    array[0] = sf::Vertex(sf::Vector2f(0, 0) + offset, sf::Vector2f(rect.left, rect.top));
    array[1] = sf::Vertex(sf::Vector2f(rect.width*2, 0) + offset, sf::Vector2f(rect.left + rect.width, rect.top));
    array[2] = sf::Vertex(sf::Vector2f(rect.width*2, rect.height*2) + offset, sf::Vector2f(rect.left + rect.width, rect.top + rect.height));
    array[3] = sf::Vertex(sf::Vector2f(0, rect.height*2) + offset, sf::Vector2f(rect.left, rect.top + rect.height));
    return array;
}

int main()
{
    sf::RenderWindow window(sf::VideoMode(1000, 600), "SFML works!");
    window.setFramerateLimit(60);

    sf::View v(window.getView());
    v.setCenter(sf::Vector2f(0, 0));
    window.setView(v);

    Texture img("Res/img.png");
    sf::Shader shader;
    shader.loadFromFile("Src/basicshader.vert", "Src/basicshader.frag");
    shader.setUniform("texture", *img);

    sf::Sprite s(*img);
    s.setScale(2.0f, 2.0f);
    s.setPosition(-sf::Vector2f(img->getSize()) - sf::Vector2f(250, 0));

    sf::VertexArray array(quad(sf::FloatRect(0, 0, img->getSize().x, img->getSize().y), sf::Vector2f(0, -(float)img->getSize().y)));

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

        window.clear();
        window.draw(s, &shader);
        window.draw(array, &shader);
        //window.draw(s, img());
        //window.draw(array, img());
        window.display();
    }

    return 0;
}

Et les shaders (très simple pour l'exemple)
//vertex
void main()
{
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
    gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
    gl_FrontColor = gl_Color;
}

//fragment
uniform sampler2D texture;

void main()
{

    vec4 pixel = texture2D(texture, gl_TexCoord[0].xy);
    gl_FragColor = gl_Color * pixel;
}
 

Est ce un bug de la sfml, ou ai-je loupé une étape dans mon rendu ?
Je n'ai pas envie de normaliser au cas par cas (avec/sans shader).
Si c'est un bug, quel moyen ai-je pour le contourner ?

ps : j'utilise sfml 2.4.2

Merci pour votre aide

2
Audio / Probleme volume
« le: Septembre 09, 2016, 01:18:57 am »
Bonjour,

Pour un projet actuel, j'essaye de mettre au point un système de fondu (en ouverture et fermeture de la musique, qui tourne en boucle).
En testant le système j'ai remarqué que le fondu ne se faisait pas .... alors que le volume est correctement pris en compte (getVolum retourne la bonne valeur).
J'obtiens l'effet désiré quand le volume est bas (entre 0 et 30 environ, après le volume reste constant).

J'ai ensuite voulu voir ce qui se passait niveau son, donc j'ai fait un test sur un bruit uni, et enregistré sur audacity.

#include <SFML/Audio/Music.hpp>
#include <SFML/Window/Window.hpp>
#include <SFML/Window/Event.hpp>
#include <SFML/System/Clock.hpp>

int main()
{
    sf::Window window(sf::VideoMode(200, 200), "Music test");
    window.setFramerateLimit(60);

    sf::Clock c;

    sf::Music m;
    m.openFromFile("res/music/480Hz.ogg");
    m.play();
    bool isHight(true);

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

        if(c.getElapsedTime().asSeconds() > 1)
        {
            c.restart();
            isHight = !isHight;
            m.setVolume(isHight ? 100 : 5); //le volume change entre 100 et 5 toutes les secondes.
        }

        window.display();
    }

    return 0;
}
 
Je devrais donc ici m'attendre a voir un créneau apparaitre sur l'enregistrement.
Mais contre toute attente ... j’obtiens ceci :

Lorsque le son baisse, celui ci est bien pris en compte, mais revient rapidement à sa valeur maximum.
Lorsque le minimum est à 5%, la valeur remonte aussi pas mal .... pour arriver autour de 40%.

Quel serais la cause de ce probleme ? Suis-je le seul à avoir ce comportement ?

3
Bonjour,
Certains types de la sfml ne sont ni copiable, ni mouvable (comme sf::RenderTexture ou sf::Music).
Il est donc impossible de les placer dans une liste.
Il me faut donc passer par un unique_ptr pour palier ce probleme, et je ne trouve pas ça top.

std::vector<sf::Music> musics;
musics.push_back(sf::Music()); //error use of deleted function 'sf::Music::Music(const sf::Music&)

std::vector<std::unique_ptr<sf::Music>> m;
m.push_back(std::make_unique<sf::Music>()); //it's ok
 

Est il possible de rendre ces type non copiable mouvable ?
Ça faciliterais grandement leur gestion dans les listes.

Merci

4
Graphique / sf::font smooth
« le: Mai 14, 2016, 10:56:13 pm »
Bonjour,

J'ai remarqué que le rendu qu'un sf::Text est automatiquement smooth, que la taille de la police soit exacte ou une interpolation des données de la police.

Je suis actuellement en train de réaliser un programme qui fait un zoom constant sur la vue (donc 1 pixel réel est affiché en 2*2).
Je me retrouve donc en final avec du texte flou .... (en haut)

J'ai trouvé une solution .... pas très élégante pour éviter ce lissage du texte, je dessine le texte sur un sf::RenderTexture que j’insère dans un sf::Sprite pour réaliser le rendu.
Voici un code pour reproduire un rendu similaire à l'image précédente.
#include <SFML/Graphics.hpp>

int main()
{
    sf::RenderWindow window(sf::VideoMode(200, 200), "SFML works!");
    sf::View v(window.getView());
    v.zoom(1/2.0f);
    window.setView(v);

    sf::Font font;
    font.loadFromFile("res/font/PressStart2P.ttf");
    sf::Text text("Something", font, 8);
    text.setPosition(-text.getGlobalBounds().left, -text.getGlobalBounds().top);
    text.setColor(sf::Color::Black);
    sf::RenderTexture textImg;
    textImg.create(text.getGlobalBounds().width, text.getGlobalBounds().height);
    textImg.clear(sf::Color(0, 0, 0, 0));
    textImg.draw(text);
    textImg.display();
    sf::Sprite sText(textImg.getTexture());
    text.setPosition(60, 85);
    sText.setPosition(60, 115);

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

        window.clear(sf::Color::White);
        window.draw(text);
        window.draw(sText);
        window.display();
    }

    return 0;
}
 
Y a t'il un meilleur moyen de faire pour supprimer le lissage des textes ? Ou idéalement de supprimer ce comportement (comme setSmooth sur les sf::Texture, mais rien trouvé de ce genre sur sf::Text et sf::Font).
Merci pour votre aide! :)

Edit : j'oubliais, j'utilise cette police si ça peut être utile : http://www.dafont.com/fr/press-start-2p.font

5
Graphique / sf::Quads déprécated ?
« le: Juin 07, 2015, 01:12:50 pm »
Bonjour,

J'ai lu, sur la doc que sf::Quads était déprécated.
http://www.sfml-dev.org/documentation/2.3-fr/group__graphics.php#ga5ee56ac1339984909610713096283b1b
Doit on préférer la création des quads en combinant 2 triangles, ou peut on toujours l'utiliser ? et jusqu’à quand ? (si la prochaine version de la sfml le supporte encore ou pas).
Par contre, doubler le nombre de surfaces (et ajouter 50% de points) ne risque pas de faire baisser les performances du programme, et d'augmenter les ressources demandés ?

Merci
nico

6
Fenêtrage / Qt+SFML widget resize
« le: Novembre 29, 2014, 02:01:43 pm »
Bonjour,

J'ai, comme beaucoup, suivis ce document pour intégrer une surface SFML dans une fenêtre Qt.
http://becomingindiedev.blogspot.fr/2013/10/qt-5-and-sfml-20-integration.html
Que j'ai modifié pour que la surface agisse comme un widget classique, et non placé de façon rigide.

J'ai remarqué, que lorsque l'on redimensionne la fenêtre, celle de rendu ne change pas de taille.
La seule façon de faire que j'ai trouvé, pour que la surface SFML soit redimensionné est de la recréer lorsque le widget est redimensionné (RenderWindow::setSize() ne donne pas l'effet souhaité, et peut freeze le programme).
void QSFMLCanvas::resizeEvent(QResizeEvent * event)
{
    QWidget::resizeEvent(event);
    sf::View lastV(RenderWindow::getView());
    RenderWindow::close();
    RenderWindow::create(reinterpret_cast<sf::WindowHandle>(winId()));
    sf::View v(RenderWindow::getView());
    v.setCenter(lastV.getCenter());
    RenderWindow::setView(v);
}

Par contre, cette façon de faire génère une grosse fuite de mémoire lors du redimensionnement, comme si la surface précédente n'est pas détruite.
Comment éviter cette fuite ?

Merci

nico

7
Graphique / [Résolu] Texture qui dépasse.
« le: Juillet 27, 2014, 12:47:07 pm »
Bonjour,

J'ai aujourd'hui un petit problème avec les textures d'une map.
Pour certaines positions, des lignes de couleurs apparaissent, qui correspond aux textures qui se situent en dessous sur la planche.

(le petit carré bleu, c'est une entité).
Ici, la caméra est centrée sur l'entité, quand elle est centrée sur la map, c'est l'entité qui à ces lignes.
J'ai essayé de réduire la taille prise sur la texture, les lignes disparaissent bien, mais je perd aussi une ligne sur mon objet dessiné.
J'ai aussi essayé de ne placer l'entité qu'en positions entière, j’obtiens le même résultat.

Ma map est dessiné grâce a un sf::VertexArray, les entités via des sf::Sprite.

Savez vous comment éviter cet effet ?

Merci

8
Réseau / listener
« le: Octobre 31, 2013, 11:06:19 am »
Bonjour

Je commence a utiliser le module réseau.
Je vois que l'on a rien pour refuser la connexion d'un socket sur le listener (en tcp), peut on le faire d'une autre façon ?
Par exemple, si l'ip est banni du serveur, ou encore lorsque le serveur est plein.

Merci

Nico

9
Système / Thread et destruction de l'objet
« le: Septembre 22, 2013, 12:29:51 pm »
Bonjour,

J'essaye de réaliser un petit bomberman.

Pour l'explosion des bombes, j'utilise des threads pour pouvoir les animer.

A la fin de l'animation, et donc du thread, j'ai besoin de supprimer cette bombe.
Je les crée dynamiquement, et donc je doit gérer leur destruction.

Voici les codes (raccourcis)
//Le thread appelé pour animer la bombe
void Bombe::boomThread()
{
// ....
    sf::sleep(sf::milliseconds(DELAY_EXPLODE));
    m_map->delBombe(this);
}
 
//suppression de la bombe
void Map::delBombe(Bombe *b)
{
    unsigned int i;
 
    for(i = 0 ; i < m_bombes.size() ; ++i)
        if(b == m_bombes[i])
            break;
 
    if (i == m_bombes.size())
        return;
 
    delete m_bombes[i]; // ca plante ici
 
    for(unsigned int j = i ; j < m_bombes.size() - 1 ; ++j)
        m_bombes[j] = m_bombes[j + 1];
 
    m_bombes.pop_back();
}

Je suis sur que la bombe a été créé dynamiquement, donc je peut appeler delete.
Par contre celui-ci est appelé par le thread qui dépend de cette même bombe.

Comment faire quelque chose de similaire, sans que le delete soit appelé dans le thread ?

Merci

Nico

10
Graphique / Text et Color
« le: Septembre 05, 2013, 01:16:06 pm »
Bonjour

J'aimerais savoir si il est possible de donner plusieurs couleurs a un texte.
Il y a le setColor (const Color &color) mais la couleur est unie sur tout le texte, et rien n'indique dans la doc si il est possible de donner plus d'une couleur a un Text.

Merci

11
Graphique / Crash sur un font.loadFromFile
« le: Août 20, 2013, 09:08:02 pm »
Bonjour

Je me suis lancé  depuis peux dans la sfml.
Tout fonctionnait correctement, mais je me retrouve aujourd'hui face a un problème un peut bizarre.

Une police est chargée plusieurs fois, suivant ce que l'on fait dans le programme.
Le programme crash sur le chargement de celle-ci, sur le 3e, 4e .... chargement.

Font font;
if(! font.loadFromFile("font.ttf")) //crash
{
    std::cout << "Erreur : impossible de charger font.ttf" << std::endl;
    exit(EXIT_FAILURE);
}

Je n'ai aucun  retour non plus dans la console.

merci

Pages: [1]
anything