Voir la version complète : Transparence (.fx)
Salut !
Je suis pas doué avec les .fx et donc en ce moment j'apprend, et oui c'est la new tech donc autant apprendre :)
Bref, j'ai réussi a faire une texture cubeMAP, ca marche nikel mais voila maintenant je voudrais faire que avec cet effet, il y a un deuxieme effet : la transparence.
Je pense pas que c'est difficile a faire :/
Donc ma question :
Comment faire de la transparence avec le .fx ?
Merci
Mickael
(Effect Edit est bien mais pourrais etre mieux :00000013: )
Tu veux faire de la transparence... De quoi, sur quoi, dans quoi, avec quoi ?
Bref un peu de précisions (avec pourquoi pas le code du .fx que tu as déjà écrit) sera bienvenu.
Lightness1024!
28/07/2005, 18h06
c quoi .fx ?
Ce sont les fichiers DirectX qui permettent de coder des effets. On peut y mettre du shader (ASM ou HLSL), coder avec une syntaxe sympa le comportement du FFP, et diviser le rendu en "techniques" et en "passes". Après y a l'interface DirectX qui va bien pour manipuler tout ça dans ton code.
Un exemple pris au pif dans le SDK :
//-----------------------------------------------------------------------------
// File: SkyBox.fx
//
// Desc:
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// Global variables
//-----------------------------------------------------------------------------
float4x4 g_mInvWorldViewProjection;
texture g_EnvironmentTexture;
sampler EnvironmentSampler = sampler_state
{
Texture = (g_EnvironmentTexture);
MipFilter = POINT;
MinFilter = POINT;
MagFilter = POINT;
};
//-----------------------------------------------------------------------------
// Skybox stuff
//-----------------------------------------------------------------------------
struct SkyboxVS_Input
{
float4 Pos : POSITION;
};
struct SkyboxVS_Output
{
float4 Pos : POSITION;
float3 Tex : TEXCOORD0;
};
SkyboxVS_Output SkyboxVS( SkyboxVS_Input Input )
{
SkyboxVS_Output Output;
Output.Pos = Input.Pos;
Output.Tex = normalize( mul(Input.Pos, g_mInvWorldViewProjection) );
return Output;
}
float4 SkyboxPS( SkyboxVS_Output Input ) : COLOR
{
float4 color = texCUBE( EnvironmentSampler, Input.Tex );
return color;
}
technique Skybox
{
pass p0
{
VertexShader = compile vs_2_0 SkyboxVS();
PixelShader = compile ps_2_0 SkyboxPS();
}
}
Lightness1024!
28/07/2005, 20h32
ok, je connais pas ce domaine de DX.
sinon pour la transparence, la méthode classique c'est simplement de changer les renderstates entre les drawprimitive que l'on veut avoir transparente.
attention au zbuffer cependant, il faut le désactiver quand on dessine les objets transparents, et bien sur, les dessiner en tout premier.
voila les parametres qu'apres des jours de prise de tete j'ai enfin compris qu'il fallait pour activer une belle transparence:
pDevice->SetRenderState (D3DRS_ALPHABLENDENABLE, TRUE);
pDevice->SetRenderState (D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
pDevice->SetRenderState (D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
pDevice->SetRenderState (D3DRS_ZENABLE, FALSE);
pDevice->SetRenderState (D3DRS_TEXTUREFACTOR, D3DCOLOR_ARGB(210, 128, 128, 128));
pDevice->SetTextureStageState (0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
pDevice->SetTextureStageState (0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE);
pDevice->SetTextureStageState (0, D3DTSS_ALPHAARG2, D3DTA_TFACTOR);
évidemment la couleur de masque texturefactor n'estpas forcément grise.
mais en tout cas c'est pratique si on veut rajouter une couleur de masque, la valeur alpha est prise en compte elle aussi.
quand on rend avec ce mode la, les textures a channel alpha comme les .png sont pris en compte.
grob1212
02/08/2005, 10h36
Je travaille sur un projet de jeu qui n'utilise quasiment que l'interface Effect. Celle-ci se révèle être extrêmement puissante puisqu'elle permet de détacher complêtement le code source des effets visuels du code source du programme, pour une baisse assez peu sensible du framerate (pourvu que le jeu soit correctement pensé).
Comme l'a dit plus haut Lightness1024!, la transparence s'obtient en changeant quelques renderstates du pipeline graphique. L'avantage des "Effects" est qu'ils permettent de changer les render states à l'intérieur du fichier .fx sans modifier le code source du programme.
En reprenant l'exemple de Lightness1024!, on avait :
pDevice->SetRenderState (D3DRS_ALPHABLENDENABLE, TRUE);
pDevice->SetRenderState (D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
pDevice->SetRenderState (D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
pDevice->SetRenderState (D3DRS_ZENABLE, FALSE);
....
qui se peut s'écrire dans le fichier effet comme (ou quelque chose du genre, car je l'écris de mémoire sans consulter la doc, donc excusez-moi s'il y a des erreurs) :
technique TransparentObject
{
pass P0
{
AlphaBlendEnable = true;
SrcBlend = SRCALPHA;
DstBlend = INVSRCALPHA;
ZEnable = false;
....
Ca simplifie donc énormément le travail, car c'est l'effet qui se charge des appels à l'API.
Je n'ai pas encore regardé l'exemple sur le management des renderstates, mais il me semble que l'on peut obtenir quelquechose d'encore plus efficace en utilisant les 'state block'.
ShadowTzu
05/08/2005, 09h44
vous n'auriez pas des sites à me conseiller pour apprendre le hlsl ?
Merci.
grob1212
05/08/2005, 12h20
Rien qu'en saisissant hlsl sous google, il y a énormément d'informations sur l'apprentissage de ce langage.
Si l'anglais ne te rebutte pas, il y a l'excellent tutorial de Craig Pepper et Jason L Mitchell, grace auquel j'ai appris HLSL. Je viens également de voir qu'il existe un livre également en anglais (écris par st laurent sebastien et wolfgang engel) qui traite du framework effect et du langage HLSL (je vais l'acheter et j'en dirais des nouvelles plus tard).
vBulletin® v.3.6.5, Copyright ©2000-2009, Jelsoft Enterprises Ltd. Tous droits réservés - Version française vbulletin-fr.org