기본적으로 2D 비트 맵은 어떻게 렌더링됩니까?


9

64 비트 워드 주소 지정이 가능한 컴퓨터가 있고 이진 이미지 비트 맵 (아래와 같은)으로 저장된 5x7 문자를 메모리 매핑 된 디스플레이에 출력하도록 프로그래밍하려고한다고 가정합니다.

여기에 이미지 설명을 입력하십시오 여기에 이미지 설명을 입력하십시오

문자 당 5 x 7 = 35 픽셀이므로 35 비트를 사용하여 한 단어로 문자를 저장할 수 있습니다. 워드의 왼쪽에서 시작하는 최하위 비트와 이미지의 각 픽셀이 위에 표시된 것처럼 n 번째 비트로 표시되면 위의 "3"숫자는 다음과 같이 메모리에 저장됩니다. 01110100010000100110000011000101110,이어서 29 미사용 비트는 0으로 설정됩니다.

구식 / 현대식 컴퓨터에서 캐릭터가 저장 / 저장되는 방법입니까? 아니면 픽셀 당 단일 바이트 / 워드를 사용합니까?

이들이 이런 방식으로 저장되면, 어셈블리 / 머신 코드의 루틴 (컴퓨터의 명령어 세트 아키텍처의 비트, 산술 및 데이터 전송 작업과 같은 기본 명령어 사용)은이 데이터를 이미지로 변환하는 데 사용됩니다. 디스플레이가 어떻게 생겼습니까? 다음과 같은 것입니까?

  1. 특정 레지스터에서 업데이트 할 현재 픽셀의 x 및 y 디스플레이 좌표를 저장합니다.
  2. 선택한 두 RGB 값 (이 경우 녹색은 0,255,0, 검은 색은 0,0,0)을 두 개의 다른 레지스터에 저장하십시오.
  3. 렌더링되는 이미지의 현재 행과 열을 추적하기 위해 두 개의 추가 레지스터가 카운터를 5와 7로 초기화하도록합니다.
  4. 열 레지스터가 0이 아닌지 테스트합니다. 그렇지 않은 경우 비트 맵의 ​​LSB가 1로 설정되어 있는지 테스트 한 다음 결과에 따라 x 및 y 좌표 레지스터를 사용하여 각 RGB 값 레지스터를 AND로 이동 한 다음 결과 디스플레이 출력 레지스터로.
  5. 행 카운터 레지스터를 1 씩 줄이고 0인지 확인하십시오. 그렇다면 5로 다시 설정하고 y 좌표를 1 씩 늘리고 열 카운터를 1 씩 줄이십시오.
  6. 비트 맵을 1 비트 왼쪽으로 유지하는 레지스터를 이동합니다.
  7. JMP to instruction 4.

더 간단하고 효율적인 방법이 있습니까? 하나의 작은 텍스트 문자를 렌더링하는 것만 큼 간단하지만 많은 작업이 필요하며 약 200 개의 CPU 사이클이 소요됩니다.

마지막으로, 이미지를 처음부터 표시하기위한 머신 레벨 코드에 관한 좋은 책이나 자료가 있습니까?이 특정 주제에 대해 글로시하거나 코드가 고급 언어로 작성되어 있거나 매크로를 사용하는 어셈블러. 모두 "속임수"이며 기본적으로 가장 낮은 수준에서 무슨 일이 일어나고 있는지 설명하지 않습니다.


3
그래픽 프로그래밍 블랙리스트는 확실히 고전적인 가치가 독서이다. 그것의 많은 oldschool 블랙 매직;)
glampert

네, 마이클 아브라 쉬 (Michael Abrash)의 두 번째 책입니다. 대단한 독서입니다. 이 책에 쓰여진 내용에는 더 많은 속임수가 있지만이 책의 철학은 중요합니다 (현재까지도 중요합니다)
Romain Piquois

답변:


7

컴퓨터 그래픽 보드의 텍스트와 그래픽 모드를 구별해야합니다.

예전에는 대부분 텍스트 모드가 지원되었습니다. 이 모드에서 보드는 문자의 비트 맵 정의를 저장하고 현재 커서 위치에 표시합니다. 작은 텍스트 버퍼에 문자의 ASCII 코드 (문자 당 1 바이트)를 제공하기 만하면됩니다.

요즘에는 고해상도의 래스터 버퍼가 제공되는데, 여기에는 픽셀에 액세스 할 수 있으며 일부 지원되는 형식 ( "가장 높은"모드, 픽셀 당 3 바이트 (RGB), 메가 픽셀 이상)으로 색상 정보를 기록합니다.

원래, 크기가 다른 단순한 (packed) 이진 비트 맵이 사용되었으며 가능한 형식 변환과 함께 장치 드라이버에 대한 요청을 통해 래스터 메모리에 " 블리 팅 "되었습니다.

요즘 문자는 대부분 벡터 도면으로 정의되며 , 이는 해상도에 독립적 인 윤곽선 설명이며 부드러운 결과를 위해 앤티 앨리어싱 을 포함하는 복잡한 렌더링 프로세스를 거쳐야합니다 .

렌더링 된 출력을 다시 표시하여 빠른 표시를 위해 캐시 할 수 있습니다.

전체 프로세스는 복잡하고 하드웨어 가속이 가능하며 다른 그래픽 기본 그리기 작업과 함께 투명한 방식으로 운영 체제 (GUI 관리)에서 처리됩니다.


1

짧은 대답은 예입니다. 형식에 필요한 경우 많은 비트 조작을 피할 수 없습니다.

비트 맵을 그리는 것은 기본적으로 소스에서 대상으로 픽셀을 복사한다는 것을 의미하며, 필요한 작업을 수행해야합니다. (Quoting Captain 명백한)

더 긴 대답은 소프트웨어 래스터 라이저를 작성하는 경우 소스의 픽셀 형식을 동일하게 지정하여 그리기에 필요하지 않은 부분 (투명도 최적화)을 알면 CPU 시간을 절약하는 알고리즘과 트릭을 가질 수 있다는 것입니다 대상으로 (직접 또는 캐시 형태), 최적으로 memcopy 수행 등 ... 기본적으로 래스터 라이저의 드로잉 루프를 고려하고 CPU 시간을 절약하기 위해 래스터 라이저의 구조를 재구성하는 방법을 확인하십시오 (예 : 런타임시 생성 할 수 있음) 문자 A를 인쇄하거나 투명 영역을 건너 뛰는 방법 등을 알려주기 위해 소스 비트 맵 정보에 메타를 갖도록하는 어셈블러 코드의 조각.) 각 사용 사례는 CPU 명령 세트, 버퍼 형식, 렌더링 프리미티브 알고리즘 (회전? 스트레칭 비트 맵? 어떤 종류의 필터링? 등 ...), CPU 레지스터 및 캐시 등 ...

어쨌든, 이상한 인코딩과 작은 메모리가 표준이었던 옛날에는 단일 픽셀을 쓰는 데 많은 CPU 사이클이 필요했습니다. :-) 그러나 8 MHZ CPU가있는 16/32 비트 시스템은 다음과 같은 작업을 수행하지 못하게했습니다 : https://www.youtube.com/watch?v=GWwPJU6pp30 (그리고 CPU의 큰 덩어리도 사용되었습니다 음악을 위해)

HW 렌더링의 경우 HW는 소스 형식에서 대상 형식으로 변환을 수행하고 SW 래스터 라이저에서 사용할 수있는 많은 트릭을 사용하지 않지만 HW의 일반적인 구현은 대부분의 SW 구현을 능가 할 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.