J'utilise DirectX pour dessiner les images avec des données RVB dans le tampon. Le fllowing est le code Sumary:DirectX: Agrandir la taille de l'image bitmap dans la fenêtre en raison de la qualité médiocre?
// create the vertex buffer
D3D11_BUFFER_DESC bd;
ZeroMemory(&bd, sizeof(bd));
bd.Usage = D3D11_USAGE_DYNAMIC; // write access access by CPU and GPU
bd.ByteWidth = sizeOfOurVertices; // size is the VERTEX struct * pW*pH
bd.BindFlags = D3D11_BIND_VERTEX_BUFFER; // use as a vertex buffer
bd.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; // allow CPU to write in buffer
dev->CreateBuffer(&bd, NULL, &pVBuffer); // create the buffer
//Create Sample for texture
D3D11_SAMPLER_DESC desc;
desc.Filter = D3D11_FILTER_ANISOTROPIC;
desc.MaxAnisotropy = 16;
ID3D11SamplerState *ppSamplerState = NULL;
dev->CreateSamplerState(&desc, &ppSamplerState);
devcon->PSSetSamplers(0, 1, &ppSamplerState);
//Create list vertices from RGB data buffer
pW = bitmapSource->PixelWidth;
pH = bitmapSource->PixelHeight;
OurVertices = new VERTEX[pW*pH];
vIndex = 0;
unsigned char* curP = rgbPixelsBuff;
for (y = 0; y < pH; y++)
{
for (x = 0; x < pW; x++)
{
OurVertices[vIndex].Color.b = *curP++;
OurVertices[vIndex].Color.g = *curP++;
OurVertices[vIndex].Color.r = *curP++;
OurVertices[vIndex].Color.a = *curP++;
OurVertices[vIndex].X = x;
OurVertices[vIndex].Y = y;
OurVertices[vIndex].Z = 0.0f;
vIndex++;
}
}
sizeOfOurVertices = sizeof(VERTEX)* pW*pH;
// copy the vertices into the buffer
D3D11_MAPPED_SUBRESOURCE ms;
devcon->Map(pVBuffer, NULL, D3D11_MAP_WRITE_DISCARD, NULL, &ms); // map the buffer
memcpy(ms.pData, OurVertices, sizeOfOurVertices); // copy the data
devcon->Unmap(pVBuffer, NULL);
// unmap the buffer
// clear the back buffer to a deep blue
devcon->ClearRenderTargetView(backbuffer, D3DXCOLOR(0.0f, 0.2f, 0.4f, 1.0f));
// select which vertex buffer to display
UINT stride = sizeof(VERTEX);
UINT offset = 0;
devcon->IASetVertexBuffers(0, 1, &pVBuffer, &stride, &offset);
// select which primtive type we are using
devcon->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_POINTLIST);
// draw the vertex buffer to the back buffer
devcon->Draw(pW*pH, 0);
// switch the back buffer and the front buffer
swapchain->Present(0, 0);
Lorsque la taille de la fenêtre est inférieure ou égale taille de l'image => Le tout est ok. Mais quand la taille du viewport est la taille de l'image lager => la qualité de l'image est très mauvaise.
J'ai cherché et essayé d'utiliser desc.Filter = D3D11_FILTER_ANISOTROPIC;
comme ci-dessus le code (j'ai essayé d'utiliser D3D11_FILTER_MIN_POINT_MAG_MIP_LINEAR
ou D3D11_FILTER_MIN_LINEAR_MAG_MIP_POINT
aussi), mais le résultat n'est pas meilleur. Les images suivantes résultent de l'affichage:
Quelqu'un peut me dire comment le réparer.
Merci beaucoup!
Quelle est la valeur de mise à l'échelle? C'est évident, si vous mettez une image à l'échelle supérieure, elle aura l'air floue. Vous pouvez utiliser mipmaps à la place? – Asesh
@Asesh: J'ai essayé d'utiliser aussi D3D11_FILTER_MIN_POINT_MAG_MIP_LINEAR ou D3D11_FILTER_MIN_LINEAR_MAG_MIP_POINT, mais ce n'est pas mieux. La valeur de mise à l'échelle est de 1,2, 1,5 ou toutes les valeurs, ils font toujours apparaître les lignes croisées de l'image comme ci-dessus. Il ne semble pas flou comme d'habitude. – TTGroup
Votre texture supporte-t-elle les mipmaps? Les fichiers DDS supportent les mipmaps. Le simple fait d'utiliser ce filtre ne suffira pas, votre texture devrait aussi supporter les mipmaps ou vous devrez les générer au moment de l'exécution. Quoi qu'il en soit, il ne devrait pas y avoir autant de différence que sur les captures d'écran avec les valeurs d'échelle que vous avez utilisées. Il doit y avoir quelque chose de mal. – Asesh