글
보통 라인 버퍼 스프라이트는 현재 스캔라인에서 현재 Y좌표의 값을 빼거나(양수 = 아래), 더하거나(양수 = 위) 한 값(이 값에 특정 값을 곱하거나 별도의 메모리에서 값을 불러오거나 해서 확대/축소를 구현하기도 한다.)을 그래픽의 높이값과 검사해서 높이값 안에 들면 그리는 과정(또한 원본 스프라이트의 그래픽의 Y좌표를 이 값으로 한다)이 있는데, 이 과정을 한 스캔라인 전에 미리 하고 결과값을 다음 스캔라인에 표시하고, 스캔라인 표시가 끝날 때마다 그릴 버퍼와 표시할 버퍼를 교체하는 것을 반복하면 더블 버퍼링이 된다.(예: 네오지오)
이건 입력렉 감소(프레임버퍼엔 일단 그리고 한 프레임이 다 그려진 다음에야 표시 가능하며 이 과정에서 필연적인 입력렉 발생)나 원가절감(외부 프레임버퍼가 불필요한게 이유. 보통 이 목적으로 사용.)을 이유로 이걸 구현한 게 많다.
스프라이트라는 개념이 잡히고 90년대 초중반까지 스프라이트 하드웨어는 일부를 제외하면 죄다 라인 버퍼 기반인데, 이 당시엔 메모리값이 금값이었기 때문이었다.
구현예 (매 스캔라인마다 반복):
// 그래픽 데이터의 Y 좌표 구하기
// srcy = 그래픽 데이터의 Y 좌표
// scanline = 현재 스캔라인
// ypos = Y 좌표 원점값
// Y 좌표 양수가 위인 경우
s32 srcy = s16(scanline + ypos);
// Y 좌표 양수가 아래인 경우
s32 srcy = s16(scanline - ypos);
// 확대/축소 기능 추가 예시:
// yzoom = 상하 확대/축소 값
// zoom_frac = 확대/축소 값의 우측 논리 시프트 (고정 소수점의 정수에 해당)
srcy = (srcy * yzoom) >> zoom_frac;
// 원본 그래픽 데이터의 높이와 검사
// height = 원본 그래픽 데이터의 높이값
if ((srcy < 0) && (srcy >= height))
return;
// 상하 뒤집기
// flipy = 상하 뒤집기 플래그
if (flipy)
srcy = height - srcy - 1;
// 라인버퍼에 그리기
// cx = X 좌표 카운터
// dstx = 그릴 X 좌표값
// xpos = X 좌표 원점값
// xf = X 좌표의 소수
// srcx = 그래픽 데이터의 X좌표
// flipx = 좌우 뒤집기 플래그
// width = 원본 그래픽 데이터의 너비값
// pixel = 그래픽 데이터의 픽셀
// xzoom = 좌우 확대/축소 값
// screen_width = 화면의 너비값
// transpen = 픽셀의 투명값 (보통 처음이나 끝)
// color = 스프라이트의 색상 인덱스
// granularity = 색상 인덱스에 곱할 값 (2의 승수)
for (int cx = 0, dstx = xpos, xf = 0, srcx = (flipx ? (width - 1) : 0); cx < width; cx++, srcx += (flipx ? -1 : 1))
{
// 픽셀 구하기
// m_get_pixel(그래픽 데이터의 X 좌표, Y 좌표);
u8 pixel = m_get_pixel(srcx, srcy);
// 그릴 좌표값 증감
xf += xzoom;
while (xf >= (1 << zoom_frac))
{
// 그릴 좌표값, 픽셀의 투명 여부 검사 후 그리기
// m_linebuffer_draw(그릴 X 좌표, 색상값);
if ((dstx >= 0) && (dstx < screen_width) && (pixel != transpen))
m_linebuffer_draw(dstx, (color * granularity) + pixel);
dstx++;
xf -= 1 << zoom_frac;
}
}'기타' 카테고리의 다른 글
| 복합 동기 (Composite sync) (0) | 2026.01.12 |
|---|---|
| WAD 포맷 (0) | 2026.01.08 |
| 뻘글 (1) | 2025.12.22 |
| 프레임버퍼 방식 그래픽과 라인버퍼 방식 그래픽의 지연 시간 (0) | 2025.12.18 |
| 정확한 파이값을 구하는 함수 (0) | 2025.12.17 |
RECENT COMMENT