:: PlayerAdvance.org ::  

Précédent   :: PlayerAdvance.org :: > :: Forums Hébergés :: > OldSchool Library > Aide au développement

Aide au développement Aide sur l'utilisation d'OSLib

Publicité

Réponse
 
Outils de la discussion Modes d'affichage
Vieux 13/01/2008, 14h59   #1
Mia
Membre
 
Date d'inscription: 24/02/2006
Localisation: Brême
Messages: 39
Par défaut Problème : oslGetImagePixel sur une image dessinée dynamiquement

J'ai un petit souci avec la fonction oslGetImagePixel, qui ne renvoie pas ce ce que j'attends quand je l'appelle sur une image construite dynamiquement à partir d'autres images.

Voici un exemple pour illustrer mon problème :

J'ai 2 images :



Je veux dessiner la 2e image sur la 1ere (le background) avec la couleur transparente (255, 0, 255) pour donner quelque chose comme ça :



C'est sur cette image finale que j'appelle les oslGetImagePixel.

Voici le code de l'exemple :

Code PHP:
// The main library OSLib
#include <oslib/oslib.h>

// Callbacks
PSP_MODULE_INFO("TestGetPixel"011);
PSP_MAIN_THREAD_ATTR(THREAD_ATTR_USER THREAD_ATTR_VFPU);
 
int main()
{
  
// Init OSLib
  
oslInit(0);
  
// Init graphic mode
  
oslInitGfx(OSL_PF_88881);
  
// Set alpha color
  
oslSetTransparentColor(RGB(255,0,255));
  
  
char l_line[128];
  
  
// Coordinates of the cursor
  
int l_x(20);
  
int l_y(20);
  
  
// Load images
  
OSL_IMAGE l_background oslLoadImageFile("res/background.png"OSL_IN_RAMOSL_PF_5551);
  
OSL_IMAGE l_image oslLoadImageFile("res/image.png"OSL_IN_RAMOSL_PF_5551);
  
OSL_IMAGE l_final oslCreateImage(480272OSL_IN_VRAMOSL_PF_5551);
  
  
l_image->173;
  
l_image->90;

  
  
// Main loop
  
while (!osl_quit)
  {
    
oslReadKeys();
    
    
// Move cursor if requested
    
if (osl_keys->pressed.rightl_x += 10;
    else if (
osl_keys->pressed.leftl_x -= 10;
    else if (
osl_keys->pressed.downl_y += 10;
    else if (
osl_keys->pressed.upl_y -= 10;

    
oslStartDrawing();
    
    
// Build the image to display
    // Copy the background
    
oslCopyImageTo(l_finall_background);
    
// Draw l_image on l_final with transparent color = (255, 0, 255)
    
oslSetDrawBuffer(l_final);
    
oslSetAlphaWrite(OSL_FXAW_SET2550);
    
oslSetAlphaTest(OSL_FXAT_GREATER0);
    
oslDrawImage(l_image);
    
oslSetDrawBuffer(OSL_DEFAULT_BUFFER);

    
// Draw final image
    
oslDrawImage(l_final);
    
// Draw cursor
    
oslDrawRect(l_x 2l_y 2l_x 2l_y 2RGB(25500));
    
// Display color value of the selected pixel
    
sprintf(l_line"%d"oslGetImagePixel(l_finall_xl_y));
    
oslDrawString(1010l_line);
    
oslUncacheImage(l_final);
    
    
oslEndDrawing();

    
// Wait for frame
    
oslSyncFrame();
  }
  
  
// Quit the program
  
oslEndGfx();
  
oslQuit();
  return 
0;

En gros, je crée une image "l_final" en VRAM, et à chaque frame je copie le background "l_background" dessus, et je dessine ensuite mon 'U' inversé "l_image" dessus avec la transparence.

Le curseur déplaçable permet d'afficher la valeur oslGetImagePixel() du pixel sélectionné.

Le problème, c'est que quand je positionne le curseur sur le 'U' inversé, je m'attends à avoir toujours la valeur 32768 (noir), sauf que ce n'est pas toujours le cas :
selon la position du curseur sur le U, j'obtiens parfois le noir attendu, mais parfois la couleur grise du fond (58136), et parfois la bonne couleur mais juste le temps d'une frame, avant que ça repasse à gris. Dans ce dernier cas, le noir revient de temps en temps mais jamais plus longtemps qu'une frame.

Une idée du problème ? Une erreur avec le cache ? Avec la construction de l'image ?
__________________
Mia est déconnecté   Réponse avec citation

Publicité

Vieux 13/01/2008, 15h10   #2
Brunni
Super Modérateur
 
Date d'inscription: 10/11/2005
Localisation: Un pays avec beaucoup de banques
Messages: 3 226
Par défaut

Non c'est normal, le GPU travaille en parallèle, donc toi tu lances ton dessin avec oslDrawImage, mais au moment où tu fais oslGetImagePixel il n'a pas forcément terminé de dessiner l'image sur l'arrière plan, c'est pour ça que tu auras parfois du gris (pas encore fini) parfois du noir (si terminé).
Pour éviter ce problème tu peux mettre un oslSyncDrawing avant de lire le pixel, cela attendra que le GPU ait fini tout ce qu'il devait faire jusque là (tu es donc assuré que l'image est bien construite). Bien sûr, tu vas perdre en vitesse du coup, vu que tu ne profites pas du parallélisme entre le GPU et le CPU.

Dernière modification par Brunni ; 13/01/2008 à 15h13.
Brunni est déconnecté   Réponse avec citation
Vieux 13/01/2008, 15h31   #3
Mia
Membre
 
Date d'inscription: 24/02/2006
Localisation: Brême
Messages: 39
Par défaut

Ok, je comprends mieux.
Merci pour ta réponse rapide et efficace !
__________________
Mia est déconnecté   Réponse avec citation
Réponse

Liens sociaux

Publicité



Utilisateurs regardant la discussion actuelle : 1 (0 membre(s) et 1 invité(s))
 
Outils de la discussion
Modes d'affichage

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 18h14.


Édité par : vBulletin® version 3.7.2
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Tous droits réservés.
Version française #16 par l'association vBulletin francophone
Design par Ass-Itch, DJP et Dr.Vince