HLSL - Comment puis-je mettre sampler filtre min / Mag / Mip pour désactiver tout le filtrage / anti-aliasing?

StackOverflow https://stackoverflow.com/questions/2700041

  •  01-10-2019
  •  | 
  •  

Question

J'ai un tex2D sampler je veux revenir précisément que ces couleurs qui sont présentes sur ma texture. J'utilise Shader Model 3, ne peut donc pas utiliser http://img689.imageshack.us/img689/6171/sourcev.png

Capture d'écran de ce que les regards de la région concernés comme après la pleine texture est mis en correspondance avec ma sphère;
http://img717.imageshack.us/img717/9202/resultc.png
L'anti-aliasing / mélange / filtrage des artefacts sont clairement visibles; Je ne veux pas ces derniers.


MSDN a ceci à dire:

D3DSAMP_MAGFILTER: Filtre Grossissement de Type D3DTEXTUREFILTERTYPE

D3DSAMP_MINFILTER: Filtre Minification de Type D3DTEXTUREFILTERTYPE .

D3DSAMP_MIPFILTER: Filtre Mipmap à utiliser pendant minification. Voir D3DTEXTUREFILTERTYPE .

D3DTEXF_NONE: Lorsqu'il est utilisé avec D3DSAMP_MIPFILTER, désactive mipmapping.

Une autre bonne lien sur intrinsics HLSL compréhension .


RÉSOLU

Pas un problème HLSL du tout! Désolé tout. Il me semble poser beaucoup de questions qui sont impossibles à répondre. Ogre était sur EQUITATION les paramètres ci-dessus. Cela a été corrigé avec;

Ogre::MaterialManager::getSingleton().setDefaultTextureFiltering(Ogre::FO_NONE , Ogre::FO_NONE, Ogre::FO_NONE);
Était-ce utile?

La solution

Ce qu'il semble me est que vous obtenez les valeurs d'un niveau inférieur mip-map (non filtrée) que le détail le plus élevé que vous démontrons.

MipFilter = None 

devrait empêcher que, à moins que quelque chose dans le code remplace. Regardez donc pour les appels à SetSamplerState.

Autres conseils

Qu'est-ce que vous avez fait doit désactiver le filtrage. Il y a 2 problèmes potentiels, que je peux penser, bien que

1) Le pilote juste que vous et ne tient pas compte de toute façon les filtres (Si cela se produit il n'y a rien que vous pouvez faire) 2) Vous avez une certaine forme d'anti-aliasing de bord activé.

En regardant votre image résultante qui ne ressemble pas beaucoup bilinéaire pour me filtrer donc je pense que vous souffrez d'avoir antialiasing allumé quelque part. Avez-vous mis le drapeau anticrénelage lorsque vous créez le périphérique / render-texture?

Si vous voulez avoir vraiment juste un texel, l'utilisation load au lieu de sample. load prend (pour autant que je sache) un int2as un argument, qui indique les coordonnées du tableau réel dans la texture. ressemble load alors jusqu'à l'entrée dans votre texture aux coordonnées du tableau donné.

Ainsi, l'échelle juste votre float2, par exemple en utilisant ceil(float2(texCoord.x*textureWidth, texCoord.y*textureHeight)).

MSDN pour la charge: http: // msdn. microsoft.com/en-us/library/bb509694(VS.85).aspx

Lorsque vous utilisez un Shader 3, vous pourriez un petit hack pour y parvenir. Encore une fois, nous allons supposer que vous connaissez textureWidth et textureHeight

// compute floating point stride for texture
float step_x = 1./textureWidth;
float step_y = 1./textureHeight;

// compute texel array coordinates
int target_x = texCoord.x * textureWidth;
int target_y = texCoord.y * textureHeight;

// round to values, such that they're multiples of step_x and step_y
float2 texCoordNew;
texCoordNew.x = target_x * step_x;
texCoordNew.y = target_y * step_y;

Je n'ai pas testé, mais je pense que cela pourrait fonctionner.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top