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
도 사용하려고 시도했지만 결과는 좋지 않습니다.) 다음 이미지는 표시 결과입니다.
감사합니다.
스케일링 값이란 무엇입니까? 이미지를 상류로 전환하면 이미지가 흐릿하게 보입니다. 대신 밉맵을 사용 하시겠습니까? – Asesh
@Asesh : D3D11_FILTER_MIN_POINT_MAG_MIP_LINEAR 또는 D3D11_FILTER_MIN_LINEAR_MAG_MIP_POINT도 사용하려고했지만 더 좋지 않습니다. 배율 값은 1.2, 1.5 또는 임의의 값으로, 위 이미지와 같이 이미지가 교차 선으로 표시됩니다. 정상적으로 흐리게 보이지 않습니다. – TTGroup
텍스처가 밉맵을 지원합니까? DDS 파일은 밉맵을 지원합니다. 그 필터를 사용하는 것만으로는 충분하지 않으며 텍스처도 밉맵을 지원해야합니다. 그렇지 않으면 런타임에 생성해야합니다. 어쨌든, 당신이 사용한 스케일링 값을 가진 스크린 샷에서 볼 때 그다지 큰 차이가 없어야합니다. 틀린 것이 있어야합니다. – Asesh