Texture memory-tex2D Grundlagen

8

Bei der Verwendung von Texturspeicher bin ich auf folgenden Code gestoßen: -

%Vor%

Meine Frage ist, warum fügen wir 0.5f zu c und f hinzu? Das verwirrt mich .. Danke

    
Code_Jamer 17.05.2012, 21:27
quelle

2 Antworten

14

In Grafiken ist eine Textur eine Gruppe von Beispielen, die das visuelle Erscheinungsbild einer Oberfläche beschreiben. Eine Probe ist ein Punkt. Das heißt, es hat keine Größe (im Gegensatz zu einem Pixel, das eine physikalische Größe hat). Wenn Muster zur Bestimmung der Farben von Pixeln verwendet werden, wird jedes Sample exakt in der Mitte des entsprechenden Pixels positioniert. Wenn Pixel mit ganzzahligen Koordinaten adressiert werden, wird die genaue Mitte für ein gegebenes Pixel seine ganze Zahl plus ein Offset von 0,5 (in jeder Dimension).

Mit anderen Worten, das Hinzufügen von 0,5 zu Texturkoordinaten stellt sicher, dass beim Lesen dieser Koordinaten der exakte Wert des Samples für dieses Pixel zurückgegeben wird.

Es ist jedoch nur möglich, wenn filterMode für die Textur auf cudaFilterModeLinear gesetzt wurde, dass der Wert, der von einer Textur gelesen wird, innerhalb eines Pixels variiert. In diesem Modus gibt das Lesen von Koordinaten, die nicht in der exakten Mitte eines Pixels liegen, Werte zurück, die zwischen dem Abtastwert für das gegebene Pixel und den Abtastwerten für benachbarte Pixel interpoliert werden. Wenn Sie also 0,5 zu ganzen Zahlenkoordinaten hinzufügen, wird der cudaFilterModeLinear -Modus effektiv negiert. Da jedoch das Hinzufügen von 0,5 zu den Texturkoordinaten Zyklen im Kernel erfordert, ist es besser, die Interpolation einfach auszuschalten, indem Sie filterMode auf cudaFilterModePoint setzen. Wenn Sie dann von einer beliebigen Koordinate innerhalb eines Pixels lesen, wird der exakte Texturstichprobenwert für dieses Pixel zurückgegeben, und Texturstichproben können direkt mit ganzen Zahlen gelesen werden.

Wenn Sie bei der Berechnung der Texturkoordinaten Gleitkommaarithmetik verwenden, müssen Sie bei Verwendung von cudaFilterModePoint darauf achten, dass Gleitkommaungenauigkeiten nicht dazu führen, dass die Texturkoordinaten außerhalb des Bereichs für das gewünschte Zielpixel liegen.

Wie in den Kommentaren erwähnt, könnte es in Ihrem Code ein Problem geben. Hinzufügen von 0.5f zu den Texturkoordinaten bedeutet, dass der cudaFilterModeLinear -Modus verwendet wird, aber dieser Modus gibt ein float zurück, nicht ein int.

    
Roger Dahl 19.05.2012, 17:34
quelle
0

Abhängig von den Textureigenschaften kann der von tex2D zurückgegebene Wert linear interpoliert werden. Die "Indizes" f und c sind daher keine ganzen Zahlen, sondern kontinuierliche Werte zwischen den Grenzen jeder Dimension.

Was in diesem Beispiel ein bisschen seltsam ist, ist, dass der Rückgabewert eine ganze Zahl ist, die jeden linearen Interpolator stückweise konstant macht.

Weitere Informationen finden Sie in Abschnitt 3.2.10 des CUDA-Programmierhandbuchs.

    
Pedro 17.05.2012 21:56
quelle

Tags und Links