2017-10-19 10 views
0

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:

enter image description here Quelqu'un peut me dire comment le réparer.

Merci beaucoup!

+1

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

+0

@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

+1

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

Répondre

1

Vous dessinez chaque pixel en tant que point à l'aide de DirectX. Il est normal que lorsque la taille de l'écran augmente, vos points se séparent et la qualité est mauvaise. Vous devriez dessiner un quad texturé à la place, en utilisant une texture que vous remplissez avec vos données RVB et un pixel shader.