[DirectX] Fog et les Drivers ATI

Fog et les Drivers ATI [DirectX] - Divers - Programmation

Marsh Posté le 18-12-2003 à 01:07:47    

Salut tout le monde!
 :hello:  
 
Je commence à développer une appli D3D.
Je met les appels et init necessaires au fog et...
L'écran et gris (couleur choisie pour le vidage du tampon) j'ai regardé plein de fois le code, le fichier d'aide du SDK et je n'ai visiblement rien oublié.  
Je dl un tutorial en C (je code sous Delphi) et meme problème alors que visiblement son appli marchais.
Je depoussière ma GF3 et oh merveille ça marche.
Donc j'en deduis que ça vient des drivers ATI. Seulement je n'ai pas trouvé de drivers qui n'avaient pas ce bug.
Si quelqu'un sait quels drivers n'ont pas ce bug ou sait comment l'eviter je suis preneur car c génant surtout que les derniers ATI sortis aujourd'hui ne changent rien. :(  
 
Voilà mon pb.
Merci d'avance à ceux qui répondrons et à ceux qui m'ont lu jusqu'au bout  :D


---------------
Do or do not, there is no try...
Reply

Marsh Posté le 18-12-2003 à 01:07:47   

Reply

Marsh Posté le 18-12-2003 à 02:06:19    

salut...
 
ton Clear(), tu luis passes quoi comme couleur ?
avec D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER je suppose ?
 
ton renderstate D3DRS_FOGCOLOR, il est à quoi ?
 
donc si je comprends bien, après un clear, tu as la couleur du D3DRS_FOGCOLOR et non du Clear() ?
 
et si tu vires tout entre BeginScene() et EndScene() ?
(pour être sur que ce soit au Clear() que ça chie...)
le Present() est bien là ? (je suppose que oui...)

Reply

Marsh Posté le 18-12-2003 à 08:21:30    

Je pense qu'il manque les explications.  
Aux dernieres nouvelles le fog dans les drivers ATI marchent correctement. Maintenant explique nous CLAIREMENT ce que fait ton programme (appels que tu fais, tests avec debug, refrast etc..)
 
LeGreg

Reply

Marsh Posté le 18-12-2003 à 11:21:52    

Ben mes lignes de code marchent sur ma GeForce 3.
La fonction suivante est appellée au sein de render (procedure de rendu de la scène) cad apres le g_pd3dDevice.Clear normal.
C'est pas très beau parceque ça efface deux fois le buffer mais je verais plus tard pour ça.
 

Code :
  1. procedure FogFX(FogStart,FogEnd,Density:DWord; Color : TD3DCOLOR);
  2. begin
  3.   g_pd3dDevice.Clear(0, nil, D3DCLEAR_TARGET,Color, 1.0, 0);
  4.   g_pd3dDevice.SetRenderState(D3DRS_FOGSTART,FogStart);
  5.   g_pd3dDevice.SetRenderState(D3DRS_FOGEND,FogEnd);
  6.   g_pd3dDevice.SetRenderState(D3DRS_FOGDENSITY, Density);
  7.   g_pd3dDevice.SetRenderState(D3DRS_FOGCOLOR,Color);
  8.   g_pd3dDevice.SetRenderState(D3DRS_FOGVERTEXMODE,D3DFOG_LINEAR);
  9.   g_pd3dDevice.SetRenderState(D3DRS_FOGENABLE,itrue);
  10.   g_pd3dDevice.SetRenderState(D3DRS_RANGEFOGENABLE,itrue);
  11. end;


 
Lorsque j'appelle la procedure j'ai testé une 20aine de valeurs pour le fog start, fog end et density et j'ai toujours le meme resultat, c'est comme si le brouillard avait une densité enorme (il ne fait pas de dégradé de la couleur du fog sur les mesh à rendre en fait). J'ai vérifié aussi si la valeur que je donnais aux diférents paramètres étaient correctement appliqué et c'est le cas.
C'est pour ça que j'ai privilégié la piste du driver mais j'ai peut-etre oublié quelquechose.
Voilà, j'espere avoir été plus clair.
Merci  :jap:


---------------
Do or do not, there is no try...
Reply

Marsh Posté le 18-12-2003 à 12:52:43    

ton Clear et ton renderstate FOGCOLOR sont tous les deux à "Color".
 
donc déjà tu devrais avoir ton backbuffer à la couleur du fog.
bon alors le prob, c'est que tu dis le fog sature très tôt....
 
donne tes valeurs que je voies dans mo code à moa (j'ai une gf4... :D)

Reply

Marsh Posté le 18-12-2003 à 14:59:53    

BJOne a écrit :

ton Clear et ton renderstate FOGCOLOR sont tous les deux à "Color".


 
normalement les fogStart/fogEnd c pas des floats qu'il faut passer par d'horrible magouille ?

Reply

Marsh Posté le 18-12-2003 à 17:45:03    

wai le truc qui fait cast tordu pour faire passer le float en DWORD....
 
note: ses paramètres de fog sont déjà a passer en DWORD...

Reply

Marsh Posté le 18-12-2003 à 17:50:07    

Bah float,DWord... ce sont des types compatibles non?
Puis comme je l'ai dit à plusieurs reprises le code ne pose aucun problème sur ma GF3 qui as les derniers drivers Nvidia...
Des que j'ai le temps d'uploader l'exe sur mon FTP je vous fournis un lien pour voir si ceux qui ont la meme conf que moi n'ont pas de problèmes.
Peut-etre que ça vient pas exactement des drivers mais des dll que j'utilise mais visiblement ça vient pas du code...


---------------
Do or do not, there is no try...
Reply

Marsh Posté le 18-12-2003 à 17:54:39    

bin non c pas compatible.
justement, en C pour que ça soit cohérent, y'a une macro pour faire passer le float en DWORD sans faire une conversion flottant=>entier.
 
entre un flottant à 6 et le 6 en entier, au niveau codage binaire spa la même chose (hors SetRenderState attends en interne une valeur codée en float pour les renderstate D3DRS_FOGEND..., même si tu la passes en tant que DWORD).


Message édité par bjone le 18-12-2003 à 17:59:45
Reply

Marsh Posté le 18-12-2003 à 17:56:12    

mais bon, on va dire que de ce coté là c'est bon...
 
si tu nous donnais un peu plus de code...

Reply

Marsh Posté le 18-12-2003 à 17:56:12   

Reply

Marsh Posté le 18-12-2003 à 18:11:27    

bon alors j'ai ptet une piste mais c'est pas sûr (j'ai pas joué avec toutes les options de fog perso, alors...)
 
http://msdn.microsoft.com/archive/ [...] g_7nlf.asp
 
http://msdn.microsoft.com/archive/ [...] g_0t6b.asp
 
avec ton fog, tu est en fog dit -range-, donc la distance caméra->vertex, et non avec la composante Z de chaque vertex.
 
donc je me demandes si ton range (eye) fog échoue pas sur ta gf3, et que comme tes paramètres sont fait pour le Z-based fog ça marche...
et que sur la radeon le eye-fog réussi et que du coup des paramètres sont incohérents pour le eye-fog...
 
 

Reply

Marsh Posté le 18-12-2003 à 18:59:51    

il y a l'exemple fog dans les samples du DX SDK
ce serait une bonne idée de t'en inspirer.
 
passer un float comme un DWORD:
passer par une union (pas portable mais ça marche sur AMD64 et IA32)
ou passer par un pointeur de DWORD casté de manière C-sale vers un pointeur de float (pas portable non plus et ne marche pas sur AMD64).
 
LeGreg

Reply

Marsh Posté le 19-12-2003 à 18:15:52    

no news ?

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed