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

Crazy007

Treue Seele

  • »Crazy007« ist der Autor dieses Themas

Beiträge: 186

Wohnort: Tirol

  • Private Nachricht senden

1

02.08.2013, 13:20

Textur laden in DirectX11.1

Hallo,
ich bin gerade dabei etwas in DirectX zu erstellen und bin jetzt am Teil angekommen eine Textur zu laden.
Mein Buch und sämtliche andere Tutorials machen das ganze mit D3DX11CreateShaderResourceViewFromFile, jedoch wurde D3DX im neuen DirectX herausgenommen.
Die einzigen alternativen die ich finde sind DirectXTK und DirectXTex jedoch findet man nirgens im Internet wie man das ganze jetzt in seinem Projekt verwendet.
Es kann doch nicht sein, dass ein Update eine solche grundlegende Funktion wie das laden von Texturen streicht!
Wie könnte ich eine Textur noch laden?
Danke im Voraus,
Crazy007
Der Error sitzt meistens vor dem Bildschirm! :D

Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

2

02.08.2013, 13:39

Ich mache das ganz ohne D3DX, wenn auch mit DirectX11 und nicht 11.1. Allerdings sollten die Unterschiede nicht so groß sein.
Ich benutze FreeImage zum Laden der Rohdaten und erstelle die Texture-Resource und die Shader Resource View selber. Ich hab grad hier nicht meinen Sourcecode zur Verfügung, aber falls du da ein paar Funktionsnamen brauchst, kann ich dir die später raussuchen.
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

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

Crazy007

Treue Seele

  • »Crazy007« ist der Autor dieses Themas

Beiträge: 186

Wohnort: Tirol

  • Private Nachricht senden

3

02.08.2013, 13:44

Ok danke schonmal. :)
Der Error sitzt meistens vor dem Bildschirm! :D

Crazy007

Treue Seele

  • »Crazy007« ist der Autor dieses Themas

Beiträge: 186

Wohnort: Tirol

  • Private Nachricht senden

4

02.08.2013, 16:33

Ich bin jetzt soweit dass ich das Bild mit Hilfe von FreeImage geladen habe jedoch habe ich keine Ahnung wie ich daraus eine ShaderResourceView mache.
Kennt jemand vielleicht ein gutes Tutorial dazu oder kann mir jemand einen Tipp geben?
Der Error sitzt meistens vor dem Bildschirm! :D

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

5

02.08.2013, 16:41

Wo genau liegt das Problem? Du musst eben eine Textur erzeugen (z.B. mit ID3D11Device::CreateTexture2D()) und mit den Daten füllen...

Crazy007

Treue Seele

  • »Crazy007« ist der Autor dieses Themas

Beiträge: 186

Wohnort: Tirol

  • Private Nachricht senden

6

02.08.2013, 17:04

Bis jetzt sieht mein Code folgendermaßen aus:

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
//Load the Image
    FREE_IMAGE_FORMAT fif = FIF_UNKNOWN;
    FIBITMAP *dib = NULL;
    BYTE *bits = NULL;
    unsigned int width, height;

    fif = FreeImage_GetFileType(filename, 0);

    if(fif == FIF_UNKNOWN) 
        fif = FreeImage_GetFIFFromFilename(filename);

    if(fif == FIF_UNKNOWN)
        return false;

    if(FreeImage_FIFSupportsReading(fif))
        dib = FreeImage_Load(fif, filename);

    if(!dib)
        return false;

    bits = FreeImage_GetBits(dib);

    width = FreeImage_GetWidth(dib);
    height = FreeImage_GetHeight(dib);

    if((bits == 0) || (width == 0) || (height == 0))
        return false;

    Vertex vertices[] =
    {
        {XMFLOAT3(width/2, height/2, 1.0f)},
        {XMFLOAT3(width/2, -(height/2), 1.0f)},
        {XMFLOAT3(-(width/2), -(height/2), 1.0f)},
        {XMFLOAT3(-(width/2), -(height/2), 1.0f)},
        {XMFLOAT3(-(width/2), height/2, 1.0f)},
        {XMFLOAT3(width/2, height/2, 1.0f)}
    };
    D3D11_TEXTURE2D_DESC textureDesc;
    textureDesc.Width = width;
    textureDesc.Height = height;
    textureDesc.MipLevels = 1;
    textureDesc.ArraySize = 1;
    textureDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
    textureDesc.SampleDesc.Count = 1;
    textureDesc.Usage = D3D11_USAGE_DYNAMIC;
    textureDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
    textureDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
    textureDesc.BindFlags = NULL;

    if(!d3dDevice->CreateTexture2D(&textureDesc, NULL, &texture))
        return false;


Ich glaub ich steh gerade auf der Leitung. Irgendwas fehlt doch ich weiß einfach nicht was.
Wie soll ich meiner Textur das geladene PNG übergeben?
Der Error sitzt meistens vor dem Bildschirm! :D

Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

7

02.08.2013, 17:25

So sieht der Konstruktor meiner Textureklasse aus:

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
Texture2DImpl::Texture2DImpl(ID3D11DevicePtr device, int width, int height, GPUInterface::ColorFormat format, void* data)
{
    /* Fill out texture desc */
    D3D11_TEXTURE2D_DESC desc;
    desc.Width = width;
    desc.Height = height;
    desc.MipLevels = 1; /* TODO: Allow specifiying */
    desc.ArraySize = 1;
    desc.Format = Utils::ColorFormatToDXFormat (format);
    desc.SampleDesc.Count = 1;
    desc.SampleDesc.Quality = 0;
    desc.Usage = D3D11_USAGE_IMMUTABLE;
    desc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
    desc.CPUAccessFlags = 0;
    desc.MiscFlags = 0;

    /* As we are immutable, init subresource data now. */
    D3D11_SUBRESOURCE_DATA srd;
    srd.pSysMem = data;
    srd.SysMemPitch = Utils::GetPitch (width, format);
    srd.SysMemSlicePitch = 0;

    /* Create */
    HRESULT hr = device->CreateTexture2D (&desc, &srd, &m_texture);
    if (FAILED (hr))
    {
        throw std::exception ("Failed to create texture");
    }

    CreateSrvAndSamplerState (device, format);
}


und dann brauchst du natürlich noch CreateSrvAndSamplerState

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
void Texture2DImpl::CreateSrvAndSamplerState (ID3D11DevicePtr device, GPUInterface::ColorFormat format)
{
    /* And now create the resource view for it */
    D3D11_SHADER_RESOURCE_VIEW_DESC srvd;
    srvd.Format = Utils::ColorFormatToDXFormat (format);
    srvd.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
    srvd.Texture2D.MipLevels = -1;
    srvd.Texture2D.MostDetailedMip = 0;

    HRESULT hr = device->CreateShaderResourceView (m_texture, &srvd, &m_srv);
    if (FAILED(hr))
    {
        throw std::exception ("Failed to create shader resource view");
    }

    /* And the sampler state */
    D3D11_SAMPLER_DESC sd;

    sd.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR; /* TODO: Allow specificying */
    sd.AddressU = D3D11_TEXTURE_ADDRESS_CLAMP;
    sd.AddressV = D3D11_TEXTURE_ADDRESS_CLAMP;
    sd.AddressW = D3D11_TEXTURE_ADDRESS_CLAMP;
    sd.MipLODBias = 0;
    sd.MaxAnisotropy = 1; /* TODO: Allow specifying */
    sd.ComparisonFunc = D3D11_COMPARISON_NEVER;
    sd.BorderColor[0] = 0.0f;   sd.BorderColor[1] = 0.0f;   sd.BorderColor[2] = 0.0f;   sd.BorderColor[3] = 0.0f;
    sd.MinLOD = 0;
    sd.MaxLOD = D3D11_FLOAT32_MAX;

    hr = device->CreateSamplerState (&sd, &m_sampler);
    if (FAILED (hr)) {
        throw std::exception ("Failed to create sample state.");
    }
}


Width, Height, das Farbformat und die Daten an sich kommen natürlich aus FreeImage, mehr oder weniger direkt.
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

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

Crazy007

Treue Seele

  • »Crazy007« ist der Autor dieses Themas

Beiträge: 186

Wohnort: Tirol

  • Private Nachricht senden

8

02.08.2013, 17:36

Danke Legend!
Das hilft mir sicher weiter!
Ich hätte noch eine Frage: Was genau ist der 5. Parameter deines Konstruktors(void* data)?
Der Error sitzt meistens vor dem Bildschirm! :D

Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

9

02.08.2013, 17:37

Das Ergebnis von FreeImage_GetBits. Bei dir bits.
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

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

Crazy007

Treue Seele

  • »Crazy007« ist der Autor dieses Themas

Beiträge: 186

Wohnort: Tirol

  • Private Nachricht senden

10

02.08.2013, 17:45

Ah! Jetzt wird mir alles klar! Danke!
Nur noch eine letzte Frage: Was ist die Utils::GetPitch Funktion? Hast du die selbst geschrieben?
Der Error sitzt meistens vor dem Bildschirm! :D

Werbeanzeige