2009-05-04 8 views
4

Ich versuche, ein 2D-Bild auf dem Bildschirm in Direct3D zu zeichnen, was ich voraussetze, indem ich eine Textur auf ein rechteckiges Billboard-Polygon projiziere, das projiziert wird, um den Bildschirm zu füllen. (Ich bin nicht interessiert oder kann Direct2D nicht verwenden.) Alle Texturinformationen, die ich im SDK gefunden habe, beschreiben das Laden einer Bitmap aus einer Datei und das Zuweisen einer Textur zur Verwendung dieser Bitmap, aber ich habe noch keine Möglichkeit zur Manipulation gefunden eine Textur als Bitmap Pixel für Pixel.Wie stelle ich die Farbe eines einzelnen Pixels in einer Direct3D-Textur ein?

Was ich möchte wirklich eine Funktion wie

void TextureBitmap::SetBitmapPixel(int x, int y, DWORD color);

Wenn ich nicht die Pixel direkt in der Textur-Objekt festlegen können, muss ich um einen DWORD-Array halten müssen, dass das ist Bitmap und weisen Sie dann jedem Frame die Textur zu?

Schließlich, während ich zunächst davon ausgehe, dass ich dies auf der CPU tun werde, könnten die pro-Pixel-Farbberechnungen wahrscheinlich auch auf der GPU erfolgen. Ist der HLSL-Code, der die Farbe eines einzelnen Pixels in einer Textur festlegt, oder sind Pixel-Shader nur zum Ändern der Anzeigepixel nützlich?

Danke.

Antwort

4

Zuerst Ihre direkte Frage:

können Sie, technisch, stellen Pixel in einer Textur. Dies würde die Verwendung von und UnlockRect API erfordern.

Im D3D-Kontext bezieht sich "Sperren" normalerweise auf die Übertragung einer Ressource vom GPU-Speicher zum Systemspeicher (wodurch die Teilnahme an Rendering-Operationen deaktiviert wird). Nach dem Sperren können Sie den aufgefüllten Puffer wie gewünscht ändern und anschließend entsperren, d. H. Die geänderten Daten zurück zur GPU übertragen. Im Allgemeinen wurde Sperren als eine sehr teure Operation betrachtet, aber seit PCIe 2.0 ist das wahrscheinlich kein Hauptanliegen mehr. Sie können auch ein kleines (sogar 1-Pixel) RECT als zweites Argument für LockRect angeben, was die Übertragung eines vernachlässigbaren Datenvolumens erfordert und hoffen, dass der Treiber in der Tat intelligent genug ist, um genau das zu übertragen (ich weiß es genau) dass dies bei älteren nVidia-Treibern nicht der Fall war).

Der effizientere (und Code-intensive) Weg, das zu erreichen, ist in der Tat, die GPU nie zu verlassen. Wenn Sie create your texture als RenderTarget angeben (also D3DUSAGE_RENDERTARGET als sein usage Argument angeben), könnten Sie es als Ziel der Pipeline festlegen, bevor Sie Zeichenaufrufe tätigen, und einen Shader schreiben (vielleicht passing parameters), um Ihre Pixel zu zeichnen. Eine solche Verwendung von Renderzielen wird als Standard betrachtet, und Sie sollten in der Lage sein, viele Codebeispiele zu finden. Wenn Sie jedoch nicht bereits mit Leistungsproblemen konfrontiert sind, würde ich sagen, dass dies ein Overkill für ein einzelnes 2D-Billboard ist.

HTH.

Verwandte Themen