2009-08-03 25 views
0

Ich versuche, die Texel einer bereits geladenen Textur zu ändern.SlimDX (DirectX10) - Wie man ein Texel in der Textur ändert?

Meine Annahme war die Verwendung der Texture2D :: Map und UnMap-Funktionen, aber es gibt keine Änderung, wenn ich die Daten von bestimmten DataRectangle ändern.

Ich brauche ein einfaches Beispiel wie, Erstellen einer Textur von 128 x 128 mit einem Farbverlauf von schwarz nach weiß von jeder Seite.

Thx

ps: Ein Direct3D-10-C++ Beispiel auch helfen kann, SlimDX nur ein Wrapper ist und die gleichen Funktionen nahezu abgeschlossen hat.

Antwort

2

Das ist mein D3D10 2D-Textur loader

bool D3D10Texture::Init(GFXHandler* pHandler, unsigned int usage, unsigned int width, unsigned int height, unsigned int textureType, bool bMipmapped, void* pTextureData) 
{ 
    mMipmapped  = bMipmapped; 

    //SetData(pHandler, 0); 

    D3D10Handler* pD3DHandler = (D3D10Handler*)pHandler; 
    ID3D10Device* pDevice  = pD3DHandler->GetDevice(); 

    DXGI_SAMPLE_DESC dxgiSampleDesc; 
    dxgiSampleDesc.Count = 1; 
    dxgiSampleDesc.Quality = 0; 

    D3D10_USAGE d3d10Usage; 
    if (usage & RU_All_Dynamic) d3d10Usage = D3D10_USAGE_DYNAMIC; 
    else       d3d10Usage = D3D10_USAGE_DEFAULT; 

    //unsigned int cpuAccess = D3D10_CPU_ACCESS_WRITE; 
    //if ((usage & RU_Buffer_WriteOnly) == 0) cpuAccess |= D3D10_CPU_ACCESS_READ; 

    unsigned int cpuAccess = 0; 
    if (!pTextureData) 
    { 
     cpuAccess = D3D10_CPU_ACCESS_WRITE; 
     //if ((usage & RU_Buffer_WriteOnly) == 0) cpuAccess |= D3D10_CPU_ACCESS_READ; 
    } 

    unsigned int bindFlags = D3D10_BIND_SHADER_RESOURCE; 
    if (usage & RU_Texture_RenderTarget) bindFlags |= D3D10_BIND_RENDER_TARGET; 

    unsigned int miscFlags = 0; 
    if (usage & RU_Texture_AutoGenMipmap) miscFlags |= D3D10_RESOURCE_MISC_GENERATE_MIPS; 

    D3D10_TEXTURE2D_DESC d3d10Texture2DDesc; 
    d3d10Texture2DDesc.Width   = width; 
    d3d10Texture2DDesc.Height   = height; 
    d3d10Texture2DDesc.MipLevels  = GetNumMipMaps(width, height, bMipmapped); 
    d3d10Texture2DDesc.ArraySize  = 1; 
    d3d10Texture2DDesc.Format   = GetD3DFormat((TextureTypes)textureType); 
    d3d10Texture2DDesc.SampleDesc  = dxgiSampleDesc; 
    d3d10Texture2DDesc.Usage   = d3d10Usage; 
    d3d10Texture2DDesc.BindFlags  = D3D10_BIND_SHADER_RESOURCE; 
    d3d10Texture2DDesc.CPUAccessFlags = cpuAccess; 
    d3d10Texture2DDesc.MiscFlags  = miscFlags; 

    //D3D10_SUBRESOURCE_DATA d3d10SubResourceData; 
    //d3d10SubResourceData.pSysMem   = pTextureData; 
    //d3d10SubResourceData.SysMemPitch  = GetPitch(width, (TextureTypes)textureType); 
    //d3d10SubResourceData.SysMemSlicePitch = 0; 

    D3D10_SUBRESOURCE_DATA* pSubResourceData = NULL; 
    if (pTextureData) 
    { 
     pSubResourceData = new D3D10_SUBRESOURCE_DATA[d3d10Texture2DDesc.MipLevels]; 

     char* pTexPos  = (char*)pTextureData; 
     unsigned int pitch = GetPitch(width, (TextureTypes)textureType); 

     unsigned int count = 0; 
     unsigned int max = d3d10Texture2DDesc.MipLevels; 
     while(count < max) 
     { 
      pSubResourceData[count].pSysMem    = pTexPos; 
      pSubResourceData[count].SysMemPitch   = pitch; 
      pSubResourceData[count].SysMemSlicePitch = 0; 

      pTexPos += pitch * height; 
      pitch >>= 1; 
      count++; 
     } 
    } 

    if (FAILED(pDevice->CreateTexture2D(&d3d10Texture2DDesc, pSubResourceData, &mpTexture))) 
    { 
     return false; 
    } 

    if (pSubResourceData) 
    { 
     delete[] pSubResourceData; 
     pSubResourceData = NULL; 
    } 

    mWidth = width; 
    mHeight = height; 
    mFormat = (TextureTypes)textureType; 

    mpTexture->AddRef(); 
    mpTexture->Release(); 

    D3D10_SHADER_RESOURCE_VIEW_DESC d3d10ShaderResourceViewDesc; 
    d3d10ShaderResourceViewDesc.Format      = d3d10Texture2DDesc.Format; 
    d3d10ShaderResourceViewDesc.ViewDimension    = D3D10_SRV_DIMENSION_TEXTURE2D; 
    d3d10ShaderResourceViewDesc.Texture2D.MostDetailedMip = 0; 
    d3d10ShaderResourceViewDesc.Texture2D.MipLevels   = GetNumMipMaps(width, height, bMipmapped); 

    if (FAILED(pDevice->CreateShaderResourceView(mpTexture, &d3d10ShaderResourceViewDesc, &mpView))) 
    { 
     return false; 
    } 

    ResourceRecorder::Instance()->AddResource(this); 
    return true; 
} 

Mit dieser Funktion alles, was Sie tun müssen, ist in dem Jota an schwarzer Textur passieren. Zum Beispiel ein 256x256 textue mit jeder horizontalen Linie zu schreiben, ist ein heller als die vorhergehende Zeile wird der folgende Code

int* pTexture = new int[256 * 256]; 
int count = 0; 
while(count < 256) 
{ 
    int count2 = 0; 
    while(count2 < 256) 
    { 
     pTexture[(count * 256) + count2] = 0xff000000 | (count << 16) | (count << 8) | count; 
     count2++; 
    } 
    count++; 
} 
+0

Vielen Dank, es war eine Hilfe für mich. – plucked

0

Stellen Sie sicher, arbeiten Sie die Regeln in der „Ressourcennutzungsbeschränkungen“ Abschnitt folgen: MSDN: D3D10_USAGE

+0

Vielen Dank, diese Einschränkungen sind beim ersten Mal sehr schwer zu verstehen, aber ich kenne einige Punkte, warum mein Code nicht funktioniert. – plucked

0
public void NewData(byte[] newData) 
    { 
     DataRectangle mappedTex = null; 
     //assign and lock the resource 
     mappedTex = pTexture.Map(0, D3D10.MapMode.WriteDiscard, D3D10.MapFlags.None); 
     // if unable to hold texture 
     if (!mappedTex.Data.CanWrite) 
     { 
      throw new ApplicationException("Cannot Write to the Texture"); 
     } 
     // write new data to the texture 
     mappedTex.Data.WriteRange<byte>(newData); 
     // unlock the resource 
     pTexture.Unmap(0); 
     if (samplerflag) 
      temptex = newData; 
    } 

diese überschreibt den Puffer auf jedem neuen Rahmen, können Sie eine D3D10.MapMode.readwrite oder etwas verwenden, wenn ur nur ein Texel zu schreiben

versuchen, müssen Sie auch auf die schreiben Dataclectangle in einem bestimmten Punkt mit einer der anderen Schreibfunktionen

Verwandte Themen