Nasenbaer
2010-04-22, 20:32:33
Ich versuche mich gerade an Compute Shadern allerdings habe ich schon beim Zurücklesen von Texturen Probleme (das Auslesen im Shader und manipulieren der Texturen klappt ohne Probleme).
Das Problem ist, dass ich über den Pointer p (siehe 2. Code-Fragment) immer nur die erste Zeile der Textur auslesen kann.
Hier mal mein Code mit dem ich die Textur erstellt habe:
D3D11_TEXTURE2D_DESC cstestTexDesc;
cstestTexDesc.Width = 2;
cstestTexDesc.Height = 2;
cstestTexDesc.MipLevels = 1;
cstestTexDesc.ArraySize = 1;
cstestTexDesc.Format = DXGI_FORMAT_R32_FLOAT;
cstestTexDesc.SampleDesc.Count = 1;
cstestTexDesc.SampleDesc.Quality = 0;
cstestTexDesc.Usage = D3D11_USAGE_DEFAULT;
cstestTexDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_UNORDERED_ACCESS;
cstestTexDesc.CPUAccessFlags = 0;
cstestTexDesc.MiscFlags = 0;
D3D11_SUBRESOURCE_DATA cstestSubData;
cstestSubData.pSysMem = &(rwdata[0]); // vector<float> rwdata;
cstestSubData.SysMemPitch = sizeof(float) * 2; // size of one row
pd3dDevice->CreateTexture2D( &cstestTexDesc, &cstestSubData, &_cstestTexture );
Und so versuche ich diese wieder auszulesen
(Den Code zum Auslesen habe ich aus dem DX-SDK Beispiel BasicCompute11 und habe ihn gepasst um ne Texture2D statt nen Buffer auszulesen):
ID3D11Texture2D* resultTex = NULL;
D3D11_TEXTURE2D_DESC resultDesc;
ZeroMemory( &resultDesc, sizeof(resultDesc) );
_cstestTexture->GetDesc( &resultDesc );
resultDesc.CPUAccessFlags = D3D11_CPU_ACCESS_READ;
resultDesc.Usage = D3D11_USAGE_STAGING;
resultDesc.BindFlags = 0;
resultDesc.MiscFlags = 0;
pd3dDevice->CreateTexture2D(&resultDesc, NULL, &resultTex);
d3dContext->CopyResource( resultTex , _cstestTexture );
D3D11_MAPPED_SUBRESOURCE csResultMappedResource;
float *p;
d3dContext->Map( resultTex, 0, D3D11_MAP_READ, 0, &csResultMappedResource );
p = (float *)csResultMappedResource.pData;
Wenn ich die Textur als eine einzelne Zeile erstelle klappt alles aber das ist ja nicht Sinn der Sache. Ich vermute, dass das Problem im zweiten Teil des Codes liegt, da ich ihn aus dem SDK-Beispiel habe und dort ein einfacher Buffer verwendet wurde.
Das Problem ist, dass ich über den Pointer p (siehe 2. Code-Fragment) immer nur die erste Zeile der Textur auslesen kann.
Hier mal mein Code mit dem ich die Textur erstellt habe:
D3D11_TEXTURE2D_DESC cstestTexDesc;
cstestTexDesc.Width = 2;
cstestTexDesc.Height = 2;
cstestTexDesc.MipLevels = 1;
cstestTexDesc.ArraySize = 1;
cstestTexDesc.Format = DXGI_FORMAT_R32_FLOAT;
cstestTexDesc.SampleDesc.Count = 1;
cstestTexDesc.SampleDesc.Quality = 0;
cstestTexDesc.Usage = D3D11_USAGE_DEFAULT;
cstestTexDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_UNORDERED_ACCESS;
cstestTexDesc.CPUAccessFlags = 0;
cstestTexDesc.MiscFlags = 0;
D3D11_SUBRESOURCE_DATA cstestSubData;
cstestSubData.pSysMem = &(rwdata[0]); // vector<float> rwdata;
cstestSubData.SysMemPitch = sizeof(float) * 2; // size of one row
pd3dDevice->CreateTexture2D( &cstestTexDesc, &cstestSubData, &_cstestTexture );
Und so versuche ich diese wieder auszulesen
(Den Code zum Auslesen habe ich aus dem DX-SDK Beispiel BasicCompute11 und habe ihn gepasst um ne Texture2D statt nen Buffer auszulesen):
ID3D11Texture2D* resultTex = NULL;
D3D11_TEXTURE2D_DESC resultDesc;
ZeroMemory( &resultDesc, sizeof(resultDesc) );
_cstestTexture->GetDesc( &resultDesc );
resultDesc.CPUAccessFlags = D3D11_CPU_ACCESS_READ;
resultDesc.Usage = D3D11_USAGE_STAGING;
resultDesc.BindFlags = 0;
resultDesc.MiscFlags = 0;
pd3dDevice->CreateTexture2D(&resultDesc, NULL, &resultTex);
d3dContext->CopyResource( resultTex , _cstestTexture );
D3D11_MAPPED_SUBRESOURCE csResultMappedResource;
float *p;
d3dContext->Map( resultTex, 0, D3D11_MAP_READ, 0, &csResultMappedResource );
p = (float *)csResultMappedResource.pData;
Wenn ich die Textur als eine einzelne Zeile erstelle klappt alles aber das ist ja nicht Sinn der Sache. Ich vermute, dass das Problem im zweiten Teil des Codes liegt, da ich ihn aus dem SDK-Beispiel habe und dort ein einfacher Buffer verwendet wurde.