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

Tobiking

1x Rätselkönig

  • »Tobiking« ist der Autor dieses Themas
  • Private Nachricht senden

1

09.08.2003, 14:08

Texturen aus rgb daten erstellen (wie ?)

Ich bin immer noch dabei Quake 3 Levels zu laden und stehe nun bei den Lightmaps. Sie sind nicht wie die Texturen extra dabei sondern in der Datei mit gespeichert. Gelesen kriege ich alles nur ich habe dann ein Array im Format: byte imageBits[128][128][3];
Also die Lightmaps sind ebend immer 128x128 groß und es werden die rgb werte gespeichert für jeden wert. Das Problem was ich nun habe ist wie kriege ich daraus jetzt eine Textur ? Ich habe eine Möglichkeit im Internet gefunden aber da gibt es Probleme.

Quellcode

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
CrearTexturaLightmap(int indice, byte pMapaDeBits[128][128][3], int ancho, int alto)
{
D3DXCreateTexture(m_pD3DDev,128,128,0,0,D3DFMT_R5G6B5,D3DPOOL_MANAGED,&m_pLightmap[i]);

    IDirect3DSurface8 *TextureSurface; 

    m_pLightmap[indice]->GetSurfaceLevel(0, &TextureSurface); 
 
    D3DLOCKED_RECT pLockedRect; 
    RECT rectangleToLock; 
    rectangleToLock.top = 0; 
    rectangleToLock.left = 0; 
    rectangleToLock.bottom = 128; 
    rectangleToLock.right = 128;

    if(FAILED(TextureSurface->LockRect(&pLockedRect,NULL,0 ))) 
        PostQuitMessage(0); 

    USHORT* pData = (USHORT*)pLockedRect.pBits; 

    for(int p = 0; p<128;p++) 
    {
        for(int q = 0; q<128; q++) 
        {
            WORD r = pMapaDeBits[q][p][0]>>3;
            WORD g = pMapaDeBits[q][p][1]>>2;
            WORD b = pMapaDeBits[q][p][2]>>3;
            WORD lightmap_pixel_565 =RGB_16BIT565 (r,g,b);
            pData[(q * (pLockedRect.Pitch/2)) + p] = lightmap_pixel_565;
        }
    }

    if(FAILED(TextureSurface->UnlockRect())) 
        PostQuitMessage(0); 

    TextureSurface->Release();
}


Naja ist Spanisch aber sollte man verstehen können. Mein 1. Problem war das in der Zeile
WORD lightmap_pixel_565 =RGB_16BIT565 (r,g,b);
bei mir das RGB_16BIT565 unbekannt ist. Es ist ein DX8 Beispiel kann sein das es das bei 9 nicht mehr gibt. Ich habe dann mal D3DCOLOR_XRGB(r,g,b) versucht und die Lightmaps wurden alle grün. Habe auch mal versucht eine 32 Bit Textur zu erstellen aber alles klappte nicht so wie es soll. Weiß jemand wie es genau aussehen muss oder ob es auch ne andere Möglichkeit gibt ?

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

09.08.2003, 14:19

Hi!
Hier habe ich mal eine kleine Funktion (extra für Dich :)) geschrieben. Du übergibst ihr das Array und sie liefert Dir eine Textur.

Quellcode

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
void WINAPI fillCallback(D3DXVECTOR4* p_out,
                         const D3DXVECTOR2* p_coords,
                         const D3DXVECTOR2* p_texelSize,
                         void* p_data)
{
    int x = (int)(p_coords->x * 127);
    int y = (int)(p_coords->y * 127);

    BYTE* p_rgb = (BYTE*)(p_data);

    p_out->x = (float)(p_rgb[y * 384 + x * 3]) / 255.0f;
    p_out->y = (float)(p_rgb[y * 384 + x * 3 + 1]) / 255.0f;
    p_out->z = (float)(p_rgb[y * 384 + x * 3 + 2]) / 255.0f;
    p_out->w = 1.0f;
}

LPDIRECT3DTEXTURE9 createLightMap(BYTE* p_data,
                                  D3DFORMAT format,
                                  UINT numLevels,
                                  LPDIRECT3DDEVICE9 p_d3dDevice)
{
    LPDIRECT3DTEXTURE9 p_texture;

    // Textur erstellen
    D3DXCreateTexture(p_d3dDevice, 128, 128, numLevels, D3DUSAGE_WRITEONLY, format,
                      D3DPOOL_DEFAULT, &p_texture);

    // Textur mit den Daten füllen
    D3DXFillTexture(p_texture, fillCallback, p_data);

    return p_texture;
}


Edit: Fehler verbessert.

Ich weiß nicht, ob es so korrekt ist, aber es müsste eigentlich gehen.

Tobiking

1x Rätselkönig

  • »Tobiking« ist der Autor dieses Themas
  • Private Nachricht senden

3

09.08.2003, 14:54

Ich hab es gleich mal ausprobiert und irgendwie will es nicht so ganz klappen. Das erste Problem war der wollte das Array nicht so nehmen und hab das dann so gelöst:

Quellcode

1
g_pD3DLightmaps[i] = createLightMap((unsigned char *)(&g_pLightmaps[i].imageBits), D3DFMT_X8R8G8B8, 4, g_pD3DDevice);

Ich hoffe da ist nicht schon ein Fehler. 2. Problem war da die funktion fillCallback void am anfang stehen hat funktioniert das return pixel; nicht. Habe in der DX Doku nachgeschaut und es wird ja p_out automatisch übergeben. Also aus pixel habe ich p_out gemacht und das return gelöscht. Jetzt compiliert es aber das Programm bricht immer ab. Im Debugger kommt der Fehler immer bei D3DXFillTexture.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

09.08.2003, 14:57

Ups, ja, natürlich. Pixel nicht als Rückgabewert, sondern einfach den Pointer verändern. Bei Deiner Konvertierung ist ein Fehler. Das "&" muss weg. Ein Array an sich ist immer schon eine Adressangabe.

Tobiking

1x Rätselkönig

  • »Tobiking« ist der Autor dieses Themas
  • Private Nachricht senden

5

09.08.2003, 15:25

Ich habe das & weg gemacht aber der bricht immer noch bei der D3DXFillTexture Funktion ab. Die fillCallback Methode sieht zur Zeit so bei mir aus:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void WINAPI fillCallback(D3DXVECTOR4* p_out, 
                         const D3DXVECTOR2* p_coords, 
                         const D3DXVECTOR2* p_texelSize, 
                         void* p_data) 
{ 
    int x = (int)(p_coords->x * 127); 
    int y = (int)(p_coords->y * 127); 

    BYTE* p_rgb = (BYTE*)(p_data); 

    //D3DXVECTOR4 pixel; 
    p_out->x = p_rgb[y * 384 + 3 * x]; 
    p_out->y = p_rgb[y * 384 + 3 * x + 1]; 
    p_out->z = p_rgb[y * 384 + 3 * x + 2]; 
    p_out->w = 1.0f; 

    //return pixel; 
}


Habe bis auf das p_out nichts geändert. Und der bricht auch sofort bei der ersten Lightmap ab. Es wird nichtmals ein Wert zurückgeliefert von der Funktion. Der aufruf sieht jetzt so aus:

Quellcode

1
g_pD3DLightmaps[i] = createLightMap((unsigned char *)(g_pLightmaps[i].imageBits), D3DFMT_X8R8G8B8, 4, g_pD3DDevice);


hab es aber so auch schon versucht:

Quellcode

1
g_pD3DLightmaps[i] = createLightMap((unsigned char *)g_pLightmaps[i].imageBits, D3DFMT_X8R8G8B8, 4, g_pD3DDevice);

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

6

09.08.2003, 15:30

Starte es mal im Debug-Modus und sage mal genau, wo er abbricht (welche Zeile) und mit welcher Fehlermeldung.

Tobiking

1x Rätselkönig

  • »Tobiking« ist der Autor dieses Themas
  • Private Nachricht senden

7

09.08.2003, 15:39

Also es kommt der Fehler: "Unbehandelte Ausnahme in Q3.exe 0xC0000005: Access Violation"

Im Debug Fenster steht folgendes:

_D3DXFillTexture@12:
00404314 push ebp
00404315 lea ebp,[esp-6Ch]
00404319 sub esp,0DCh
0040431F push ebx
00404320 push esi
00404321 xor esi,esi
00404323 lea ecx,[ebp+20h]
00404326 mov dword ptr [ebp+68h],esi
00404329 call D3DXTex::CLockSurface::CLockSurface (00413925)
0040432E mov ebx,dword ptr [ebp+74h]
00404331 cmp ebx,esi
00404333 jne _D3DXFillTexture@12+2Bh (0040433f)
00404335 mov esi,8876086Ch
0040433A jmp _D3DXFillTexture@12+0ACh (004043c0)
0040433F cmp dword ptr [ebp+78h],esi
00404342 je _D3DXFillTexture@12+21h (00404335)
--> 00404344 mov eax,dword ptr [ebx]
00404346 push ebx
00404347 call dword ptr [eax+34h]
0040434A lea ecx,[ebp-20h]
0040434D push ecx
0040434E push esi
0040434F mov dword ptr [ebp+4Ch],eax
00404352 mov eax,dword ptr [ebx]
00404354 push ebx
00404355 call dword ptr [eax+44h]
00404358 cmp eax,esi
0040435A jge _D3DXFillTexture@12+4Ch (00404360)
0040435C mov esi,eax
0040435E jmp _D3DXFillTexture@12+0ACh (004043c0)
00404360 mov eax,dword ptr [ebp-8]

---> ist die stelle wo der gelbe Pfeil drauf zeigt.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

8

09.08.2003, 15:51

Versuch mal:
- nur eine MIP-Map zu erzeugen
- 0 anstatt D3DUSAGE_WRITEONLY anzugeben
- herauszufinden, ob D3DXCreateTexture überhaupt erfolgreich ausgeführt wird (SUCCEEDED)

Tobiking

1x Rätselkönig

  • »Tobiking« ist der Autor dieses Themas
  • Private Nachricht senden

9

09.08.2003, 16:43

Juhu jetzt klappt es! Es lag an den Mip Maps. Jetzt funktioniert alles und muss nur noch das mit dem Multitexturing hinkriegen aber da werd ich erstmal alleine basteln und das steht ja gut genug im Buch erklärt.

Danke !!!

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

10

09.08.2003, 18:07

Versuch's nochmal mit MIP-Maps, dafür aber mit D3DPOOL_MANAGED anstatt D3DPOOL_DEFAULT.

Werbeanzeige