2017-10-19 26 views
0

DirectX를 사용하여 버퍼에 RGB 데이터로 이미지를 그립니다. fllowing는 sumary 코드 : 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_LINEAR 또는 D3D11_FILTER_MIN_LINEAR_MAG_MIP_POINT도 사용하려고 시도했지만 결과는 좋지 않습니다.) 다음 이미지는 표시 결과입니다.

enter image description here 누군가가 수정 방법을 알려줄 수 있습니다.

감사합니다.

+1

스케일링 값이란 무엇입니까? 이미지를 상류로 전환하면 이미지가 흐릿하게 보입니다. 대신 밉맵을 사용 하시겠습니까? – Asesh

+0

@Asesh : D3D11_FILTER_MIN_POINT_MAG_MIP_LINEAR 또는 D3D11_FILTER_MIN_LINEAR_MAG_MIP_POINT도 사용하려고했지만 더 좋지 않습니다. 배율 값은 1.2, 1.5 또는 임의의 값으로, 위 이미지와 같이 이미지가 교차 선으로 표시됩니다. 정상적으로 흐리게 보이지 않습니다. – TTGroup

+1

텍스처가 밉맵을 지원합니까? DDS 파일은 밉맵을 지원합니다. 그 필터를 사용하는 것만으로는 충분하지 않으며 텍스처도 밉맵을 지원해야합니다. 그렇지 않으면 런타임에 생성해야합니다. 어쨌든, 당신이 사용한 스케일링 값을 가진 스크린 샷에서 볼 때 그다지 큰 차이가 없어야합니다. 틀린 것이 있어야합니다. – Asesh

답변

1

DirectX를 사용하여 각 픽셀을 점으로 그립니다. 화면 크기가 커지면 포인트가 떨어져 품질이 떨어집니다. RGB 데이터와 픽셀 쉐이더로 채우는 텍스처를 사용하여 텍스처 쿼드를 그려야합니다.