HLSL Shader fx et vb net

nomadsoulnomad Messages postés 12 Date d'inscription mercredi 25 janvier 2006 Statut Membre Dernière intervention 23 juin 2006 - 17 juin 2006 à 11:15
vr3h Messages postés 164 Date d'inscription jeudi 6 mars 2003 Statut Membre Dernière intervention 9 octobre 2006 - 24 juin 2006 à 07:04
Bonjour, je recherche a effectuer des shaders dans mon jeu avec vb net express 2005 et un logiciel qui crée les shaders FX ! Le probleme est le suivant : pour des shader simple sa marche, mais dès que le shader fx contient des textures et une light , la compilation s'arrete a mesh.drawsubset(0).

- je voudrait savoir si il faut construire soit meme la light en VB ou si le fichier fx s'en charge lui meme ?
-Pareil pour les textures ,faut-t'il les charger soit meme et les appliquer sur l'object ?

Au moment de la creation du Fx dans le logiciel, il marche et peut etre appliquer sur un mesh pour en apprecier le resultat, le probleme vient donc de moi et non pas du fichier fx ! Merci de votre futur aide !

14 réponses

vr3h Messages postés 164 Date d'inscription jeudi 6 mars 2003 Statut Membre Dernière intervention 9 octobre 2006
20 juin 2006 à 14:33
Alors pour les lights, je ne me suis pas encore penché dessus, tu peux de toute facon tout coder en VB, mais je crois qu'il existe deja quelque chose qui te permet de récupérer les lights definies auprès de ton Device.
Pour ce qui est de la texture, il faut la passer au device via la methode SetTexture, et ensuite dans ton code HLSL utiliser un sampler auquel tu accèdes via les intrinsèques tex2D par exemple...

Pour ma part j'aimerai savoir comment tu fais pour le depth buffer ? j'arrive a l'utiliser mais ça reste de la "bidouille" et j'aimerai utiliser une méthode "propre" pour le remplir.
0
nomadsoulnomad Messages postés 12 Date d'inscription mercredi 25 janvier 2006 Statut Membre Dernière intervention 23 juin 2006
20 juin 2006 à 14:51
En faite moi je programme via un moteur 3d gratuit pour le developpement et payant pour le diffuser ! Ce programme n'accepte que pour l'instant directx 8! Or moi j'essay de travailler en directx9 avec les shader 3 , convertir le resultat en texture pour qu'il soit exploitable par le moteur graphique ...Donc en faite je sui un debutant en se qui concerne la programmation pure en direct x et en shader 3 !!!!! Quesque tu appelle "remplir le depth buffer" ?  


 


Au faite merci pour ta reponse mais autre question mon shader  peut utiliser plusieur texture a mettre sur un object, le probleme c'est que si j'applique la texture via le device il va aplliquer la derniere texture au device sans y mettre ou traiter les precedente !!!!! Compliquer tt sa....
0
vr3h Messages postés 164 Date d'inscription jeudi 6 mars 2003 Statut Membre Dernière intervention 9 octobre 2006
20 juin 2006 à 15:46
Pour le multitexturing, admettons que tu aies les lignes de code suivante au début :


sampler2D Texture1;


sampler2D Tex2;


sampler2D GlowTexture;


Ces 3 lignes de code HLSL définissent 3 sampler 2D auxquels tu accèdes par l'intrinsèque "tex2D". Ils sont en quelque sorte des références vers les textures passées au Device.


Pour définir le sampler "Texture1", dans ton code VB, tu fais : Device.SetTexture(0, Texture1).


Pour définir le sampler "GlowTexture", dans ton code VB, tu fais : Device.SetTexture(2, Texture3).


Et pour définir le sampler "Tex2", dans ton code VB, tu fais : Device.SetTexture(1, Texture2).


Comme tu peux le voir c'est très simple.


Pour ce qui est de mon problème de depth buffer, le problème que j'ai c'est que si je ne défini pas la sémantique DEPTH dans le PixelShader, c'est comme si il ignorait le depth buffer. Aussi j'aimerais savoir comment faire pour qu'avec un shader je puisse utiliser convenablement le depth buffer.
0
nomadsoulnomad Messages postés 12 Date d'inscription mercredi 25 janvier 2006 Statut Membre Dernière intervention 23 juin 2006
21 juin 2006 à 15:03
bha heu dans ton fichier fx tu doit avoir une ligne qui te permet d'acceurir le "world view projection" ! Tu fait toi meme le fichier fx ou c'est un logiciel qui te le fait ?
Dans mon fichier fx jai cette ligne :
               float4x4 wvp : WorldViewProjection
que j'aquiere ensuite dans mon VB ! puis apres dans mon loop de vb jai cette ligne :
   meshshader.SetValue(Tech2, Matrix.LookAtLH(

New Vector3(0.0F, 1.0F, -4.0F),
New
Vector3(0.0F, 0.0F, 0.0F),
New
Vector3(0.0F, 1.0F, 0.0F)) * Matrix.PerspectiveFovLH(1.0F, 10 / 10, 1.0F, 500.0F))

tech2 est defini dans mon vb comme :

   Public

Tech2 As
Microsoft.DirectX.Direct3D.EffectHandle = Microsoft.DirectX.Direct3D.EffectHandle.FromString(
"wvp"
)

ou wvp c'est le world view projection .... cest sa ton pb ? ou jai pas compris se que cétait le depth buffer ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
nomadsoulnomad Messages postés 12 Date d'inscription mercredi 25 janvier 2006 Statut Membre Dernière intervention 23 juin 2006
21 juin 2006 à 15:18
rectification: Dans mon fichier Fx voici mes lignes :
   texture cubeMap : Environment
<
 string ResourceName = "default_reflection.dds";
 string ResourceType = "Cube";
>;




texture fresnelTex : Environment
<
 string ResourceType = "2D";
 string function = "generateFresnelTex";
 
 float2 Dimensions = { 256.0f, 1.0f};
>;





samplerCUBE environmentMapSampler = sampler_state
{
 Texture = <cubeMap>;
 MinFilter = Linear;
 MagFilter = Linear;
 MipFilter = Linear;
};





sampler2D fresnelSampler = sampler_state
{
 Texture = <fresnelTex>;
 MinFilter = Linear;
 MagFilter = Linear;
 MipFilter = None;
};



Dans mon vb jai : 
   



Public

fresnel
As

EffectHandle = EffectHandle.FromString(

"fresnelTex"

)
puis






Textures(3) = meshshader.GetValueTexture(fresnel)

Dans mon loop jai :




device.SetTexture(1, Textures(3))



Pour l'autre texture pareil (comme tu a dit, je vait pas mettre tt mon code...) Le probleme c'est que mon teapot est rendu en noire ! Jai ajjouter une light et meme un material, tj en noire , pourqoi ?
0
vr3h Messages postés 164 Date d'inscription jeudi 6 mars 2003 Statut Membre Dernière intervention 9 octobre 2006
22 juin 2006 à 15:06
Le depth buffer est une surface, comme le back buffer, sauf que les données que contient le depth buffer ne sont pas affichées, elles sont utilisées pour savoir si le pixel qui est en train d'etre dessiné est plus proche ou plus loin que celui qui a déjà été dessiné. Ca permet d'éviter qu'un pixel caché par une autre face soit dessiné. Si tu veux je peux t'envoyer un exemple de "glow" mais qui "bug" un peu a cause du depth buffer justement...

Sinon, pour tes textures, leur déclaration a l'air bonne, c'est quoi le code de ton PixelShader ?
0
nomadsoulnomad Messages postés 12 Date d'inscription mercredi 25 janvier 2006 Statut Membre Dernière intervention 23 juin 2006
22 juin 2006 à 15:56
voici les lignes de mon pixel shader :








/********* pixel shader ********/



// modified refraction function that returns boolean for total internal reflection
float3
refract2( float3 I, float3 N, float eta, out bool fail )
{
 float IdotN = dot(I, N);
 float k = 1 - eta*eta*(1 - IdotN*IdotN);
// return k < 0 ? (0,0,0) : eta*I - (eta*IdotN + sqrt(k))*N;
 fail = k < 0;
 return eta*I - (eta*IdotN + sqrt(k))*N;
}



// approximate Fresnel function
float fresnel(float NdotV, float bias, float power)
{
   return bias + (1.0-bias)*pow(1.0 - max(NdotV, 0), power);
}



// function to generate a texture encoding the Fresnel function
float4 generateFresnelTex(float NdotV : POSITION) : COLOR
{
 return fresnel(NdotV, 0.2, 4.0);
}



float4 mainPS(vertexOutput IN,
    uniform samplerCUBE EnvironmentMap,
    uniform half reflectStrength,
    uniform half refractStrength,
    uniform half3 etas
    ) : COLOR
{
    half3 N = normalize(IN.WorldNormal);
    float3 V = normalize(IN.WorldView);
   
  // reflection
    half3 R = reflect(-V, N);
    half4 reflColor = texCUBE(EnvironmentMap, R);



// half fresnel = fresnel(dot(N, V), 0.2, 4.0);
 half fresnel = tex2D(fresnelSampler, dot(N, V));



 // wavelength colors
 const half4 colors[3] = {
     { 1, 0, 0, 0 },
     { 0, 1, 0, 0 },
     { 0, 0, 1, 0 },
 };
       
 // transmission
  half4 transColor = 0;
   bool fail = false;
    for(int i=0; i<3; i++) {
     half3 T = refract2(-V, N, etas[i], fail);
     transColor += texCUBE(EnvironmentMap, T) * colors[i];
 }



    return lerp(transColor*refractStrength, reflColor*reflectStrength, fresnel);
}



/*************/


Quand j'aplique le shader sur une teapot generer par le programe qui crée le shader sa marche , mais pas dans mon programme! Pour ton probleme je voit se que tu veut dire le pb c'est que je sui pas assez avancer pour te repondre malheuresement !
0
nomadsoulnomad Messages postés 12 Date d'inscription mercredi 25 janvier 2006 Statut Membre Dernière intervention 23 juin 2006
22 juin 2006 à 16:11
modification , pour ton probleme essay avec ces lignes :

Device.RenderState.ZBufferEnable =

True
Device.RenderState.ZBufferWriteEnable =

True
Device.RenderState.ZBufferFunction = Microsoft.DirectX.Direct3D.Compare.LessEqual
0
vr3h Messages postés 164 Date d'inscription jeudi 6 mars 2003 Statut Membre Dernière intervention 9 octobre 2006
23 juin 2006 à 10:09
Tu utilises un logiciel pour programmer ton shader ? ou quelque chose comme le bloc-note ? Il faudrait s'assurer sinon que lerp retourne bien un vecteur 4D, sinon essaye de le faire explicitement ?
0
vr3h Messages postés 164 Date d'inscription jeudi 6 mars 2003 Statut Membre Dernière intervention 9 octobre 2006
23 juin 2006 à 14:33
Désolé je me rappelais plus de la fonction "lerp".
Dans quel cas ça marche, et dans quel cas ça ne marche pas ?
La théière, tu la créés dans ton programme ou tu utilise un autre programme ? Si c'est juste dans ton programme que ça ne marche pas, il faudrait voir si tu n'as pas oublié de passer une bricole au Shader dans ton code VB comme une texture ou un truc du genre ?
0
nomadsoulnomad Messages postés 12 Date d'inscription mercredi 25 janvier 2006 Statut Membre Dernière intervention 23 juin 2006
23 juin 2006 à 15:10
Le logiciel que j'utilise c'est NVIDIA FX COMPOSER !!! J'ai charger ma texture directement comme sa:
     textures(3)=textureloader.fromfile(device,"fichier.dds")
la texture arrive a se mettre sur la teapot (generer par le code vb).
en chargant la texture comme sa :
   textures(3)=meshshader.getvaletexture(tex)     
le programme ne me met pas d'erreur ma par contre en aplliquant cette texture a l'object, il devient blanc....
tu veut que je t'envoi mon shader mes textures?
0
vr3h Messages postés 164 Date d'inscription jeudi 6 mars 2003 Statut Membre Dernière intervention 9 octobre 2006
23 juin 2006 à 15:43
oui je veux bien, sinon pour mon problème je viens de trouver. le problème venait de la ligne qui créé la matrice de projetcion. je mettais en znearPlane la distance 0.0f, or pour les divisions c'est pas super top, donc j'ai passé une valeur non nulle et là ça marche nickel
0
nomadsoulnomad Messages postés 12 Date d'inscription mercredi 25 janvier 2006 Statut Membre Dernière intervention 23 juin 2006
23 juin 2006 à 20:02
ok ta une adresse e-mail stp ?
0
vr3h Messages postés 164 Date d'inscription jeudi 6 mars 2003 Statut Membre Dernière intervention 9 octobre 2006
24 juin 2006 à 07:04
[mailto:vr3h@hotmail.com vr3h@hotmail.com]
0
Rejoignez-nous