DirectX Graphics 8 (D3D): Wie kann ich die GDI nutzen?



  • Also:

    LPDIRECT3DSURFACE8		BackBuffer;
    //macht man sinnvolerweise nur einmal nach dem Init
    d3ddevice->GetBackBuffer(0, D3DBACKBUFFER_TYPE_MONO, &BackBuffer);
    
    D3DLOCKED_RECT LRect;
    //lock
    BackBuffer->LockRect(&LRect,NULL, 0 );
    //das ist jetzt ein Zeiger auf die Daten des Backbuffers
    pBits = (byte*) LRect.pBits;
    //Daten maipulieren
    ...
    pBits[x+y*devicewidth] = 0x0; //pixel weiß machen
    ..
    //unlock
    BackBuffer->UnlockRect();
    

    Oder:

    Wenn du einfach Kreise, Polygone oder sowas haben willst, dann machst du einfach einige 2-Dimensional Vertices (koordinaten nur in X,Y) z.B. so

    struct D3DRHWVertex
    {
    	float x,y,z, rhw;
    	D3DColor c
    };
    const int FVF_D3DRHWVertex = D3DFVF_XYZRHW | D3DFVF_DIFFUSE;
    

    Du kannst diese Vertices wie nornale benutzen, nur eben 2D. Wenn du alles ein Vierck haben willst, das die Pixel X: 200 bis 400 und Y 150 bis 250 abdekcen soll, dann erstellst du vier Vertics, mit den Eckpunkten in Pixel als X und Y. Zist für die Tiefe (0 bis 1 ), also z.B. 0.5 und rhw z.B. auch 0.5. c ist dann deine Farbe. Das Rendererst du dann als D3DPT_TRIANGLESTRIP wobei du vorher den oassenden VertexShader setzt. Fertig. Kreisfunktine und so musst dir allerdings selbst schreiben.



  • Und wenn ich den BackBuffer locke, kann ich dann auch darauf ein DC kriegen?
    Weil ich bin in DDraw schon an der direkten Pixelmanipulation gescheitert (Farbtiefe, WORD?, DWORD?! WTF 😃 ). Außerdem wird es für mich auch ein bisschen schwierig, ne Ellipse "herzumanipulieren".
    Und da freu ich mich extra weil ich jetzt neuerdings nicht mehr selber clippen muss, und dann muss ich bei der Pixelmanipulation wieder auf den Rand aufpassen 😃

    Grafikprogrammierung is halt nicht so mein Ding.
    Das mit den Vertices muss ich mir mal anschauen, wie ich da ne Ellipse zusammenbekomm 😕



  • Is schon irgendwie ärgerlich, alles würde schon gehen, Alphablending, Drehen, Zoomen, nur so ne billige Ellipse nicht 😃



  • Wenn die Objekte nicht ausgefüllt sein sollen, kannst du auch einfach LINELIST/STRIPs statt TRIANGLESTRIPs nehmen. Kreise/Ellipsen sind ja nur 'ne billge Frage von etwas sinus/cosinus, das weiss google auch. Tollerweise kannst du dann deine Grundform auch drehen, zoomen, bla.

    Locken ist auf jeden Fall arschlahm, also lass es besser wenn es auf Geschwindigkeit ankommt.



  • Ausgefüllt müssen zumindest Rechtecke in beliebiger Farbe sein können. Ich hab jetzt grad von ner möglichen Lösung (ohne GDI) gehört, wenn das funktioniert, sag ich bescheid.
    Wenn jemand noch weiss, wie man die GDI nutzen kann, so möge er es mir bitte sagen, vielleicht brauch ich sie trotzdem noch...



  • Ok für ausgefüllte Rechtecke nehm ich jetzt ein entsprechend gestrecktes, weisses 3x3 Bild und über die Farbkanäle kann ich die Farbe bestimmen.

    Neues Problem: Ich möchte den Gesundheitsbalken von Einheiten schön von Grün über Gelb nach Rot verschieben. Die Formel für die Farbanteile von 0-255 hab ich längst. Wie kann ich daraus jetzt so einen hex-wert basteln? Die ersten beiden Ziffern sollen immer FF sein und die anderen 3 Paare beliebige Werte zwischen 0 und 255.

    EDIT:
    *nach Bitshift Google und hoff dass das des richtige ist*



  • Eine einfarbige (und speziell weisse!) Textur ist sinnlos, dann kannst du auch einfach keine nehmen. Und 3x3 ist auch ne komische Auflösung. Für die Bitshifts gibts in DX sogar Makros.



  • Ich zeichne alles mit Hilfe der Sprite-Funktionen (is ja auch ein 2D-Spiel). Weiß ist die Textur deshalb, damit alle drei Grundfarben in voller Intensität sind. Mit den Farbkanälen lassen sich die Farben dann filtern. Die Auflösung von 3x3 hab ich aus anderen Gründen gewählt...



  • So, nach gründlicher Überlegung und Auseinandersetzung mit Zahlensystemen (hatten wir heute in der Vorlesung erst 😮 ), hab ich mir meine eigene RGB-Funktion geschrieben.
    Damit sind meine Probleme vorerst gelöst, danke für die Antworten.
    Verbesserungsvorschläge zur Funktion sind willkommen.

    class Graphics
    {
    public:
    	static const int screenX = 1024, screenY = 768;
    
    	// Öffentliche Funktionen:
    [...]
    	inline static DWORD MyRGB(const DWORD alpha, const DWORD red, const DWORD green, const DWORD blue)
    	{
    		// Anmerkung: typedef DWORD D3DCOLOR
    		// Alle Werte von 0-255!
    		return blue + green*(16*16) + red*(16*16*16*16) + alpha*(16*16*16*16*16*16);
    	}
    [...]
    }
    

    Ich werde bescheid geben, sobald die DX8 Version von meinem Spiel online ist, vielleicht erbarmen sich ein paar Leute und testen das Spiel auf ihren Grafikkarten. Ich bin mir nämlich nicht sicher, ob es Probleme mit 555 und 565 Modi gibt 😉



  • Optimizer schrieb:

    Verbesserungsvorschläge zur Funktion sind willkommen.

    Dringend shiften statt multiplyen!! 😋 😉



  • Ok, jetzt schau ich mir das shiften doch mal an 😡
    😃



  • Hahahahaha... 😃 👍



  • inline static DWORD MyRGB(const DWORD alpha, const DWORD red, const DWORD green, const DWORD blue)
    {
    	// Parameter von 0-255!
    	return blue + (green << 8) + (red << 16) + (alpha << 24);
    }
    

    😛


Anmelden zum Antworten