Auteur Sujet: [question] opengl  (Lu 345 fois)

0 Membres et 1 Invité sur ce sujet

hvmt

  • Invité
[question] opengl
« le: 31 Janvier 2012 à 18:58:07 »
salut

je voudrais essayer d'afficher une texture en mode gl_color_index (c'est pour voir, j'aimais essayé, et ça m'arrangerai pour un test sur un effet en particulier)
c'est pas très utilisé et j'ai pas trouvé grand chose.

j'ai trouvé une reponse sur le sujet ici :
http://www.gamedev.net/topic/343481-palettes-and-opengl-solved/
mais j'obtiens toujours une texture blanche.

glEnable(GL_TEXTURE_2D);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glBindTexture(GL_TEXTURE_2D, texID);
glColorTableEXT(GL_TEXTURE_2D, GL_RGBA8, 256, GL_RGBA, GL_UNSIGNED_BYTE,
palette);
glTexImage2D(GL_TEXTURE_2D, 0, GL_COLOR_INDEX8_EXT, width, height, 0,
GL_COLOR_INDEX, GL_UNSIGNED_BYTE, texture);

où est l'erreur ?!?  quels sont les formats à utiliser pour l'image et les couleurs, erreurs dans les types ?
pour l'image c'est une 256 couleurs indéxées, sauvegardée au format RAW dans un tableau unsigned char indiquant l'indice de couleur pour chaque pixel.
et la palette j'ai essayé en unsigned char, GLubyte. Mais dans l'exemple il indique palette
  • .r, palette
  • .g, palette
  • .b, palette
  • .a  : faut-il creer une structure (r,g,b,a) ou le format existe-t-il déjà ?


merci

Hors ligne Patapom

    • Voir le profil
    • www.patapom.com
  • Ancienneté: 1988
  • Groupe: Bomb!
  • Rôle: Coder
  • Ville: Lyon
Re : [question] opengl
« Réponse #1 le: 31 Janvier 2012 à 19:16:28 »
Hi !

J'm'y connais pas des masses en OpenGL mais ça ressemble beaucoup au problème que j'avais eu sur les textures et les samplers.
T'es sûr que "palette", c'est pas un ID de texture 1D (256x1) au format RGBA plutôt qu'un pointeur sur un tableau RGBA[256] ??
.  Pom  .

hvmt

  • Invité
Re : [question] opengl
« Réponse #2 le: 31 Janvier 2012 à 19:34:49 »
ah? alors là...
je debute, et j'ai rien trouvé à ce propos.
y a meme pas un exemple quelque part de code utilisant color_index.  :o
comment faire avec une texture1D ?

Hors ligne Patapom

    • Voir le profil
    • www.patapom.com
  • Ancienneté: 1988
  • Groupe: Bomb!
  • Rôle: Coder
  • Ville: Lyon
Re : [question] opengl
« Réponse #3 le: 31 Janvier 2012 à 19:51:50 »
Non j'dis des conneries, c'est bien un pointeur vers RGBA[256]...
T'as essayé de faire un glGetError après l'appel de glColorTableEXT() pour voir s'il s'est pas mélangé les pinceaux ?

Sinon sur cette page : http://msdn.microsoft.com/en-us/library/dd318814(v=vs.85).aspx
Y a l'air d'avoir une magouille cheulou sur le paramètre "format" quand tu utilises GL_RGBA. Tu as essayé avec GL_RGBA_EXT pour voir ?
.  Pom  .

Hors ligne Patapom

    • Voir le profil
    • www.patapom.com
  • Ancienneté: 1988
  • Groupe: Bomb!
  • Rôle: Coder
  • Ville: Lyon
Re : [question] opengl
« Réponse #4 le: 31 Janvier 2012 à 19:58:56 »
Et puis sur ce forum http://www.opengl.org/discussion_boards/ubbthreads.php?ubb=showflat&Number=177250 y a un type qui dit :
>>> I tested supported extensions with a little software : glview.exe and it reports that GL_EXT_PALETTED is not supported

Donc vérifie que c'est bien supporté avant de trop te prendre le chou. ;D
.  Pom  .

Hors ligne MsK`

    • Pouet.net
    • Voir le profil
  • Rôle: Code
  • Ville: Paris/RP
Re : [question] opengl
« Réponse #5 le: 31 Janvier 2012 à 20:00:24 »
gdebugger est ton ami mais il me semble que les GL_COLOR_INDEX c'est vieux de chez ultra vieux et pas vraiment supporté...

hvmt

  • Invité
Re : [question] opengl
« Réponse #6 le: 31 Janvier 2012 à 22:23:09 »
ah merdum
gl_ext_paletted n'est pas supporté
bon bin dommage... c'etait plus dans la logique. une image avec peu de couleurs pour changer de palette telles lignes.

Hors ligne Patapom

    • Voir le profil
    • www.patapom.com
  • Ancienneté: 1988
  • Groupe: Bomb!
  • Rôle: Coder
  • Ville: Lyon
Re : [question] opengl
« Réponse #7 le: 31 Janvier 2012 à 22:30:31 »
Bon en même temps, c'est pas étonnant. C'est comme les constructeurs qui continueraient à supporter le rendu en pipeline fixe : avec les shaders ça sert plus à rien.

Tu peux facilement obtenir la même chose en créant une texture 1D contenant ta palette, puis aller chercher la couleur dedans en fonction d'une valeur que tu relis d'une texture 2D monochrome...
C'est pour quel usage en fait ? Si c'est juste par curiosité comme tu le disais en début de post, bah maintenant tu sais que c'est pas possible autrement que par un shader. Mais y a plein d'autres choses sur lesquelles porter ta curiosité ! ;D
.  Pom  .

hvmt

  • Invité
Re : [question] opengl
« Réponse #8 le: 31 Janvier 2012 à 23:43:40 »
j'ai bien pensé aux shaders, mais bon c'est l'artillerie lourde, en plus je connais pas. pas que je veux pas m'en servir un jour, mais pas pour ce "petit" truc.

Tu peux facilement obtenir la même chose en créant une texture 1D contenant ta palette, puis aller chercher la couleur dedans en fonction d'une valeur que tu relis d'une texture 2D monochrome...

hmm... interessant... comment ça marcherait, si ça se trouve c'est la soluce que je cherche (pas con le monochrome). comment "relier la valeur" ? :
je copie mon image dans une texture2D GL_Luminance au lieu de RGBA
je copie les couleurs dans une texture1D GL_RGBA
euh...après je bug...avec glColor() ?

Citer
C'est pour quel usage en fait ?
bon, j'avoue tout, j'avais vu des effets sur Amiga fait avec le copper et une image de base (triangle ou cube ou sphere) : en changeant la palette toute les x lignes, ça donnait des trucs geniaux (copperscroll ou twist, scroll sur une sphere (arise 40k) ou sur un cube). Pour refaire de l'oldschool pour s'amuser, faut passer par le CPU de nos jours ou par des gros trucs comme les shaders. Pour le faire en style moderne j'y penserai, mais pour le moment je tatonne la 2d et commence un tout petit peu de 3d...
pour faire cet effet "à l'ancienne" je cherchais un autre moyen si c'etait possible.
Je l'ai déjà fait avec une image qui ne change pas de couleurs et en pointant sur les lignes de la texture, hop l'effet est là sans utiliser le cpu en "recopiant" bêtement les bonnes lignes.
Mais avec le changement de couleurs, je vois pas. ou alors glColor, mais comment trouver la bonne couleur

Y a encore plein de truc que je connais pas. Je decouvre et refais des effets plus simplement que de le faire "à l'ancienne" façon pixel par pixel.
c'est comme les stencils ou masks. Pour le moment j'ai réussi quelques trucs avec glAlphaFunc(GL_NOTEQUAL,0) ou glBlendFunc(GL_DST_COLOR,GL_ZERO); ou les operations logiques    glLogicOp(GL_XOR); glEnable(GL_COLOR_LOGIC_OP); ...
mais comment par exemple, afficher un logo "percé", contour transparent mais mettre une texture dynamique dans le "trou", en pochoir... voilà des trucs comme ça.

Hors ligne Patapom

    • Voir le profil
    • www.patapom.com
  • Ancienneté: 1988
  • Groupe: Bomb!
  • Rôle: Coder
  • Ville: Lyon
Re : [question] opengl
« Réponse #9 le: 01 Février 2012 à 01:40:23 »
Hum... Alors bon je suis pas pour la promotion du "old school" (vu que je trouve qu'il y en a déjà plus qu'assez et que plus personne ne fait de "new school"  ;D) mais je te conseillerais quand même de te taper les shaders et les Frame Buffer Objects histoire de pouvoir tout faire sans te prendre le chou.

'fin c'est mon opinion : qui peut le plus peut le moins. Si tu implémentes les shaders et les FBO alors tu peux TOUT faire. Et certainement des copper bars ! ;D

Pour ton histoire de rendu paletté, c'est pas une question de texture de luminance mais plutôt une texture 8 bits à l'ancienne, où chaque valeur stockée dans la texture renvoie à une entrée dans palette.

Sauf que si tu fais ça en shader, tu crées 2 textures :
* 1 texture 256x1 (1D) contenant les 256 couleurs de ton image
* 1 texture 2D 8bits (genre, juste Rouge par exemple) qui contient ton image (en fait, chaque pixel rouge est un index dans la 1ère texture 1D)

Et après t'as juste à écrire un shader qui fait ça :

texture1D   texPalette;
texture2D   texImage;

vec4    Fragment()
{
    float   ColorIndex = tex2D( texImage, gl_TexCoord[0] );  // Tu récupères l'index de la couleur dans ton image. Le tex2D() te renvoie une valeur normalisée entre [0,1]
    vec4   Color = tex1D( texPalette, ColorIndex );  // Et hop ! Tu lis la palette
    return Color;
}

Après, pour les histoires de logos à trous, etc. je te conseille de faire ça avec des textures en alpha (pour un fade entre le "trou" et la texture) ou simplement en clippant les pixels en dessous d'un alpha donné.

Pour les copper bars, tu peux afficher des quads mappés avec une texture "copper bar" et les animer "à l'ancienne"... Devrait pas être très compliqué.

'fin voilà, comme je disais, avec les shaders : qui peut le plus peut le moins ! Et après tu seras super content d'avoir des shaders et tu pourras faire des trucs new school ! ;D
.  Pom  .

Hors ligne ponce

    • Pouet.net
    • Coup de coeur
    • Voir le profil
    • Games from mars
  • Ancienneté: 2009
  • Groupe: aucun
  • Rôle: code
Re : [question] opengl
« Réponse #10 le: 01 Février 2012 à 20:05:31 »
Je pense qu'avec 256 passes et un stencil test tu peux faire ta palette a 0.2 FPS ! Mais comme Patapom le dit les shaders et FBO sont quand même mieux à terme. Pour juste la palette tu peux même te passer du FBO.

Hors ligne Patapom

    • Voir le profil
    • www.patapom.com
  • Ancienneté: 1988
  • Groupe: Bomb!
  • Rôle: Coder
  • Ville: Lyon
Re : [question] opengl
« Réponse #11 le: 01 Février 2012 à 20:41:17 »
Sinon, cadeau, j'ai attaché le code que j'avais écrit pour Rez pour faire du GLSL easy !
C'est tout tout petit, tu peux l'utiliser ou t'en inspirer si ça te dit.

NOTE: Désolé pour les tabulations et la mise en forme du code. C'était propre mais Rez est repassé derrière avec sa manie de tout coller de manière la plus compacte possible, histoire que ça soit bien plus difficile à lire... ;D

Utilisation:
-------------
1) Tu crées une instance statique de la classe GLSL (on va l'appeler g_GLSL)
2) Dans ton init tu appelles "g_GLSL.Init()"
3) C'est tout.

Depuis cette instance, tu peux:
----------------------------------------
1) Créer / Détruire un shader
2) Créer / Détruire un FBO (avec ou sans DepthBuffer associé)

Depuis la classe FBO tu peux:
-------------------------------------
1) Binder/UnBinder un FBO pour l'utiliser comme render target
2) Récupérer son ID pour l'utiliser comme texture en entrée de ton shader
3) L'effacer avec une couleur + Z

Depuis la classe Shader tu peux:
-----------------------------------------
1) Assigner des variables uniformes (float, float2, float3, float4, Matrix4x4, Texture)
2) Assigner des vertex attributes
3) Le mettre comme shader courant (In Use)


T'as pas besoin de cleaner, tout se fait dans le destructeur de la classe GLSL...
C'est super rikiki mais suffisamment costaud, et Rez l'a déjà utilisé dans plusieurs intros (les 3 ou 4 dernières je crois) donc preuve que ça fonctionne. ;D

Voilà, j'espère que ça te servira.


NOTE2: Ponce, je te trouve bien taquin ces derniers temps (déjà avec la texture Baladur l'autre jour) ! ;D
.  Pom  .

Re : [question] opengl
« Réponse #12 le: 01 Février 2012 à 20:47:34 »
ah cool
j'allais justement poser la question "comment on fait du glsl" !

merci

Rez est trop fort je trouve pour faire "oldschool" façon newschool
ou comme les intros d'Equinox (par Keops je crois)

(me suis planter en m'inscrivant : hvmt, pas hmvt... )
« Modifié: 01 Février 2012 à 20:51:35 par hmvt »

Hors ligne ponce

    • Pouet.net
    • Coup de coeur
    • Voir le profil
    • Games from mars
  • Ancienneté: 2009
  • Groupe: aucun
  • Rôle: code
Re : [question] opengl
« Réponse #13 le: 01 Février 2012 à 21:27:37 »
NOTE2: Ponce, je te trouve bien taquin ces derniers temps (déjà avec la texture Baladur l'autre jour) ! ;D
J'ai du boulot un peu over-the-top, pas trop le temps de faire d'autre prods que des bons mots :|

 

Dans la Réponse Rapide, vous pouvez utiliser du BBCode et des smileys comme sur un message normal, mais à partir d'une interface plus rapide d'accès.

Attention, il n'y a pas eu de réponse à ce sujet depuis au moins 30 jours.
À moins que vous ne soyez sûr de vouloir répondre, pensez éventuellement à créer un nouveau sujet.

Nom: E-mail:
Vérification:
Quel est la couleur du cheval rouge d'Henri IV ?: