Author Topic: Rebonjour !  (Read 5984 times)

0 Members and 1 Guest are viewing this topic.

Arsenik

  • Associate
  • Posts: 9
Rebonjour !
« on: May 02, 2006, 03:26:55 PM »
Rebonjour ! Je n'ai toujours pas réussi à résoudre mon problème mais ayant plusieur machine chez moi je code pas mal sur Hypeion en ce moment et je dois dire que c'est vraiment impressionnant ce que vous avez réussi à faire...

Par contre, j'ai pas réussi à gérer la transparence de mes mesh. Voici mon shader, il n'a pour but que de colorier un objet en rouge transparent :

Quote

[Vertex_Shader]

void main(void){
   gl_Position = ftransform();
}

[Pixel_Shader]

void main (void){
   gl_FragColor = vec4(1.0, 0.0, 0.0, 0.2);
}


Mais ça marche pas des masses :p Quelqu'un a une idée ?
Sinon, encore bvravo pour l'aide qui est très complète.
Bye !

JeGX

  • Global Moderator
  • Capo Crimine
  • *****
  • Posts: 2385
    • oZone3D.Net
Rebonjour !
« Reply #1 on: May 02, 2006, 05:10:18 PM »
Le code ton shader est parfaitement bon. Il suffit juste d'activer le blending avec les bons paramètres pour que la valeur alpha soit prise en compte. Le mélange des couleurs ou blending est une opération qui se situe après le pixel shader. La carte 3D doit savoir quoi faire avec les couleurs des pixels qui sortent du pixel shader. Le blending sert justement à ça.

Concrétement, rajoute l'élément blending dans ton node mesh:
Code: [Select]

<mesh name="mesh_plane" polygon_mode="SOLID" shape_type="PLANE" >
<blending_params active="TRUE"
                src_factor="BLENDING_FACTOR_SRC_ALPHA"
                 dst_factor="BLENDING_FACTOR_ONE_MINUS_SRC_ALPHA" />
</mesh>


Il reste cependant une petite subtilité due à la gestion des objets transparents. Afin d'afficher correctement les objets transparents, le moteur 3D doit savoir qu'il sont ... transparents. Pour ca il te suffit de mettre une valeur d'opacité plus petite que 1.0 dans le matériau qui est attaché au mesh. Ca donne le code suivant:

Code: [Select]

<material name="plane_mat"
          opacity="0.9"
 shader_program_name="simple_color_shader"  />

<mesh name="mesh_plane" polygon_mode="SOLID" shape_type="PLANE" >
<attach_material name="plane_mat" />
<blending_params active="TRUE"
                src_factor="BLENDING_FACTOR_SRC_ALPHA"
                dst_factor="BLENDING_FACTOR_ONE_MINUS_SRC_ALPHA" />
</mesh>


Et là tu verras apparaitre les autres objets situés derrière ton mesh.

Si tu as d'autres pb, n'hésite pas   :D

JeGX

  • Global Moderator
  • Capo Crimine
  • *****
  • Posts: 2385
    • oZone3D.Net
Re: Rebonjour !
« Reply #2 on: May 02, 2006, 05:16:17 PM »
Quote from: "Arsenik"
Rebonjour ! Je n'ai toujours pas réussi à résoudre mon problème mais ayant plusieur machine chez moi je code pas mal sur Hypeion en ce moment et je dois dire que c'est vraiment impressionnant ce que vous avez réussi à faire...


J'ai refait une petite mise à jour de la demo de test oZone3D: refait le test et envoi moi le log: oZone3D_Win32_Test_App.zip

Arsenik

  • Associate
  • Posts: 9
Rebonjour !
« Reply #3 on: May 02, 2006, 06:27:28 PM »
Oki, je test le prog dans la soirée, juste un petite dernière question pour les Shader. Lorsque j'utilise mon Shader a 1 franc, il me réalise bien la  transparence ça y est mais comment pluis-jer conserver la texture ( mais transparente quoi :p ) ?

Merci encore !

JeGX

  • Global Moderator
  • Capo Crimine
  • *****
  • Posts: 2385
    • oZone3D.Net
Rebonjour !
« Reply #4 on: May 02, 2006, 06:36:48 PM »
Pour la texture, il suffit de la gérer dans ton pixel shader.

Mais je te renvoi au mega tutoriel sur le sujet que j'ai sorti ya pas longtemps: GLSL Texturing Tutorial. Je pense que tu y trouveras de quoi régaler tes neuronnes :D

Arsenik

  • Associate
  • Posts: 9
Rebonjour !
« Reply #5 on: May 02, 2006, 07:47:25 PM »
Mici j'ai réussi, ( au fait je sais que c'est assez inutil de faire un shader de transparence alors que je pourrais le faire directement en XML mais c'était pour bien comprendre ce truc de fou que sont les Shaders !)


Pour ceux qui veulent le code ( j'endoute mais bon :p )

Quote
[Vertex_Shader]
void main(void)
{
         gl_TexCoord[0] = gl_MultiTexCoord0;
         gl_Position = ftransform();      
}

[Pixel_Shader]

uniform sampler2D colorMap;

void main (void)
{
   gl_FragColor = texture2D( colorMap, gl_TexCoord[0].xy);
   gl_FragColor.a = 0.5;
}