Bonjour,
Voici donc le sujet de rapport de bug pour l'affichage des sf::ConvexShape sur les cartes ATI.
Beaucoup de dégradés réalisés avec des sf::ConvexShape ne s'affichent pas correctement sur les cartes ATI.
J'ai a ma disposition pour le test des cartes Nvidia et des cartes ATI, le rendu est pareil pour les cartes de la même marque.
En revanche, il y a des différences de rendu entre les cartes Nvidia et les cartes ATI.
Quand je dis ATI, entendez ATI/AMD.
J'ai fait un certain nombre de captures d'écran, j'en poste que quelques unes (petites) ici, les autres je les met sous forme de lien.
Les captures de la carte Nvidia dans ce test seront prises sur une Nvidia GT 220 depuis Ubuntu 12.04 LTS 64bits.
Les captures de la carte ATI dans ce test seront prises sur une ATI Mobility Radeon HD 4570 depuis Ubuntu 12.04 LTS 64bits.
Exemple d'un bouton affiché normalement sur une carte Nvidia:
(http://dl.smglive.org/FJ_1351431724.8102_View)
(Les trucs verts sont des particules en mouvement, ignorez les, ça fait moche sur la capture, mais dans le jeu c'est joli grâce a l'effet de mouvement..)
Le même bouton sur la carte ATI:
(http://dl.smglive.org/FJ_1351431782.3929_View)
Le bouton central est un sprite, le texte est un sf::Text et l'effet de surbrillance est 4 sf::ConvexShape.
Voilà, plutôt que de vous passer pleins de liens, autant vous passer une archive contenant toutes les captures. (2 dossiers, un ATI, un Nvidia)
Vous constaterez que pour les mêmes images, des fois les cartes ATI affichent correctement, ou presque correctement les sf::ConvexShape, et sinon la plupart du temps ça fait un rendu hyper mauvais.
http://s2.smglive.org/SMG_RPG/ConvexShapeATI-Nvidia.7z
Aussi, j'ai d'autres informations qui pourraient êtes utiles, lorsque le jeu quitte sur une carte Nvidia, tout va bien, mais sur une carte ATI:
Program received signal SIGSEGV, Segmentation fault.
0x00007ffff4a2cc58 in XQueryExtension ()
from /usr/lib/x86_64-linux-gnu/libX11.so.6
(gdb) bt
#0 0x00007ffff4a2cc58 in XQueryExtension ()
from /usr/lib/x86_64-linux-gnu/libX11.so.6
#1 0x00007ffff4a20c55 in XInitExtension ()
from /usr/lib/x86_64-linux-gnu/libX11.so.6
#2 0x00007ffff3ed502b in XextAddDisplay ()
from /usr/lib/x86_64-linux-gnu/libXext.so.6
#3 0x00007ffff4d6a119 in ?? () from /usr/lib/fglrx/libGL.so.1
#4 0x00007ffff4d60b42 in ?? () from /usr/lib/fglrx/libGL.so.1
#5 0x00007fffffffe050 in ?? ()
#6 0x00007ffff4dc38b1 in ?? () from /usr/lib/fglrx/libGL.so.1
#7 0x00007fffffffe050 in ?? ()
#8 0x00007ffff7de992d in ?? () from /lib64/ld-linux-x86-64.so.2
Backtrace stopped: previous frame inner to this frame (corrupt stack?)
Notez que j'utilise les pilotes propriétaires Nvidia et ATI sur les cartes graphiques, les pilotes libres ne savent pas encore lancer de jeux comme ça.
Merci :)
Bon, alors j'ai repris le code source de mon jeu, je l'ai juste adapté pour qu'il soit minimal: le code qui fait l'effet de surbrillance:
#include <iostream>
#include <SFML/Graphics.hpp>
using namespace std;
sf::Texture Degrade_Blanc_Droite, Degrade_Blanc_Gauche, Degrade_Blanc_Bas, Degrade_Blanc_Haut;
void displaySurBrillance(sf::Vector2f Position, sf::Vector2f Size, sf::RenderWindow& App)
{
int X(Position.x), Y(Position.y);
int SX(Size.x), SY(Size.y);
sf::ConvexShape LeftShape;
LeftShape.setPosition(X, Y);
LeftShape.setPointCount(4);
LeftShape.setPoint(0, sf::Vector2f(0, 0));
LeftShape.setPoint(1, sf::Vector2f(0, SY));
LeftShape.setPoint(2, sf::Vector2f(-10, SY + 10));
LeftShape.setPoint(3, sf::Vector2f(-10, -10));
LeftShape.setTexture(&Degrade_Blanc_Droite);
sf::ConvexShape RightShape;
RightShape.setPosition(X, Y);
RightShape.setPointCount(4);
RightShape.setPoint(0, sf::Vector2f(SX, 0));
RightShape.setPoint(1, sf::Vector2f(SX + 10, -10));
RightShape.setPoint(2, sf::Vector2f(SX + 10, SY + 10));
RightShape.setPoint(3, sf::Vector2f(SX, SY));
RightShape.setTexture(&Degrade_Blanc_Gauche);
sf::ConvexShape UpShape;
UpShape.setPosition(X, Y);
UpShape.setPointCount(4);
UpShape.setPoint(0, sf::Vector2f(0, 0));
UpShape.setPoint(1, sf::Vector2f(-10, -10));
UpShape.setPoint(2, sf::Vector2f(SX + 10, -10));
UpShape.setPoint(3, sf::Vector2f(SX, 0));
UpShape.setTexture(&Degrade_Blanc_Bas);
sf::ConvexShape DownShape;
DownShape.setPosition(X, Y);
DownShape.setPointCount(4);
DownShape.setPoint(0, sf::Vector2f(0, SY));
DownShape.setPoint(1, sf::Vector2f(-10, SY + 10));
DownShape.setPoint(2, sf::Vector2f(SX + 10, SY + 10));
DownShape.setPoint(3, sf::Vector2f(SX, SY));
DownShape.setTexture(&Degrade_Blanc_Haut);
App.draw(LeftShape);
App.draw(RightShape);
App.draw(UpShape);
App.draw(DownShape);
}
int main(int argc, char *argv[])
{
sf::RenderWindow App(sf::VideoMode(1024, 768, 32), "Test sf::ConvexShape");
sf::Image White_Haut, White_Bas, White_Droite, White_Gauche;
int W(255);
White_Haut.create(255, 255, sf::Color(0, 0, 0));
for(unsigned int Y(0); Y < 255; ++Y)
{
for(unsigned int X(0); X < 255; ++X)
{
White_Haut.setPixel(X, Y, sf::Color(W, W, W, W));
}
--W;
}
Degrade_Blanc_Haut.create(255, 255);
Degrade_Blanc_Haut.update(White_Haut);
White_Bas.create(255, 255, sf::Color(0, 0, 0));
for(unsigned int Y(0); Y < 255; ++Y)
{
for(unsigned int X(0); X < 255; ++X)
{
White_Bas.setPixel(X, Y, sf::Color(Y, Y, Y, Y));
}
}
Degrade_Blanc_Bas.create(255, 255);
Degrade_Blanc_Bas.update(White_Bas);
White_Droite.create(255, 255, sf::Color(0, 0, 0));
for(unsigned int X(0); X < 255; ++X)
{
for(unsigned int Y(0); Y < 255; ++Y)
{
White_Droite.setPixel(X, Y, sf::Color(X, X, X, X));
}
}
Degrade_Blanc_Droite.create(255, 255);
Degrade_Blanc_Droite.update(White_Droite);
White_Gauche.create(255, 255, sf::Color(0, 0, 0));
W = 255;
for(unsigned int X(0); X < 255; ++X)
{
for(unsigned int Y(0); Y < 255; ++Y)
{
White_Gauche.setPixel(X, Y, sf::Color(W, W, W, W));
}
--W;
}
Degrade_Blanc_Gauche.create(255, 255);
Degrade_Blanc_Gauche.update(White_Gauche);
App.setFramerateLimit(60);
while(App.isOpen())
{
App.clear(sf::Color(0, 0, 0));
if(sf::Keyboard::isKeyPressed(sf::Keyboard::Escape))
{
App.close();
}
displaySurBrillance(sf::Vector2f(200, 300), sf::Vector2f(200, 60), App);
App.display();
}
return 0;
}
Alors, a ma plus grande surprise: Sur la carte ATI ça fonctionne très bien, et je n'ai pas d'erreur de segmentation a la fin du programme... :o
Le problème que j'ai maintenant c'est que ce même code fait des rendus horribles dans mon jeu.
Et malgré que le code minimal fonctionne, y a quand même un problème quelque part qu'il serait bon de corriger :)
J'ai ré-essayé un jeu SFML1.6 sur les drivers ATI actuels, et je n'ai pas de bug non plus (pour ce jeu en tout cas).
J'ai ré-essayé mon jeu complet en SFML2.0 RC, et le codé présenté ci-dessus fait des affichages horribles avec l'erreur de segmentation présentée dans le premier post... (et ce n'est pas tout, tout le jeu est affiché comme je l'ai déjà montré..)
Y a t-il un lien possible entre le bug graphique et le fait que mes jeux sont des interfaces Qt dans lequel tournent le rendu de la SFML?
→ J'ai repris quasiment tel quel que QSFMLCanva pour la SFML 2.0, j'ai juste modifié les fonctions qui n'existaient plus pour la SFML, et rajouté des namespaces là où les fonctions Qt et SFML ont le même nom.
(Oui, en fait, il faut savoir que le passage des majuscules au minuscules pour les fonctions engendre les problèmes au niveau des noms, Qt a déjà des fonctions qui portent un certain nom, et la SFML a des fonctions qui portent des fois le même nom a cause du changement de majuscule en minuscule)
N'y aurait-il pas une fonction a rajouter, où un paramètre a changer pour la compatibilité SFML 2.0 / Qt?
Ce que je ne comprends pas, c'est que des fois ça marche très bien et des fois ça bug au possible, et des fois pour le même sf::ConvexShape il suffit de changer un peu la taille et il passe de "imbuvable" a normal et inversement: C'est le cas des barres de vies, quand elle est presque pleine, dans certains cas (1 fois sur 10) elle fonctionne et pareil si elle est presque vide, mais entre les 2 elle bug :o
Merci :)
PS: Et je ne vois vraiment pas ce qui peut clocher dans le code source étant donné que sur la carte Nvidia tout fonctionne correctement...
EDIT: Je fais des tests sur un code minimal qui propose 2 options:
Soit un rendu simple, soit un rendu dans Qt.
Pour l'instant j'ai la même chose sur les rendu Qt et simples, et sur les 2 cartes graphiques.
Je remarque bien le bug des carrés autour du texte dès que celui-ci grossi un peu.
Je cherche la combinaison qui permet de faire le bug sur un sf::ConvexShape....
EDIT2: Ayant la même chose, j'ai tenté de sauver les textures générées pour les sf::ConvexShape (au cas où le bug vienne de là..), j'ai donc convertit la texture en sf::Image a sa création et l'ai sauvé.
J'en ai sauvé une quinzaine comme ça, sur Nvidia et ATI.
Euh, je ne pense pas que ça vienne de ce fait, mais j'ai pu jouer normalement au jeu sur mon PC portable.
J'ai quand même eut des bugs de texte (les carrés autours des lettres) plus importants que sur ma carte Nvidia mais c'était correct.
J'ai relancé plusieurs fois, pas de bug.
ça a l'air d'être un phénomène assez passager. (mais bien présent, et bien fréquent, et ça ne touche pas que mon PC, mais aussi quelques autres PC avec une carte ATI sur lesquels j'ai lancé le jeu, tous les autres avec une carte Nvidia n'ont aucuns problèmes...)
D'autant plus que le jeu fait toujours une erreur de segmentation quand il quitte sur la carte ATI... (et vous pouvez regarder au dessus, ça plante en plein dans les pilotes graphiques..)