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.


Messages - nico69

Pages: [1] 2 Suivante »
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 / Re : sf::font smooth
« le: Mai 19, 2016, 09:22:29 pm »
Bonjour,
Après plusieurs tests, je vois que la création de texture a la volée à chaque fois que j'ai besoin de dessiner donne des performances assez dégueulasse.
A part faire comme cela, ou doubler la résolution de toutes les assets (et adapter le code) pour supprimer le zoom, y a t'il une autre solution pour éviter le smooth des texte ?

Modifier et recompiler SFML ?

5
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

6
Graphique / Re : sf::Quads déprécated ?
« le: Juin 07, 2015, 02:15:23 pm »
Merci pour la précision :D . Je ne vais pas déployer mon programme sur mobile, donc de ce coté la pas de probleme.

Vu que cette fonctionnalité est deprecated, il faudrait modifier le tuto sur les vertexarray pour éviter de donner une mauvaise pratique aux débutants.

7
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

8
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

9
Graphique / Re : Texture qui dépasse.
« le: Juillet 27, 2014, 04:48:35 pm »
En effet, c’était bien un problème de décimales, mais je cherchais pas au bon endroit.
J'avais bien mis les entités en position entière (sa position est en float, mais il y a un cast au moment du dessin)
Du coup, vu que la position est a virgule, ba celle ci s'ajoute sur la vue.

Du coup, il n'y a plus de problèmes maintenant  :D

10
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

11
Réseau / Re : listener
« le: Octobre 31, 2013, 09:24:27 pm »
Ok merci

12
Réseau / Re : listener
« le: Octobre 31, 2013, 01:58:08 pm »
Je ne sait pas, je pensai qu'il était possible de refuser tout court le socket.
D’ailleurs ça serais logique, si on peut accepter la connexion, on devrais pouvoir la refuser.

13
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

14
Système / Re : Thread et destruction de l'objet
« le: Septembre 22, 2013, 08:01:22 pm »
oui pas faux.

Merci beaucoup, je vais faire comme ça.

15
Système / Re : Thread et destruction de l'objet
« le: Septembre 22, 2013, 07:26:58 pm »
J'aurais trouvé ça plus simple et trivial de faire comme ça (même si dans ce cas la c'est un peut problématique).
La bombe est instanciée, puis elle se débrouille d'elle même, sans avoir besoin d'un appelle extérieur pour update son état.

Il faudrait faire comment ?
A chaque tour de la boucle, appeler une fonction d'update et lui donnant le temps écoulé depuis le précédent appel (ou un instant x) et check si elle est "encore en vie" ?

Pages: [1] 2 Suivante »