이미지 처리 기초

상태
담당자
notion image
 
 

이미지를 불러오자

const std::vector<Vertex> vertices = { { { -1.0f, -1.0f, 0.0f, 1.0f }, { 0.f, 1.f },}, { { 1.0f, -1.0f, 0.0f, 1.0f }, { 1.f, 1.f },}, { { 1.0f, 1.0f, 0.0f, 1.0f }, { 1.f, 0.f },}, { { -1.0f, 1.0f, 0.0f, 1.0f }, { 0.f, 0.f },}, }; D3D11_BUFFER_DESC bufferDesc; ZeroMemory(&bufferDesc, sizeof(bufferDesc)); bufferDesc.Usage = D3D11_USAGE_DYNAMIC; // write access access by CPU and GPU bufferDesc.ByteWidth = UINT(sizeof(Vertex) * vertices.size()); // size is the VERTEX struct * 3 bufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER; // use as a vertex buffer bufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; // allow CPU to write in buffer bufferDesc.StructureByteStride = sizeof(Vertex); D3D11_SUBRESOURCE_DATA vertexBufferData = { 0, }; vertexBufferData.pSysMem = vertices.data(); vertexBufferData.SysMemPitch = 0; vertexBufferData.SysMemSlicePitch = 0; const HRESULT hr = device->CreateBuffer(&bufferDesc, &vertexBufferData, &vertexBuffer); if (FAILED(hr)) { std::cout << "CreateBuffer() failed. " << std::hex << hr << std::endl; };
버텍스에, 화면 전체 사이즈를 차지하는 네모 박스를 하나 만들어 보이는 방식이다.
예전에는, 한 pixel pixel을 그려줬지만, 현재는 2D건 3D건 이런 형태로 만든다고 한다.
 
notion image
위 이미지와 같이 픽셀에 값을 곱하면 값에 따라 어두워지고 밝아지는 효과를 만들 수 있다.
for (int i = 0; i < image.height; i++) { for (int j = 0; j < image.width; j++) { const int idx = j + image.width * i; if (j > image.width / 2) { image.pixels[idx].v[0] = std::clamp(image.pixels[idx].v[0] * 1.01f, 0.0f, 1.0f); image.pixels[idx].v[1] = std::clamp(image.pixels[idx].v[1] * 1.01f, 0.0f, 1.0f); image.pixels[idx].v[2] = std::clamp(image.pixels[idx].v[2] * 1.01f, 0.0f, 1.0f); } else { image.pixels[idx].v[0] = std::clamp(image.pixels[idx].v[0] * 0.99f, 0.0f, 1.0f); image.pixels[idx].v[1] = std::clamp(image.pixels[idx].v[1] * 0.99f, 0.0f, 1.0f); image.pixels[idx].v[2] = std::clamp(image.pixels[idx].v[2] * 0.99f, 0.0f, 1.0f); } } }
해당 코드를 Update 쪽에 넣게 되면, 위 이미지와 같이 한 쪽은 Fade Out 효과를 줄 수 있고, 다른 한쪽은 점점 밝아지게 할 수 있다.
notion image
단, 밝은 부분이 위 사진과 같이 완전히 하얗게 변하지 않는 현상이 있는데 이건, 해당 pixel 값이 0인 경우를 의미한다 즉 0에 아무리 수를 곱해도 0이기 때문에 해당 현상을 없애기 위해선
 
모든 픽셀에 0.01 과 같은 미세한 pixel 값을 더하거나 빼주면서 해결할 수 있다.
for (int idx = 0; idx < image.width * image.height; idx++) { image.pixels[idx].v[0] += 0.01f; image.pixels[idx].v[1] += 0.01f; image.pixels[idx].v[2] += 0.01f; }

 

마치며

이번 강의를 통해서, 이미지를 처리하는 부분과 기초 효과 부분을 배우게 되었다.
차후 해당 내용을 바탕으로 가우시안 블러 와 블룸 효과를 넣을 수 있다.
 
해당 내용은 아무래도 유료 강의이다 보니, 자세한 내용은 아래 출처를 통해 알아보도록 하자.
 
출처 : 홍정모 그래픽스 새싹강의1 편.