[DX9, C++] Kreis zeichnen

kickerxy123

Erfahrenes Mitglied
Hallo,

folgendes Problem habe ich derzeit: ich möchte einen Kreis malen. Aus Performancegründen dachte ich mir, dass ein Viereck mit Kreistextur effizienter ist, als ein irgendwie gemalter Kreis mit sin/cos etc Operationen (korrigiert mich, wenn ich da falsch liege!). Soweit so gut, er malt auch einen Kreis. Allerdings kann ich nun nicht ohne Weiteres die Farbe von dem Kreis ändern... Die Möglichkeiten die sich mir ergeben sind:

a) ColorBlending, AlphaBlending
b) Textur sperren, Bits ändern, entsperren (kann nicht effizient sein ...)

zu a) wie ich es auch drehe und wende, ich kriege es nicht hin das ordentlich zu mappen. Vielleicht fehlt mir hier die detaillierte Kenntnis über das Blending. Ich müsste die Kreistextur in ihrer Ursprungsfarbe (schwarz) malen und dann darüber ein farbiges Viereck blenden, aber eben so, dass es ein Kreis bleibt (->alpha vom gemalten kreis, color vom Viereck. geht das?*). Oder könnte man das in einem separaten Bildschirmpuffer zusammenrendern?


*ich denke nicht, da der Kreis gemalt wird und dann keine Information mehr über etwaige alpha-Werte hat, oder? Daher auch die Idee mit dem separaten Bildschirmpuffer, den man mit alpha initialisieren könnte.



Noch eine Idee kam mir: Ich könnte drei Kreise erstellen und die zusammen blenden, also einen roten, grünen und blauen Kreis wegen des RGB-Systems.


Grundsätzlich würdet ihr mir schon sehr helfen, wenn ihr mir sagt, wie ich möglichst effizient einen farbigen Kreis darstellen kann, der alle (A)RGB-Werte annehmen kann. Effizienz ist wichtig, da mehrere Kreise im Worst-Case einmal pro Frame die Farbe wechseln. An meinen diffusen Ideen könnt ihr sehen, dass mir ein "Wegweiser" höchst willkommen wäre ;-)




Danke und viele Grüße,
exo
 
Zuletzt bearbeitet:
a) ColorBlending, AlphaBlending
b) Textur sperren, Bits ändern, entsperren (kann nicht effizient sein ...)
Definitiv a).

Mein Vorschlag wäre, in der Textur den Kreis in weiß auf schwarzem Hintergrund zu zeichnen (mit entsprechendem Alpha-Kanal). Die Farbe ergibt sich über die diffuse Farbe (D3DFVF_DIFFUSE) der Vertices. Die Texture Stage dann so modifizieren:

C++:
device->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);
device->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
device->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);  

device->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
device->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);

Hab es nicht getestet, aber sollte an sich funktionieren.

Grüße,
Matthias
 
Perfekt! Funktioniert einwandfrei und vorallem so simpel. Vielen, vielen Dank :)

Ich habe deinen Code noch leicht modifiziert:

C++:
	pDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
	pDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_DIFFUSE);
	pDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
	pDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);

Auf diese Weise muss der Farbaspekt ja nicht mehr moduliert werden.

Viele Grüße,
exo
 

Neue Beiträge

Zurück