Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

DasBlub

Alter Hase

  • »DasBlub« ist der Autor dieses Themas

Beiträge: 802

Wohnort: Schweiz

Beruf: Programmierer

  • Private Nachricht senden

1

26.05.2008, 23:26

Umwandeln von RGB zu DWORD

Hallo zusammen

ich bin gerade dabei, eine eigene Color Klasse zu schreiben. Ich habe nun das Problem, dass ich die Farbe als float für a,r,g,b speichere. wenn ich dies nun in DX gebrauchen will, muss ich ja DWORD verwenden.
Ich habe mir nun folgende Formel aus dem Buch rausgesucht:

C-/C++-Quelltext

1
2
3
4
5
6
    operator DWORD () const {
        return ((a >= 1.0f ? 255 : a <= 0.0f ? 0 : (DWORD)a) << 24) |
               ((r >= 1.0f ? 255 : r <= 0.0f ? 0 : (DWORD)r) << 16) |
               ((g >= 1.0f ? 255 : g <= 0.0f ? 0 : (DWORD)g) << 8)  |
                (b >= 1.0f ? 255 : b <= 0.0f ? 0 : (DWORD)b);
    }


wenn ich nun jedoch folgenden test durchführe, erhalte ich nicht das gewünschte resultat:

C-/C++-Quelltext

1
2
    MGE_INFO("cColor with D3DCOLOR_ARGB: %X", D3DCOLOR_ARGB((int)cColor->a, (int)cColor->r, (int)cColor->g, (int)cColor->b));
    MGE_INFO("cColor with (DWORD):       %X", (DWORD)cColor);


Dies ergibt folgende ausgabe:

Zitat


cColor with D3DCOLOR_ARGB: 0
cColor with (DWORD): 38098


hier meine mgeColor Klasse:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
///////////////////////////////////////////////////////////////////////////////

//             ___           ___           ___                             //

//            /__/\         /  /\         /  /\                              //

//           |  |::\       /  /:/_       /  /:/_                             //

//           |  |:|:\     /  /:/ /\     /  /:/ /\                            //

//         __|__|:|\:\   /  /:/_/::\   /  /:/ /:/_                           //

//        /__/::::| \:\ /__/:/__\/\:\ /__/:/ /:/ /\                          //

//        \  \:\~~\__\/ \  \:\ /~~/:/ \  \:\/:/ /:/                          //

//         \  \:\        \  \:\  /:/   \  \::/ /:/                           //

//          \  \:\        \  \:\/:/     \  \:\/:/                            //

//           \  \:\        \  \::/       \  \::/                             //

//            \__\/         \__\/         \__\/                              //

//                                                                           //

// MyGameEngine - Copyright by *** 2008                                      //

//                                                                           //

// mgeColor.h - contains functions for color operations                      //

///////////////////////////////////////////////////////////////////////////////


/////////////////////////////////////////////////

// include guard

#pragma once

#include "MyGameEngine.h"

/////////////////////////////////////////////////

// defines

#define MGE_COLOR_ARGB(a,r,g,b)  (new mgeColor((BYTE)r, (BYTE)g, (BYTE)b, (BYTE)a))
#define MGE_COLOR_XRGB(r,g,b)    (new mgeColor((BYTE)r, (BYTE)g, (BYTE)b))

class mgeColor {
public:
    // red, green, blue, alpha

    union {
        struct {
            float a;
            float r;
            float g;
            float b;
        };

        struct {
            float fAlpha;
            float fRed;
            float fGreen;
            float fBlue;
        };

        float afColor[4];
    };

    // constructor

    mgeColor();// {};

    mgeColor(const mgeColor& c) : r(c.r), g(c.g), b(c.b), a(c.a) {};
    mgeColor(const float f) : r(f), g(f), b(f), a(f) {};
    mgeColor(const float _r, const float _g, const float _b) : r(_r), g(_g), b(_b), a(1.0f) {};
    mgeColor(const float _r, const float _g, const float _b, const float _a) : r(_r), g(_g), b(_b), a(_a) {};
    mgeColor(const BYTE _r, const BYTE _g, const BYTE _b) : r((float)(_r)/255), g((float)(_g)/255), b((float)(_b)/255), a(1.0f) {};
    mgeColor(const BYTE _r, const BYTE _g, const BYTE _b, const BYTE _a) : r((float)(_r)/255), g((float)(_g)/255), b((float)(_b)/255), a((float)(_a)/255) {};

    // casting operator

    operator DWORD () const {
        return ((a >= 1.0f ? 255 : a <= 0.0f ? 0 : (DWORD)a) << 24) |
               ((r >= 1.0f ? 255 : r <= 0.0f ? 0 : (DWORD)r) << 16) |
               ((g >= 1.0f ? 255 : g <= 0.0f ? 0 : (DWORD)g) << 8)  |
                (b >= 1.0f ? 255 : b <= 0.0f ? 0 : (DWORD)b);
    }

    operator float* () {
        return (float*)afColor;
    }
};


was ist hier nun falsch?

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

2

26.05.2008, 23:47

Hmm. Ich würde sagen, dass es an den floats liegt, weil da Bitmanipulation nicht so banal ist, wie bei Integer.

Wenn ich schon dabei bin, kann ich dir sagen, dass casten von float zu int seeeehr teuer ist.

Wenn ich dich wäre, würde ich doch ganz einfach das Makro von DX nehmen.

C-/C++-Quelltext

1
D3DX_ARGB (a,r,g,b);


Da wirst du sehen, dass es nicht möglich ist float's anzugeben.

3

27.05.2008, 00:18

DirectX bietet doch jede Menge diesbezüglich an.
Zum Beispiel:

C-/C++-Quelltext

1
2
3
4
5
6
typedef struct D3DCOLORVALUE {
    float r;
    float g;
    float b;
    float a;
} D3DCOLORVALUE, *LPD3DCOLORVALUE;

tnecniv

Treue Seele

Beiträge: 164

Wohnort: BERLIN

  • Private Nachricht senden

4

27.05.2008, 00:50

Zitat von »"TheWinner"«

C-/C++-Quelltext

1
2
#define MGE_COLOR_ARGB(a,r,g,b)  (new mgeColor((BYTE)r, (BYTE)g, (BYTE)b, (BYTE)a))
#define MGE_COLOR_XRGB(r,g,b)    (new mgeColor((BYTE)r, (BYTE)g, (BYTE)b))


hmm..macht man das so? besteht da nicht die Gefahr ne menge speichermüll zu produzieren? wundert mich nur ein wenig... warum lässt du das new nicht weg?
Gruß
Sagt der igel zu dem dachs:
willst du größer sein, dann wachs!
- alte Fritz weisheit

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

5

27.05.2008, 01:01

Zitat von »"tnecniv"«

Zitat von »"TheWinner"«

C-/C++-Quelltext

1
2
#define MGE_COLOR_ARGB(a,r,g,b)  (new mgeColor((BYTE)r, (BYTE)g, (BYTE)b, (BYTE)a))
#define MGE_COLOR_XRGB(r,g,b)    (new mgeColor((BYTE)r, (BYTE)g, (BYTE)b))


hmm..macht man das so? besteht da nicht die Gefahr ne menge speichermüll zu produzieren? wundert mich nur ein wenig... warum lässt du das new nicht weg?
Gruß


Das ist in der Tat nicht sehr sinnvoll.. Da hat wohl jemand ein wenig zu viel Java abbekommen.. :)

6

27.05.2008, 08:01

du must erst deine floats vom Bereich 0-1 auf den bereich 0-255 erweitern, bevor du sie castest.

C-/C++-Quelltext

1
2
3
4
5
6
    operator DWORD () const {
        return (((a >= 1.0f ? 255 : a <= 0.0f ? 0 : (DWORD)a*255) << 24) |
                 ((r >= 1.0f ? 255 : r <= 0.0f ? 0 : (DWORD)r*255) << 16) |
                 ((g >= 1.0f ? 255 : g <= 0.0f ? 0 : (DWORD)g*255) << 8)  |
                 (b >= 1.0f ? 255 : b <= 0.0f ? 0 : (DWORD)b*255));
    }

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

7

27.05.2008, 09:22

Zitat von »"Zera"«

du must erst deine floats vom Bereich 0-1 auf den bereich 0-255 erweitern, bevor du sie castest.

C-/C++-Quelltext

1
2
3
4
5
6
    operator DWORD () const {
        return (((a >= 1.0f ? 255 : a <= 0.0f ? 0 : (DWORD)a*255) << 24) |
                 ((r >= 1.0f ? 255 : r <= 0.0f ? 0 : (DWORD)r*255) << 16) |
                 ((g >= 1.0f ? 255 : g <= 0.0f ? 0 : (DWORD)g*255) << 8)  |
                 (b >= 1.0f ? 255 : b <= 0.0f ? 0 : (DWORD)b*255));
    }

So klappt's nicht, denn so wird zuerst von float nach DWORD gecastet und dann multipliziert. Es muss (DWORD)(a*255) ... heißen, oder besser static_cast<DWORD>(a * 255.0f).

DasBlub

Alter Hase

  • »DasBlub« ist der Autor dieses Themas

Beiträge: 802

Wohnort: Schweiz

Beruf: Programmierer

  • Private Nachricht senden

8

27.05.2008, 19:21

hallo zusammen

zur info, warum ich nicht D3DCOLOR verwende:
ich habe das projekt aufgeteilt zwischen der gameengine (alle grundsachen, z.b. color) und der renderengine (hier jetzt dx9). dadurch kann ich jederzeit eine andere render engine verwenden, da alle von einer abstracten klasse abgeleitet werden, und aus der dll geladen werden.

zu meinem problem:
also, das problem liegt nicht etwa am zusammensetzten des rückgabewertes, sondern daran, dass das casting gar nie durchgeführt wird :? (ich hatte einfach mal eine ausgabe ins logfile reingeschrieben, aber der hat nichts ausgegeben -> wird nicht ausgeführt). da ich dies jedoch fast 1:1 so aus davids codes hatte, wundert mich dies...

DasBlub

Alter Hase

  • »DasBlub« ist der Autor dieses Themas

Beiträge: 802

Wohnort: Schweiz

Beruf: Programmierer

  • Private Nachricht senden

9

27.05.2008, 21:33

ok, die umwandlung klappt jetzt: ich durfte keine pointer verwenden:

C-/C++-Quelltext

1
2
3
4
5
6
mgeColor* c1 = new mgeColor((BYTE)0, 0, 63); // dunkelblau

MGE_INFO("(DWORD)c1: %X",(DWORD)c1); // funktioniert nicht

MGE_INFO("(DWORD)*c1: %X,(DWORD)*c1); // funktioniert

mgeColor c2((BYTE)0, 0, 63); // dunkelblau
MGE_INFO("(DWORD)c2: %X", c2); // funktioniert

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

10

27.05.2008, 21:46

Macht auch irgendwie sinn, oder? :p Übrigens: Ich glaube du definierst den Begriff 'Gameengine' etwas komisch... Was haben denn die 'Grundsachen' mit der Spieletechnik zu tun? Die befindet sich doch einige ebenen höher.
@D13_Dreinig

Werbeanzeige