De mémoire de Texture-tex2D bases
Lors de l'utilisation de mémoire de texture, j'ai trouvé le code suivant:-
uint f = (blockIdx.x * blockDim.x) + threadIdx.x;
uint c = (blockIdx.y * blockDim.y) + threadIdx.y;
uint read = tex2D( refTex, c+0.5f, f+0.5f);
Ma question est pourquoi ne nous ajouter 0.5f
à la fois c
et f
?
Cela me confond..
merci
OriginalL'auteur Code_Jamer | 2012-05-17
Vous devez vous connecter pour publier un commentaire.
Dans les graphiques, une texture est un ensemble d'échantillons qui décrit l'aspect visuel de la surface. Un échantillon est un point. C'est, il n'a pas de taille (par opposition à un pixel qui a une taille physique). Lors de l'utilisation d'échantillons afin de déterminer les couleurs des pixels, chaque échantillon est placé dans le centre exact de son pixel correspondant. Lors de l'adressage des pixels avec un nombre entier de coordonnées, le centre exact pour un pixel donné devient son nombre entier de coordonner plus un décalage de 0,5 (dans chaque dimension).
En d'autres termes, l'ajout de 0,5 à des coordonnées de texture, en sorte que, lors de la lecture à partir de ces coordonnées, la valeur exacte de l'échantillon pour que le pixel est retourné.
Cependant, c'est seulement quand
filterMode
pour la texture a été mis àcudaFilterModeLinear
que la valeur qui est lu à partir d'une texture varie à l'intérieur d'un pixel. Dans ce mode, la lecture de coordonnées qui ne sont pas dans le centre exact d'un pixel retourne les valeurs qui sont interpolées entre l'échantillon pour le pixel donné et les échantillons pour les pixels voisins. Donc, l'ajout de 0,5 à nombre entier coordonne efficacement nie lacudaFilterModeLinear
mode. Mais, depuis l'ajout de 0,5 à les coordonnées de texture prend cycles dans le noyau, il est préférable de simplement désactiver l'interpolation par la mise enfilterMode
àcudaFilterModePoint
. Ensuite, la lecture de tout coordonner au sein d'un pixel renvoie la texture exacte de l'échantillon valeur de ce pixel, et donc, de la texture des échantillons peuvent être lus directement à l'aide de nombres entiers.Lors de l'utilisation de
cudaFilterModePoint
, si tout calcul en virgule flottante est impliqué dans le calcul les coordonnées de la texture, des précautions doivent être prises pour s'assurer que virgule flottante inexactitudes ne pas provoquer les coordonnées de texture à tomber en dehors de la plage de la cible pixel.Aussi, les commentaires de mentionner, il y a peut être un problème dans votre code. L'ajout de 0,5 f pour les coordonnées de texture implique que le
cudaFilterModeLinear
mode est utilisé, mais que le mode renvoie un float, pas un int.Je ne suis pas sûr de ce que tu veux dire. Est-il un problème avec la réponse?
Dahl Merci,très belle réponse. Mais pouvez-vous dire quand vous dites à virgule flottante inexactitudes peuvent provoquer le partage de l'coordonnées de tomber en dehors de la plage de la cible de pixel?Qu'entendez-vous par à virgule flottante en précision?
Si vous utilisez
cudaFilterModePoint
et n'ajoutez pas de 0,5, alors 3.0 adresse de pixel #3, mais 2.9999999 aurait l'adresse de pixel #2. Les calculs avec des valeurs à virgule flottante ne sont souvent pas exacte, si un calcul de ce que vous pourriez attendre de sortir comme la valeur 3.0 peut être un petit peu plus haut ou plus bas. Dans ce cas, une valeur qui est un petit peu plus bas, permettrait de répondre à un autre pixel. Si vous ajoutez 0,5, l'adressage est beaucoup plus tolérant à ces petites erreurs.OriginalL'auteur Roger Dahl
Selon les propriétés de texture, la valeur renvoyée par
tex2D
peut être interpolée linéairement. Dans ce cas, les "indices"f
etc
ne doivent pas être des nombres entiers, mais des valeurs continues entre les limites de chaque dimension.Ce qui est un peu bizarre dans cet exemple est que la valeur de retour est un entier, qui fera tout son linéaire interpolant constante par morceaux, de toute façon.
Pour de plus amples informations, voir la Section 3.2.10 de la Programmation CUDA Guide.
cudaFilterModeLinear
est uniquement valable pour les valeurs de retour de virgule flottante de type.", donc, ici, nous n'avons pas d'interpolation, seulementcudaFilterModePoint
C'est exact, mais nous ne savons pas ce type de
refTex
a été déclarée, c'est à direfloat
ouint
ou quoi que ce soit.Si nous utilisons les coordonnées ne sont pas de 0.0 à 1.0, il ne peut pas être
cudaFilterModePoint
Selon le Guide de Programmation CUDA, normalisée des coordonnées de texture, n'ont aucune influence sur le mode de filtrage. L'exemple de la Section 3.2.10.1.3 utilise les coordonnées normalisées et linéaire, le filtrage d'interpolation.
OriginalL'auteur Pedro