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

1

06.12.2012, 21:31

Textur laden ohne D3DX

Guten Abend alle miteinander!

Ich wollte hier eine Frage stellen nachdem ich schon ein Weilchen auf der Suche bin. Und zwar: Gibt es die Möglichkeit, eine Textur ohne die Benutzung von D3DX zu laden? Also ohne D3DXLoadTextureFrom[File/Memory/...] sondern (nur ein Beispiel: Nehmen wir an ich habe Texturdaten im DXT3 oder DXT5 Format komprimiert vorliegen. Ich weiß, dass diese gültig sind und möchte diese nun als Textur laden.)

Ich bitte dabei folgendes zu beachten / respektieren:

  • Ich möchte keine externe Bibliothek verwenden wenn nicht absolut zwingend erforderlich
  • Ich möchte KEIN D3DX nutzen wenn nicht zwingend erforderlich
  • Bitte keine Fragen wie: "Und was soll dir das bringen?" :) Ich möchte wissen ob und wie es geht. Der Interesse halber.
Ich bedanke mich im Voraus für eventuelle Antworten, ob mehr oder weniger hilfreich!

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

06.12.2012, 21:38

Ob das geht ist keine besonders clevere Frage. Klar geht das. Wieso auch nicht?
Wenn du ganz ohne externe Libraries auskommen willst, musst du deinen eigenen Dekoder für JPEG, PNG, ... (was auch immer du laden willst) programmieren. Also musst du dir die Spezifikation für diese Dateiformate aus dem Internet suchen. Aber sei gewarnt: so ein Dateiformat kann verdammt kompliziert sein und wenn du alle Features unterstützen willst, kannst du locker ein paar Monate Arbeit allein dafür einplanen.
Andere Bilddateiformate wie BMP sind einfacher zu laden, ich empfehle damit zu beginnen.
Also, vereinfacht: Datei öffnen, Bilddaten rausholen, Textur mit der passenden Größe/Format erzeugen, Bilddaten in die Textur schreiben, fertig.

FSA

Community-Fossil

  • Private Nachricht senden

3

06.12.2012, 21:48

Ich habe vor ewiger Zeit mal ein BMP loader geschrieben. Um an die Daten ranzukommen, war folgender Code zuständig:

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
FILE* filePtr;
    int error;
    unsigned int count;
    BITMAPFILEHEADER bitmapFileHeader;
    BITMAPINFOHEADER bitmapInfoHeader;
    int imageSize, i, j, k, index;
    unsigned char* bitmapImage;
    unsigned char height;

    error = fopen_s(&filePtr, pcHeightMap, "rb");
    if(error != 0)
    {
        FF_ERROR("Heightmap konnte nicht geöffnet werden!", false);
    }

    count = fread(&bitmapFileHeader, sizeof(BITMAPFILEHEADER), 1, filePtr);
    if(count != 1)
    {
        return false;
    }

    fread(&bitmapInfoHeader, sizeof(BITMAPINFOHEADER), 1, filePtr);
    if(count != 1)
    {
        return false;
    }

    m_iTerrainWidth = bitmapInfoHeader.biWidth;
    m_iTerrainHeight = bitmapInfoHeader.biHeight;

    imageSize = m_iTerrainWidth * m_iTerrainHeight * 3;

    bitmapImage = new unsigned char[imageSize];
    if(!bitmapImage)
    {
        FF_ERROR_NULL_POINTER(bitmapImage, false);
    }

    fseek(filePtr, bitmapFileHeader.bfOffBits, SEEK_SET);

    count = fread(bitmapImage, 1, imageSize, filePtr);
    if(count != imageSize)
    {
        FF_ERROR("Datei konnte nicht gelesen werden!", false);
    }

    error = fclose(filePtr);
    if(error != 0)
    {
        FF_ERROR("Datei konnte nicht geschlossen werden!", false);
    }

Das ganze ist nur unter Graustufen BMP getestet! Vielleicht hilft es dir.

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

4

06.12.2012, 22:11

Hallo, danke für die Antworten!

Okay. Klar, mir ist bewusst, dass Formate sehr kompliziert sein können etc. etc. Es gibt nicht ohne Grund diese ganzen "großen" Libraries, das ist mir klar :)

Ich hatte mir auch nicht zum Ziel gesetzt, jedes nur erdenkliche Bildformat ohne Bibliothek zu unterstützen, sondern es ging mir mehr um einige wenige und vielleicht auch ein eigenes Format zu entwickeln (Nur, um es mal gemacht zu haben und zu sehen was da so drin steckt. Dabei geht es nicht um eigene Algorithmen zur Komprimierung und was nicht alles...).

Meine Theorie ist also: Ich muss irgendwie die Rohdaten erhalten je nach Textur bzw. eine Textur im passenden Format anlegen (z.B. A8R8G8B8) und dann die Textur "locken" (wie einen Vertex buffer?) um dann meine "Rohdaten" (wie immer ich diese auch erhalte) dann schreiben und wieder "unlocken". Sehe ich das grob richtig?

Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

5

06.12.2012, 22:21

Du siehst das grob richtig, ja.
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

6

08.12.2012, 09:54

Es geht auch gar nicht darum, die Daten irgendwie in den Hauptspeicher zu kriegen, sondern aus Textur-Rohdaten eine D3D-Textur auf der Grafikkarte anzulegen. Wie gesagt, Kyoril sieht das schon richtig, welche Funktionen er konkret benutzen muss, findet man relativ leicht in der DirectX Dokumentation.
Lieber dumm fragen, als dumm bleiben!

7

10.12.2012, 15:43

Ja, vielen Dank nochmal für die Tipps und die Bestätigung :) Ich komme nun klar.

Es ging mir wirklich nicht darum, wie ich Rohdaten einer Textur aus einer Datei in irgend einem Format lade, sondern wie ich vorhandene Daten an die Grafikkarte schicke - korrekt.

FSA

Community-Fossil

  • Private Nachricht senden

8

10.12.2012, 17:13

Oh entschuldige. Dann habe ich natürlich Quatsch geschrieben ;)

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

Werbeanzeige