PDA

Voir la version complète : CTileMap floue ?


Jny
15/04/2005, 22h19
Bonsoir à tous,

C'est la premiere fois que j'utilise une TileMap et j'ai un petit soucis : le rendu est flou.

Voyez par vous même :

http://j.ny.free.fr/trucs/SxDL/tilemap_floue.png

La fenetre située sous l'appli SxDL montre le rendu normal des tiles.

Mon bout de code :

void CGame::OnCreateGame()
{
Map = new CTileMap ( TextureMap , 0xFFFFFFFF , 32 , 20 , 32 , 8 , 0 , 0 , 32 , 32 ) ;
Vector3 Center = Vector3 ( 0.0f , 0.0f , 0.0f ) ;
Vector3 Scale = Vector3 ( 1024.0f , 640.0f , 1.0f ) ;
Vector3 Rotation = Vector3 ( 0.0f , 0.0f , 0.0f ) ;
Map->Geometry ( Center , Scale , Rotation ) ;
Map->Load ( CTileMap::RandomizeTextureMap , NULL ) ;
Map->Enable ( true ) ;
}

Ai-je loupé quelque chose ou bien y'a t-il une explication scientifique à ce problème ?

Merci à vous.

LaurentUSA
16/04/2005, 04h14
Voici comment regler rapidement le probleme :

Ajouter la ligne :

DoRenderSurface = false ;

a la fin du constructeur de CTileMap situe dans le fichier tilemap.cpp

Je posterai une explication plus complete demain. Le probleme est regle de facon nettement plus propre avec SxDL 3.

Noter que le flou est une chose, certes, mais que Jny n'a pas encore charge les donnees en provenance de son editeur dans la tilemap. Il utilise :

Map->Load ( CTileMap::RandomizeTextureMap , NULL ) ;

Donc l'image donne des tiles au hasard.

Jny
16/04/2005, 12h39
Ca ne résoud pas le problème. La map est toujours floue.

Edit > En fait, le résultat est un peu meilleur mais c'est pas encore net.


Je vais migrer le projet sur la beta de SxDL 3.0 que tu m'avais envoyé il y a quelques semaines. On va voir ce que ca va donner.

(Et effectivement les tiles sont randomisées. Ca me permet de faire des petits tests rapidos.)

LaurentUSA
16/04/2005, 18h46
Quelle est la taille de fenetre de ton jeu ? 1024 ?

Pourrais-tu poster ou m'envoyer par email des screenshots non-compresses ?

( pas de jpg, un bmp avec encodage RLE et ensuite zippe serait parfait )

Jny
16/04/2005, 19h17
Quelle est la taille de fenetre de ton jeu ? 1024 ?

oui 1024.


Pourrais-tu m'envoyer par email des screenshots non-compresses ?

C'est fait.

Merci à toi.

Jny
16/04/2005, 20h23
Je suis passé sous SxDL 3.0 beta.

1/

Et bien il y a encore un très léger flou. Mais par contre le flou m'a l'air plus 'propre', il y a moins d'artefacts visuels. :00000005:

Alors là je suis en train de me dire que c'est peut être normal d'avoir un léger lissage...

Bref, je vais attendre les remarques/conseils/explications de Laurent, je crois que ce sera le mieux à faire.

La suite au prochain épisode...

2/

Sinon depuis mon passage à la 3.0 j'ai un chtit probleme :
Quand je quitte l'appli j'ai le droit à un beau message d'erreur :
Exception non gérée à 0x0058220e dans JnySxDL.exe:0xC0000005: Violation d'accès lors de la lecture de l'emplacement 0xcccccccc.
et le debugueur pointe la ligne
hr = p->InvalidateSharedDeviceObjects() ;
de la méthode template<class TYPE> inline HRESULT CList<TYPE>::InvalidateSharedDeviceObjects()
du fichier Collections.h

LaurentUSA
16/04/2005, 21h06
Voici la reponse "longue" comme promis...

Il y a plusieurs effets qui s'additionnent et provoquent le "flou" :

1 ) La méthode de dessin dans SxDL
2 ) L'étirement éventuel ( par mise à l'échelle ) de la TileMap dans l'application
3 ) La gestion des textures dans SxDL
4 ) La compression de textures dans DirectX et la carte graphique.
4 bis ) Les parametres de qualité selectionnés par l'utilisateur dans son panneau de controle.


1 ) SxDL par défaut fait un rendu sur texture et ensuite fait le dessin en un seul quad. Beaucoup de flou si on étire trop la texture. Optimal dans certain cas, mais pas toujours. SxDL 3 permets donc d'invalider cette methode et de dessiner les tiles une par une. C'est ce que fait le patch propose à Jny.

2 ) Si le nombre de texels ne corresponds pas exactement au nombre de pixels, il y aura mise à l'echelle et interpolation de la texture donc du "flou". Ce n'est le cas dans l'appli de Jny. Ex: 32 texels x 32 tiles pour 1024 pixels, ca roule.

3 ) SxDL fait du filtrage linéaire par defaut : Avec SxDL 3, on peut également invalider ce filtrage pour les tilemaps. Voila ce qui est fait :


Device->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_NONE ) ;
Device->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_NONE ) ;

Cela améliore encore le rendu qui devient très très proche de la texture d'origine mais... il reste encore 4 ) et 4 bis )

4 ) 4 bis ) La carte graphique compresse et décompresse les textures plus ou moins selon les préférences utilisateur - A ma connaissance, là, il n'y a pas grand chose a faire. Certains pixels seront légèrement "floutés".

Voici la méthode qui permet de regler les paramètres de rendering dans SxDL 3


void Rendering ( bool _DoRenderSurface , int _DynamicTextureSize = 256 , bool _DoFiltering = true )

LaurentUSA
16/04/2005, 21h10
Jny > Pour 2) Voir ici :

http://forum.games-creators.org/showthread.php?p=1021#post1021

Jny
16/04/2005, 21h22
Dans ma version de SxDL 3 la méthode Rendering de CTileMap a cette signature :

void Rendering ( bool _DoRenderSurface , int _DynamicTextureSize )

'va falloir que j'attende la version finale pour pouvoir faire des chtits essais.

merci pour tes explications. C'est bon à savoir tout ca.

A+