Irgendwas kapier ich bei deinem Testschnipsel oben nicht:
Du baust einmal am Anfang einen VertexBuffer, wo du die aktuellen Vertices reinkopierst. In deiner Draw-Routine berechnest du dann immer neue Vertices, die Darstellung mit DrawPrimitive kommt aber aus dem Vertexbuffer (der immer noch die allerersten Anfangsdaten hat).
Entweder du kopierst die Vertices in Draw immer wieder neu in den VertexBuffer oder du benutzt DrawPrimitiveUP mit dem Vertices-Daten (was dann intern von DirectX über VertexBuffers gelöst wird).
Noch ein Nachtrag, das AlphaBlendEnable, das ich oben angegeben habe, ist für volles Alpha-Blending gedacht, also nicht nur Pixel da oder weg, sondern mit Alpha-Werten dazwischen ebenso (für transparente Flächen). Du scheinst das bei dir ja nicht wirklich zu benötigen, da kannst du auf Alpha-Testing ausweichen (das prüft nur ob Alpha an oder aus ist), das wird auf einigen Karten dann doch wesentlich schneller laufen (da muss die Karte nicht die Farbwerte zusammenrechnen, sondern einfach ein Pixel setzen oder eben nicht).
Alphatesting aktivierst du so:
pDevice->SetRenderState( D3DRS_ALPHATESTENABLE, TRUE );
Zusätzlich am besten gleich die Vergleichsfunktion und den Vergleichswert setzen (die Schwellwerte für die Alpha-Prüfung):
pDevice->SetRenderState( D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL );
pDevice->SetRenderState( D3DRS_ALPHAREF, 8 );
Hintergrund: Bei Alphatesting vergleich die Karte das Alpha aus der Textur mit der angegebenen Vergleichsfunktion gegen den Referenzwert. Ist der Alphawert darüber, wird der Pixel angezeigt, ist er drunter, dann nicht.