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

19.09.2009, 15:17

Von ID2D1Bitmap nach ID3D10Texture2D

Liebe Grüße an Euch alle !

Was man alles mit Direct2D machen kann ?
Kann mir mal einer von Euch verraten wie man eine ID2D1Bitmap nach ID3D10Texture2D konvertiert ?

Im msdn sind viele Beispiele für die genau umgekehrte Konvertierungsrichtung. Weiters habe ich gegoogelt: So um die 0 Treffer genau.

Ich brauch das Zeugs dringend, denn verrat mir doch mal einer wie ich eine ID3D10Texture2D mappe und auch noch
anschliessend in D2D rüberbringe mit der blöden CPUAccessFlag Bremse ? Nachträglich den Desc abändern gibts ja nicht.

Wer von Euch kennt sich mit DXGI und somit auch mit QueryInterface-Calls aus und hat Bock auf Direct2d ? :lol:


Mein Code:

ID2D1Bitmap quellbitmap = ( ...vorhanden );

ID2D1ResourcePtr resource_2d;
IDXGISurfacePtr idxgi_surface1, idxgi_surface2;
IDXGIResourcePtr idxgi_resource1, idxgi_resource2;

quellbitmap -> QueryInterface( __uuidof(ID2D1Resource), (LPVOID*) &resource_2d ); // Von Quelle in Resource funkt noch, einziger guter Ansatz.

quellbitmap -> QueryInterface( __uuidof(IDXGISurface), (LPVOID*) &idxgi_surface1 ); // Geht ned, Zeiger ist Null.
quellbitmap -> QueryInterface( __uuidof(IDXGIResource), (LPVOID*) &idxgi_resource1 ); // Geht ned, Zeiger ist Null.

resource_2d -> QueryInterface( __uuidof(IDXGISurface), (LPVOID*) &idxgi_surface2 ); // Geht ned, Zeiger ist Null.
resource_2d -> QueryInterface( __uuidof(IDXGIResource), (LPVOID*) &idxgi_resource2 ); // Geht ned, Zeiger ist Null.


Weiter komm ich nicht. 8)
Wer von Euch allen hat bloß die richtige Lösung ???
Großen Dank gleich im Vorhinein...


EDIT: Nehme an, es handelt sich um CreateQuery...?

2

19.09.2009, 15:56

Hideehoo zodX und Willkommen an Board!

würde dir empfehlen, diesbezüglich mal die Abschnitte bei MSDN durchzulesen.
http://msdn.microsoft.com/en-us/library/dd370966%28VS.85%29.aspx
fka tm

3

19.09.2009, 16:00

Ich habe bereits ALLES KOMPLETT durchgelesen. 8) Haste nix kapiert, hmmm?? :lol: Darüber ist leider im gesammten Netz nichts zu finden.
Mir ist es ja verdammt ernst, ich habe ja profunde Praxis. Mein Icon ist selbstgerendert. Trotzdem danke Dir schön !

4

19.09.2009, 17:09

Zitat von »"zodX"«

Ich habe bereits ALLES KOMPLETT durchgelesen. 8) Haste nix kapiert, hmmm?? :lol:

Wer hat nix kapiert? Du beim durchlesen, oder ich, weil ich übersehen habe, dass du bei MSDN schon geschaut hast?


Profunde Praxis, selbstgerendertes Icon..., mmh :? *kopf kratz*
fka tm

5

19.09.2009, 18:01

Ich brauch halt einfach den kostenpflichtigen Technischen Kundendienst von Microsoft, hab aber kein Geld dafür.
Die Antwort auf meine Frage kostet etwa mehr wie 80 Euro. Schon ein absolutes Rätsel für jedermann. 8)
Ich schau mal, ich hab da noch zwei Email Adressen von Microsoftarbeitern, vielleicht lassen die was gnädigerweise durchsickern.
Darauf will ich aber nicht zählen, kann mir keiner Helfen ?

Das Gurke

Community-Fossil

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

6

19.09.2009, 19:42

Da du ja schon das "gesamte Netz" durchsucht hast, bin ich mir ziemlich sicher die Antwort auf deine Frage ist "Geht nicht".

7

20.09.2009, 05:51

Hab ich mir auch schon gedacht, aber ich denke mir halt einfach einmal rasch das wäre angenommener Blödsinn.
Die API ist ja brandneu und wird mit Windows7 ausgeliefert, schon ausprobiert ? :lol:
Microsoft denkt sich mal wieder: "Wir haben im msdn die Einführung zu genüge abgedeckt mit Samples, stimmts Jungs ? ".
(Nur fehlen in der kürze der Würze leider wichtige Fakten bzw. Faktoren und mancheines ist sogar verbugt !!). 8)
Von Seitens her wird ja Full Interoperability between D2D u. DX10 angepriesen, bzw geheiligt. Großes Pfadfinderehrenwort !!
Wer kann mir jetzt bitte helfen und kennt sich aus...???

8

20.09.2009, 21:18

Also: Rückwärts gehts so nicht und darum hab ichs nochmal von vorne probiert...

Wir brauchen ein fertig initiiertes, übernommenes ID2D1Rendertarget von DX10 (über DXGIFactory) -> siehe InteroperabilitySample

Also:
ID3D10DevicePtr m_spDevice
und:
ID2D1RenderTargetPtr RTarget



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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
    D3DX10_IMAGE_LOAD_INFO  src_loaddesc;
    ID3D10ResourcePtr       src_Resource;
    ID3D10Texture2DPtr      src_Texture;
    D3D10_TEXTURE2D_DESC    src_desc;
    D3D10_MAPPED_TEXTURE2D  src_mappedTex;
    UCHAR*              src_Texels;

    D3D10_TEXTURE2D_DESC    dest_initDesc;
    ID3D10ResourcePtr       dest_Resource;
    ID3D10Texture2DPtr      dest_Bitmap_DX10;   // Als DX10 fertig

    D3D10_MAPPED_TEXTURE2D  dest_mappedTex;
    UCHAR*              dest_Texels;
    D3D10_SHADER_RESOURCE_VIEW_DESC dest_rvDesc;
    ID3D10ShaderResourceView    *dest_RView = NULL;
    IDXGISurfacePtr         dest_xgiSurface;
    D2D1_BITMAP_PROPERTIES  dest_props;
    ID2D1BitmapPtr          dest_Bitmap_D2D;    // Als D2D fertig

    

    // Die Gewunschene Textur angeben


    ZeroMemory( &src_loaddesc, sizeof(D3DX10_IMAGE_LOAD_INFO) );
    src_loaddesc.MipLevels  = 1;
    src_loaddesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
    src_loaddesc.Usage      = D3D10_USAGE_STAGING;
    src_loaddesc.CpuAccessFlags = D3D10_CPU_ACCESS_READ;
    if ( x!=0 ) src_loaddesc.Width  = x;
    if ( y!=0 ) src_loaddesc.Height = y; 

    D3DX10CreateTextureFromFile( m_spDevice, L"Filename", &src_loaddesc, NULL, &src_Resource, NULL );
    
    src_Resource->QueryInterface(__uuidof(ID3D10Texture2DPtr), (LPVOID*)&src_Texture);

    src_Texture->GetDesc( &src_desc );
    

    // Eine zweite leere Textur erzeugen


    ZeroMemory( &dest_initDesc, sizeof(D3D10_TEXTURE2D_DESC) );
    dest_initDesc.Width         = src_desc.Width;
    dest_initDesc.Height        = src_desc.Height;
    dest_initDesc.MipLevels     = dest_initDesc.ArraySize = 1;
    dest_initDesc.Format        = DXGI_FORMAT_R8G8B8A8_UNORM;
    dest_initDesc.SampleDesc.Count = 1;
    dest_initDesc.Usage         = D3D10_USAGE_DYNAMIC;
    dest_initDesc.BindFlags     = D3D10_BIND_SHADER_RESOURCE;
    dest_initDesc.CPUAccessFlags= D3D10_CPU_ACCESS_WRITE;

    m_spDevice->CreateTexture2D( &dest_initDesc, NULL, &dest_Bitmap_DX10 );

    dest_Bitmap_DX10->QueryInterface(__uuidof(ID3D10ResourcePtr), (LPVOID*)&dest_Resource);
    

    // Gemaskten Alpha dort hineinkopieren

    
src_Texture     ->Map( D3D10CalcSubresource(0, 0, 1), D3D10_MAP_READ,          0, &src_mappedTex  );
    dest_Bitmap_DX10->Map( D3D10CalcSubresource(0, 0, 1), D3D10_MAP_WRITE_DISCARD, 0, &dest_mappedTex );
    src_Texels  = (UCHAR*) src_mappedTex.pData;
    dest_Texels = (UCHAR*)dest_mappedTex.pData;
    for( UINT row = 0; row < src_desc.Height; row++ )
    {
        UINT rowStart = row * src_mappedTex.RowPitch;
        for( UINT col = 0; col < src_desc.Width; col++ )
        {
            UINT colStart = col * 4;
            BYTE r = src_Texels[rowStart + colStart + 0];
            BYTE g = src_Texels[rowStart + colStart + 1];
            BYTE b = src_Texels[rowStart + colStart + 2];
            BYTE a = src_Texels[rowStart + colStart + 3];
            // Wenn ein total SchwarzerPixel

            if ( r==0 && g==0 && b==0 ) a=0;    // dann volle Transparenz ( Transparent=0 Opaque=255 )

            dest_Texels[rowStart + colStart + 0] = r;
            dest_Texels[rowStart + colStart + 1] = g;
            dest_Texels[rowStart + colStart + 2] = b;
            dest_Texels[rowStart + colStart + 3] = a;
        }
    }
    src_Texture     ->Unmap( D3D10CalcSubresource(0, 0, 1) );
    dest_Bitmap_DX10->Unmap( D3D10CalcSubresource(0, 0, 1) );


    // Und noch den ResourceView für die Verwendung von Sprites oder Shadern erzeugen


    ZeroMemory( &dest_rvDesc, sizeof(D3D10_SHADER_RESOURCE_VIEW_DESC) );
    dest_rvDesc.Format      = DXGI_FORMAT_R8G8B8A8_UNORM;
    dest_rvDesc.ViewDimension   = D3D10_SRV_DIMENSION_TEXTURE2D;
    dest_rvDesc.Texture2D.MostDetailedMip = 0;
    dest_rvDesc.Texture2D.MipLevels = 1;
    m_spDevice->CreateShaderResourceView( dest_Resource, &dest_rvDesc, &dest_RView );
    

    // Damit steht jetzt die Textur in DX10 und D2D gleichermaßen zur Verfügung...


    dest_Bitmap_DX10->QueryInterface(__uuidof(IDXGISurfacePtr), (LPVOID*)&dest_xgiSurface);
    dest_props = D2D1::BitmapProperties( D2D1::PixelFormat( DXGI_FORMAT_UNKNOWN ,D2D1_ALPHA_MODE_PREMULTIPLIED), 96, 96 ); //Only with Format_Unknown!

    RTarget->CreateSharedBitmap(__uuidof(IDXGISurfacePtr), dest_xgiSurface, &dest_props, &dest_Bitmap_D2D );



:roll: Und somit hab ich meine Frage selbst beantwort !!!!!
P.S.: etwa ID2D1RenderTargetPtr ist genauso gut wie ID2D1RenderTarget* abc=NULL;



Edit von TrikkieMikkie:
Bitte Codetags verwenden!

K-Bal

Alter Hase

Beiträge: 703

Wohnort: Aachen

Beruf: Student (Elektrotechnik, Technische Informatik)

  • Private Nachricht senden

10

21.09.2009, 07:57

Eigentlich D2D und Direct2D.

Werbeanzeige