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

Nexxtron

Alter Hase

  • »Nexxtron« ist der Autor dieses Themas

Beiträge: 424

Wohnort: Heilbronn

Beruf: Student - Software Engineering

  • Private Nachricht senden

1

02.01.2010, 18:12

D3DSURFACE_DESC::Height und Width

hi all,

ich bins mal wieder mit einem neuen kleinen Problemchen ich schreib gerade eine Spriteklasse die halt Bilder lädt und dabei lad ich die textur und les mit D3DSURFACE_DESC die Width und Height meines Bildes aus und würde gerne so groß auch mein TexturQuad ( wenn man dass so nennt , also die Vier Punkte in denen ich meine Textur render ) machen aber Width und Height wird in Pixel zurückgegeben und ich brauch irgend ne andere längeneinheit für die Breite meines Rects ( also TexturQuads ).

hier mal code zur veranschaulichung:

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
void CSprite::Load(string sFilename)
{
    D3DXCreateTextureFromFile(g_App.GetDevice(), sFilename.c_str(), &m_Sprite);
    m_Sprite->GetLevelDesc(0, &m_Surface);
    m_fHeight = m_Surface.Height;
    m_fWidth  = m_Surface.Width;

    D3DVERTEX Rect[4];
    Rect[0].init( 0 , 0 , 10 , 1, 1);
    Rect[1].init( m_fWidth, 0 , 10, 0, 1);
    Rect[2].init( 0, m_fHeight, 10, 1, 0);
    Rect[3].init( m_fWidth , m_fHeight, 10,0,0);

    g_App->CreateVertexBuffer(sizeof(Rect),
                                      D3DUSAGE_WRITEONLY,
                                      D3DFVF_CUSTOMVERTEX,
                                      D3DPOOL_MANAGED,
                                      &m_VBf,
                                      NULL);

//lock buffer

m_VBf->Lock(0,sizeof(Rect),(void**)&pData,0);
//copy data to buffer

memcpy(pData,Rect,sizeof(Rect));
//unlock buffer

m_VBf->Unlock();
vRot = D3DXVECTOR3(0,0,0);
m_dRotation = 0;
}


so geht das nich da mein Bild aufm Bildschirm irgendwie immer viel zu groß wird als 32x32 Pixel, da ja die Position D3DFVF_XYZ nicht 1 Pixel entspricht.... geht das auch anders...?
New Project: Operation CityRacer

Databyte

Alter Hase

Beiträge: 1 040

Wohnort: Na zu Hause

Beruf: Student (KIT)

  • Private Nachricht senden

2

02.01.2010, 19:23

Hmmm... also Die TextureCoordinate [1.0 | 1.0] ist genau in der rechen unteren Ecke der Texture egal wie groß die ist...

Wenn deine texture 256 px breit ist, du aber nur die Hälfte haben willst, musst du 0.5 angeben...
Hoffe das ist es was du meintest...


EDIT:

Seh gerade, dass du das wahrscheinlich nicht meintest...
Nun richtige Antwort:
Es kommt dabei darauf an, dass du entweder mit D3DFVF_XYZRHW renderst oder die richtige Projektions-Matrix hast... dann kannst du auch
die ganzen sachen in Pixeln angeben, wie in sdl, etc...


Hier ein kleines Beispiel zur Erzeugung einer Projektionsmatrix(Format: D3DFVF_XYZ):

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
D3DXMATRIX tmp;
D3DXMATRIX tmp2;
        
D3DXMatrixScaling(&tmp2, 1.0f, -1.0f, 1.0f);
D3DXMatrixOrthoOffCenterLH(&tmp, 0, (float)800, 0, (float)600, 0.0f, 1.0f);
D3DXMatrixMultiply(&tmp, &tmp, &tmp2);


        
ct::Graphics::Inst()->SetTransform(D3DTS_WORLD,         (D3DMATRIX*)&wolrd);
ct::Graphics::Inst()->SetTransform(D3DTS_VIEW,              (D3DMATRIX*)&identy);
ct::Graphics::Inst()->SetTransform(D3DTS_PROJECTION,        (D3DMATRIX*)&tmp);

Nexxtron

Alter Hase

  • »Nexxtron« ist der Autor dieses Themas

Beiträge: 424

Wohnort: Heilbronn

Beruf: Student - Software Engineering

  • Private Nachricht senden

3

02.01.2010, 22:36

k thx, aber mir is es eigentlich egal ob ich in pixel rechne aber möchte nur eigentlich die echte breite von meinem Bild haben dass ich es in der Funktion so wie oben angeben kann und das Bild dann genauso groß ist wie das orginale
New Project: Operation CityRacer

Nexxtron

Alter Hase

  • »Nexxtron« ist der Autor dieses Themas

Beiträge: 424

Wohnort: Heilbronn

Beruf: Student - Software Engineering

  • Private Nachricht senden

4

13.01.2010, 20:09

habe jetzt mal den Code von dir genommen und mal versucht aber irgendwie komm ich net drauf welche position ich eingebn muss wenn ich z.B. meine Weltmatrix zu posi 0,0,0 setzte und da mein viereck rendere komm nichts..
New Project: Operation CityRacer

Databyte

Alter Hase

Beiträge: 1 040

Wohnort: Na zu Hause

Beruf: Student (KIT)

  • Private Nachricht senden

5

13.01.2010, 21:01

Also der Code oben ist richtig für identy muss du natürlich eine Identitätsmatrix einsetzten... und für die Weltmatrix am besten auch.
Wichtig sind noch folgende 2 sachen:

C-/C++-Quelltext

1
2
m_Device->SetFVF(D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1);
m_Device->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);

Beim Culling bin ich auch drauf reingefallen.. hat evig gedauert bis ich den Fehler hatte....

Wenn das auch nicht geht, poste nochmal ein bisl code

Nexxtron

Alter Hase

  • »Nexxtron« ist der Autor dieses Themas

Beiträge: 424

Wohnort: Heilbronn

Beruf: Student - Software Engineering

  • Private Nachricht senden

6

13.01.2010, 22:15

ehmm irgendwie funktionierts immer noch nich wo is da der Nullpunkt in der mitte oder in der Ecke?

also hab alles so gemacht wie beschrieben außer der Skalierungsmatrix...

so ich weiß jetzt nich grad was ich posten soll aber ich poste jetzt mal irgendwas:

C-/C++-Quelltext

1
2
3
4
D3DXMATRIX tmp; 
D3DXMatrixOrthoOffCenterLH(&tmp, 0, (float)800, 0, (float)600, 0.0f, 1.0f); 
m_pDirect3DDevice->SetTransform(D3DTS_PROJECTION,&tmp);
m_pDirect3DDevice->SetTransform(D3DTS_VIEW,D3DXMatrixIdentity(&tmp));


so hab ich es gemacht

und so sieht meine funktion zum setzen aus

C-/C++-Quelltext

1
rechts = NewPlayer(40.0f,200.0f,10,0.4f, true, 1); // ( xpos, ypos, width, height , unwichtige parameter...)


meine erstellung des quads

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
void CSprite::Load(string sFilename,float height, float width, sColor clColorkey)
{
    D3DLOCKED_RECT m_lockedRect;
    D3DXCreateTextureFromFile(g_App.GetDevice(), sFilename.c_str(), &m_pSprite);
    m_pSprite->GetLevelDesc(0, &m_Surface);
    m_fHeight = height;
    m_fWidth  = width;

    D3DVERTEX Rect[4];
    Rect[0].init( 0 , 0 , 0 ,D3DCOLOR_RGBA(0,0,0,0), 0, 0);// ( xpod,ypos,zpos,farbe,texurkoordinaten u, v)

    Rect[1].init( 0, m_fHeight , 0,D3DCOLOR_RGBA(0,0,0,0), 0, 1);
    Rect[2].init( m_fWidth, 0, 0,D3DCOLOR_RGBA(0,0,0,0), 1, 0);
    Rect[3].init( m_fWidth , m_fHeight, 0,D3DCOLOR_RGBA(0,0,0,0),1,1);


    g_App->CreateVertexBuffer(sizeof(Rect),
                                      D3DUSAGE_WRITEONLY,
                                      D3DFVF_CUSTOMVERTEX,
                                      D3DPOOL_MANAGED,
                                      &m_VBf,
                                      NULL);
//lock buffer

m_VBf->Lock(0,sizeof(Rect),(void**)&pData,0);
//copy data to buffer


memcpy(pData,Rect,sizeof(Rect));
//unlock buffer

m_VBf->Unlock();
vRot = D3DXVECTOR3(0,0,0);
m_dRotation = 0;
}

joaa des wars
New Project: Operation CityRacer

Databyte

Alter Hase

Beiträge: 1 040

Wohnort: Na zu Hause

Beruf: Student (KIT)

  • Private Nachricht senden

7

14.01.2010, 17:09

Die Skalierungsmatrix brauchst du, damit der Ursprung oben links ist... sonst ist er unten links

Und das 800 und das 600 musst du an deine Fenstergröße anpassen.

Nexxtron

Alter Hase

  • »Nexxtron« ist der Autor dieses Themas

Beiträge: 424

Wohnort: Heilbronn

Beruf: Student - Software Engineering

  • Private Nachricht senden

8

14.01.2010, 22:54

k habe jetzt die skalierungsmatrix eingesetzt und die Fenstergröße angepasst, aber das programm startet und zeigt
einen schwarzen bildschirm an und nich meine vierecke...
irgendwo is wieder so ein bekackter Fehler :evil:
New Project: Operation CityRacer

Nexxtron

Alter Hase

  • »Nexxtron« ist der Autor dieses Themas

Beiträge: 424

Wohnort: Heilbronn

Beruf: Student - Software Engineering

  • Private Nachricht senden

9

16.01.2010, 16:04

GELÖST: lag daran dass ich die vierecke 10 einheiten in die tiefe gerendert habe obwohl es nur 1 einheit in die tiefe geht
danke nochmal an Databyte
New Project: Operation CityRacer

Werbeanzeige