2017-10-19 93 views
0

我使用DirectX在缓冲区中绘制带有RGB数据的图像。下面是简码:DirectX:绘制位图图像在视口中放大导致低质量?

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

当视口的大小小于或等于图像的大小=>一切正常。但是,当视口尺寸较大时,图像的质量非常差。

我已经搜索并尝试使用desc.Filter = D3D11_FILTER_ANISOTROPIC;作为上述代码(我试图使用D3D11_FILTER_MIN_POINT_MAG_MIP_LINEARD3D11_FILTER_MIN_LINEAR_MAG_MIP_POINT太),但结果并不会更好。以下图像是显示结果:

enter image description here 有人可以告诉我解决问题的方法。

非常感谢!

+1

什么是缩放值?很明显,如果你高档的形象,那么它会看起来模糊。您可能想要使用mipmap? – Asesh

+0

@Asesh:我也尝试过使用D3D11_FILTER_MIN_POINT_MAG_MIP_LINEAR或D3D11_FILTER_MIN_LINEAR_MAG_MIP_POINT,但并不是更好。缩放值为1.2,1.5或任何值,它们总是使图像像上述图像那样出现交叉线。它通常不会看起来模糊。 – TTGroup

+1

你的纹理支持mipmap吗? DDS文件支持mipmap。只使用该过滤器是不够的,你的纹理也应该支持mipmap,否则你将不得不在运行时生成它们。无论如何,应该没有那么多与您使用的缩放比例值截图中所显示的差异。一定有什么问题。 – Asesh

回答

1

您正在使用DirectX将每个像素绘制为一个点。正常情况下,当屏幕尺寸变大时,您的积分会分开,质量会变差。您应该使用填充RGB数据和像素着色器的纹理来绘制纹理四边形。