반응형


소프트웨어 렌더링을 구현하기 위해 처음으로 시작해야 할 것은 소프트웨어 렌더링을 할 환경을 만드는 일이다.

나는 비트맵 하나를 생성하고 비트맵에 렌더링을 한 뒤 최종적으로 Bitblt()을 통해 DC에 그려주는 식으로 만들었다.

비트맵을 관리하는 DIBSection이라는 클래스를 하나 만들고 사이즈와 비트맵이 그려질 DC를 넘겨주면

생성되는 식으로 만들었다.

그려줄 때는 비트맵이 그려질 DC에 비트맵과 연결된 메모리 DC를 그려주면 된다.

BitBlt(screenDC_, 0, 0, width_, height_, memoryDC_, 0, 0, SRCCOPY);

생성시에는 BITMAPINFO 구조체에 값을 설정하고 CreateDIBSection()함수를 통해 생성하였다.

BITMAPINFO bmInfo;

ZeroMemory(&bmInfo, sizeof(BITMAPINFO));

bmInfo.bmiHeader.biSize    = sizeof(BITMAPINFOHEADER);
bmInfo.bmiHeader.biWidth   = width_;
bmInfo.bmiHeader.biHeight   = -height_;     // 위에서 아래로 가는 좌표계로 사용하기 위해
bmInfo.bmiHeader.biPlanes   = 1;
bmInfo.bmiHeader.biBitCount   = DEFAULT_BPP; // 32비트로 만듦
bmInfo.bmiHeader.biCompression  = BI_RGB;    
bmInfo.bmiHeader.biSizeImage  = 0;
bmInfo.bmiHeader.biXPelsPerMeter = 0;
bmInfo.bmiHeader.biYPelsPerMeter = 0;
bmInfo.bmiHeader.biClrUsed   = 0;
bmInfo.bmiHeader.biClrImportant  = 0;

bitmap_ = CreateDIBSection(memoryDC_, (BITMAPINFO *)&bmInfo, DIB_RGB_COLORS, (VOID **)&bits_, NULL, 0);

이후부터는 레스터라이저와 같은 클래스를 만들고 bits_ 배열에 접근하여 비트맵을 수정하면 된다.

bits_[y * width_ + x] = color;

다음에는 브레젠함 알고리즘을 이용한 선 그리기에 대해서 정리하겠다.

반응형
Posted by msparkms
,