컴퓨터그래픽스 2. Image를 보여주는 Display는 어떤게 있을까
이미지를 보여주는 하드웨어는 무엇인가?
Display는 과거 CRT에서 시작하여, 현재는 대부분 LCD를 사용한다.
CRT는 무엇인가?
CRT는 전자 빔을 쏴서 모니터 끝에 있는 형광 물질을 맞춰 빛을 내는 원리로 화면을 만들어낸다. CRT 모니터 맨 뒤에 각각 R, G, B에 해당하는 전자 빔 세개가 존재한다. 이 전자빔의 세기를 조절하여 한 픽셀에다 전자를 쏜다. 픽셀 하나에는 R, G, B에 해당하는 형광물질이 세개 발라져 있다. 쏜 전자는 필터를 통과하여, 각각 본인 색에 해당하는 형광 물질에 정확하게 맞아 발광한다. 필터는 다음과 같다
- Shadow Mask : 구멍이 뿅뿅 뚫린 얆은 금속 판. 전자의 각도를 조절해줌.
- Aperture Grille Wires : 세로로 얇은 철사. 와이어가 전자 빔을 좌우로 걸러줌.
형광물질은 한번 맞으면 계속 발광하지 않는다. 금방 꺼진다. 이를 어떻게 계속 유지하는가? 단순하게 꺼지기 전에 계속 쏴야한다. 따라서 프레임 레이트가 70~80정도는 유지되어야 했다.
LCD는 무엇인가?
LCD는 액정이란 물질로 빛을 조절해 색깔을 만드는 디스플레이다. 원리는 일단 모니터 뒤에서 흰색 라이트를 쏜다. 전체적으로 쏘아진 흰색 빛은, 각 픽셀에 해당하는 액정 필터를 투과하며 밝기가 조절된 세개의 빛줄기가 만들어진다. 세개로 투과된 빛은 각각 R, G, B 색깔 필터를 통과하여 우리 눈에 보이게 된다.
라이트는 직접 라이트를 쏘는 Backlit 방식과, 주변광을 이용하는 Reflective 방식이 있다. Backlit는 어두운 곳에서도 항상 똑같은 화면을 볼 수 있다는 장점이 있지만, 전력을 더 먹는다. Reflective는 전력을 덜 먹지만, 어두운곳 가면 화면이 아에 안보이는 단점이 있다.
액정을 어떻게 조절하는가? Passive matrix 방식과 Active matrix 방식이 있다. Passive 방식은, 화면에 가로줄과 세로줄을 쫙 깔아둔다. 가로줄과 세로줄 동시에 전류를 적절히 흘려 그 교차점에 있는 픽셀을 조절하는 방식이다. 줄 단위로 제어하다보니 화면을 빠르게 전환할 수도 없었고, 원치 않는 다른 점에 영향을 끼치기도 했다. 따라서 지금은 거의 사용하지 않는다.
Active matrix는 각 픽셀마다 전압을 조절하는 소자를 하나씩 배치한다. 이 소자를 TFT (Thin-Film Transistor, 박막 트랜지스터)
라고 부른다. 이 방법으로 인해 Passive matrix의 단점을 모두 해결한다. 현재는 대부분 이 방식을 사용한다.
하드웨어는 화면을 어떤 방법으로 그리는가?
크게 Vector Scan (또는 Random Scan)
방법과 Raster Scan 방법이 있다.
Vector Scan 방법은 딱 원하는 부분만 빛을 쏴서 그리는 방법이다. 이 방법은 전자빔을 쏘는 각도만 조절하면 되기 때문에 CRT에선 가능하지만 LCD에선 불가능하다. 벡터 스캔 특성상 벡터 그래픽에 주로 사용된다.
현재 대부분에서 사용하는 방식은 Raster Scan 방법이다. 화면을 왼쪽 위에서부터 오른쪽 아래까지 모든 픽셀을 밝히는 방법이다. 이 래스터 스캔 방법은 Interlaced 방식과 Progressive 방식이 있다. Interlaced는 옛날에 쓰던 방법인데, 홀수번 줄 쫙 그리고, 다음번엔 짝수번 줄을 쫙 그리는 방식. 과거에 많이 사용한 방법이다. Progressive는 그냥 모든 줄을 한번에 그리는 방법이다. 요즘은 모두 이 방법을 사용한다.
컴퓨터는 모니터에 데이터를 어떻게 보내는가?
그 전에, 계산량이 너무 많다. 따라서 병렬 계산에 최적화된 Display Processor에서 Graphic 연산을 담당하도록 만든다. 우리가 GPU라고 부르는 그것이다.
[!tip] Comment{title} 데이터는 그리는 방식이 Vector Scan 방식인가 Raster Scan 방식인가에 따라 차이가 있다. 요즘에는 거의 다 Raster Scan을 사용하기 때문에, 앞으로 서술되는 모든 방법은 Raster Scan Draw 방법에 기반한다.
Frame Buffer와 Video Controller라는게 있다. 요즘 Video Controller는 GPU에 내장된다. Video Controller는 Frame Buffer에 들어온 값만 보고 디스플레이에 화면을 그린다.
Frame Buffer는 Queue나 Stack같은 자료구조가 아니다. 해상도만큼의 사이즈를 갖는 2차원 배열로 구성된다. Display Processor는 픽셀의 계산을 마치면, 그 픽셀에 해당하는 배열 주소에 색깔 데이터 (밝기, R, G, B)를 넣는다.
프레임 버퍼는 어디 있을까? GPU 내의 VRAM 위에 존재한다.
그렇다면, 프레임 버퍼에는 항상 픽셀을 순서대로 넣어야 할까? 그렇지 않다. GPU 코어는 픽셀 계산을 마치면 바로 프레임 버퍼에 결과를 넣는다. 일정 주기마다 Video Controller는 프레임 버퍼에 있는 결과를 순서대로 쭉 읽어들인다.
만약 모종의 이유로 화면의 절반만 프레임 버퍼에 씌여졌다면, 기다렸다가 프레임 버퍼가 다 채워지면 화면에 보여줄까? 그렇지 않다. Video Controller는 주기가 되면 프레임 버퍼를 읽어 디스플레이에 보내주기만 한다. 따라서 화면 절반만 출력될 것이다.
그러면 화면에 아직 다 씌여지지도 않았는데 가져가버리면 덜 완성된 화면을 자주 보게 되는 것 아닌가? 이런 현상을 Tearing (티어링)이라고 부른다. 티어링 현상을 줄이기 위해 Double Buffering 기법을 주로 사용한다. 더블 버퍼링은 프레임 버퍼를 두 개 사용하는 방법이다. 하나는 모니터가 현재 화면을 뿌리는데 쓰고 (프론트 버퍼)
, 하나는 GPU가 다음 장면을 그리는데 사용한다. (백 버퍼)
GPU가 백 버퍼에 그림을 다 그리면, 프론트 버퍼와 바꿔치기해서 화면에는 티어링 없이 항상 완성된 화면을 볼 수 있게 된다.