[서론]
아마 제목 때문에 Scanline Eraser를 떠올리신 분이 계실지도 모르겠네요.
2011년에 만든 물건이라 잊으신 분들이 더 많겠습니다 ㅎ.ㅎ
https://sharksym.blogspot.com/2011/02/scanline-eraser.html
이번에는 LCD 모니터(TV SCART)에 CRT 스캔라인과 비슷한 기능을 넣어보았습니다.
제가 메인으로 쓰고 있는 17인치 LCD가 있습니다. GT에 항상 연결된 상태입니다!
2005년부터 쓰던 물건이라 해상도가 1280 x 768로 좀 떨어지긴합니다요.
보통 외장 업스케일러를 쓰시는 분들을 보면,
주로 레트로 게임기의 240p, 480p 화면을 정수배 스케일링 + 스캔라인 필터를 사용하는데요.
1440p인 QHD 또는 2160p의 UHD 모니터가 주로 쓰이더라구요.
TMS9918은 상하 테두리(BD)를 제외하면 메인 화면은 192라인입니다.
V9938/9958은 테두리를 제외한 기본 화면은 212라인 + 16라인(수직 쉬프트) = 228라인이구요.
오버스캔 트릭을 쓰면 240라인을 모두 쓸 수 있죠.
MSX2 이상의 기종에서 정수배 스케일링을 쓰려면 QHD 이상으로 가야하는데...
제가 쓰는 구닥다리 768p 모니터에서는 192라인 x 4 = 768라인이 됩니다.
MSX1 화면을 정수배로 업스케일 후 스캔라인 효과를 먹이는 건 가능하다는 얘기죠.
초기 MSX1용 게임들을 즐기는 경우에 유용하게 쓸 수 있겠습니다 ㅎ.ㅎ
[본론]
제가 쓰는 LCD는 2005년에 직접 개발했던 펌웨어가 적용되어있습니다.
지금도 코드 빌드하고 다운로드 하는 건 별 문제없이 할 수 있어요.
먼저 코드를 수정해서, 192라인을 4배 스케일링을 해서 픽셀을 딱 맞춰 놓습니다.
그럼 이제 스캔라인 효과를 만들어야하는데요.
단순히 검정 라인으로 표시한다면, 프레임 버퍼의 각 라인 사이에 빈 라인을 두면 쉽게 구현됩니다.
1번 라인 캡쳐 + 라인 메모리 스킵(검정라인) +
2번 라인 캡쳐 + 라인 메모리 스킵(검정라인) +
...
192번 라인 캡쳐 + 라인 메모리 스킵(검정라인)
이렇게 되겠죠? 192라인을 캡쳐하면 실제 데이터는 384라인이 되겠구요.
이걸 그대로 2배 스케일링해서 출력하면 됩니다. 간단하죠?
근데 이렇게 하면 조금 재미없으니, 다른 방법으로 해보아요~
이번에는 입력된 라인을 연속으로 캡쳐 후 4배 스케일링 하도록 둡니다.
이 상태에서 업스케일된 각 4개 라인의 마지막 라인과, 인접한 다음 라인의 첫 라인을 지워줍니다.
보통 업스케일을 하면 각 픽셀이 보간(인터폴레이션) 되기 때문에 경계면 양쪽을 함께 지워야 이쁘게 나와욤.
참고로, 비디오 칩에 따라서는 보간을 끄고 픽셀을 정수배로 늘리는 방식도 있습니다. 보통 라인 더블러가 이런식이죠.
별 내용 아닌데, 글로 적으려니 힘드네요. 아래 스샷을 보시죠!
각 블럭이 실제 화면의 1픽셀입니다.
이해되시죠? ㅎ.ㅎ
사실 위에 설명했던 내용은 20세기 에뮬인 paraMSX에 그대로 적용되어 있습니다.
.
.
.
그럼 이걸 LCD 펌웨어에 어떻게 적용하느냐가 문제인데요.
보드에 들어있는 칩은 업스케일 후 별도의 버퍼없이 출력단(LVDS)으로 넘어가기 때문에,
밝기 낮춘 픽셀을 추가로 그려넣을 수는 없습니다.
대신 이런 비디오 칩은 오버레이 기능이 들어있는데요.
비디오 채널 외에 배경 또는 그래픽 데이터를 오버레이 할 수 있습니다.
특히 그래픽 레이어는 알파블렌딩이 가능합니다.
대게 OSD를 표시할 때 쓰입니다. 메뉴, 채널 정보 등등...
그럼, 그래픽 레이어에 투명색 2라인 + 검정색 2라인 + ... 반복해서 768라인을 채워놓고요.
이걸 비디오 위에 오버레이하면 되겠죠?
아래 스샷들은 GT의 출력입니다. 참고하세요.
MSX 부팅로고와 알레스트2 타이틀 화면은 이렇게 나옵니다.
텍스트도 보시죠. 잘 보이도록 확대했어요.
아래는 화면의 절반(윗부분)만 스캔라인 효과를 적용한 모습입니다.
그리고, 알파블렌딩 값은 리모컨으로 변경(10단계)할 수 있도록 해놨습니다.
50% 정도 먹인 상태가 적당하네요.
그럼, 즐 MSX 하셔요~ ㅎ.ㅎ/





댓글 없음:
댓글 쓰기