Convert: DirectX in D2D



  • You look so wisely to me...
    I want to convert a Direct2D ID2D1Bitmap into a ID3D10Texture2D. How can I do that. Maybe you know someone ?

    My Code:
    ID2D1Bitmap quellbitmap = ( ...vorhanden );

    ID2D1ResourcePtr resourcebitmap;
    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.

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

    I need this thema, cause I´m writing about 5months on a OIDS-Remake.
    Please help me, I´m from ViennaAustria. Dear Michi.

    Edit:
    Email rausgenommen. Wozu ein Mailadresse. Antworten gibt es hier auch.



  • Wenn Du aus Wien bist kannst Du auch Deutsch schreiben.
    Wozu eine Mailadresse? Antworten kann man hier auch lesen.
    Hilft vielleicht allen.



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

    Wir brauchen: Fertige instanziiertes ID2D1Rendertarget von DXGIFactory über DX10 (wie wir dem Interoperability-Sample entnehmen).
    Also ID3D10DevicePtr m_spDevice und ID2D1RenderTargetPtr RTarget (soll ja jeder haben).

    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 );

    // Nun steht die Textur in DX10 und D2D bereit
    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 );

    Und somit hab ich meine Frage selbst beantwort !!!!!



  • @zodX: Ganz Schußecht bist Du aber nicht...



  • Ja, ja immer dasselbe !
    Gefällt Dir mein Vorschlag (Code) etwa nicht? Haste nen andren Ansatz?
    Ich find die Materie ja zu genüge komplex, sicher kann das einer von Uns gut brauchen... !


Anmelden zum Antworten