[Graphics] 저수준 그래픽 프로그래밍에 대해 배우기


Answers

Michael Abrash의 그래픽 프로그래밍 'Black Book' 은 시작하기에 좋은 장소입니다. 게다가 무료로 다운로드 할 수 있습니다!

Question

그래픽 응용 프로그램을 만드는 데 사용할 수있는 다양한 추상화 레이어에 대해 배우는 데 흥미 롭습니다.

나는 많은 용어를 던져 보았습니다. 가장 높은 수준의 추상화에서 C #, .NET, pyglet 및 pygame과 같은 것들에 대해 듣게되었습니다. 더 아래로, 나는 DirectX와 OpenGL에 대해 듣는다. DirectDraw, SDL, Win32 API, WxWidgets과 같은 다른 멀티 플랫폼 라이브러리가 있습니다.

이 레이어 중 하나가 끝나는 곳과 다음 단계가 시작되는 곳을 잘 이해하려면 어떻게해야합니까? C에서 Windows에서 창을 만드는 "가능한 최저 수준"의 방법은 무엇입니까? C ++은 어떻습니까? (코드 샘플은 신성한 것입니다.) X11에서는 어떨까요? Win32 API를 기반으로 OpenGL과 DirectX의 Windows 구현이 구현 되었습니까? 어디에서 이러한 것들에 대해 배우기 시작할 수 있습니까?

그래서 프로그래밍 Windows 가 제안되는 또 다른 질문이 있습니다. Linux의 경우는 어떻습니까? 그런 책이 있나요?

저는 이것이 매우 저레벨이며, 더 친숙한 많은 도구가 있다는 것을 알고 있습니다 만, 적어도 표면 아래에서 일어나는 일의 기초를 배우고 싶습니다. 파이 게임처럼 뭔가로 시작하는 방망이 바로 창문과 벡터를 벗기 시작하고 싶은만큼 나를 위해 너무 높은 수준입니다. 컴퓨터에 물건을 어떻게 그리는 지 전체 개념 회로를 만들어야 합니다 .

나는 책과 자료에 대한 제안을 분명히 고맙게 생각할 것이다. 그러나이 질문에 대한 답이 그래픽 프로그래밍에 대한 다른 접근 방식으로 "Hello world"에 도달하는 많은 다른 방법으로 가득 차 있다면 엄청나게 멋지다 고 생각한다. 기음? C ++? OpenGL 사용? DirectX 사용? Windows XP에서? 우분투에서? 어쩌면 나는 너무 많이 요구할지도 모른다.




바로 박쥐에서, 나는 "너는 너무 많이 묻고있어."라고 말하고 싶습니다. 내가 경험해 봤던 작은 경험에서부터 몇 가지 튜토리얼을 읽거나 directX 나 OpenGL 중 하나에 관한 책을 시작하는 것이 좋습니다. 그보다 더 낮게가는 것은 꽤 복잡 할 것입니다. OGL이나 DX에서 본 책의 대부분은 함수 / 클래스가하는 것을 설명하는 꽤 좋은 소개가 있습니다.

이 중 하나의 교수형이 생기면 라이브러리에 언제든지 들어서서 그들이 정확히 무엇을하고 있는지 알 수 있습니다.

아니면, 정말로, 가장 낮은 레벨을 반드시 배워야합니다 ... 위의 글에서 책을 읽으십시오.




가장 낮은 레벨은 그래픽 카드의 비디오 RAM입니다. 컴퓨터가 처음 시작될 때 그래픽 카드는 일반적으로 80x25 문자 레거시 모드로 설정됩니다.

이 시점에서 BIOS가 제공 한 인터럽트로 텍스트를 쓸 수 있습니다. 전경색과 배경색을 16 가지 색상의 팔레트에서 변경할 수도 있습니다. 액세스 포트 / 레지스터를 사용하여 디스플레이 모드를 변경할 수 있습니다. 이 시점에서 디스플레이 메모리에 다른 글꼴을로드하고 80x25 모드를 사용한다고해도 (OS 설치는 일반적으로이 작업을 수행합니다) 또는 VGA / SVGA를 사용할 수 있습니다. 그것은 매우 복잡합니다. 그것이 바로 운전자입니다.

카드가 '상위'모드에 있으면 비디오 카드에 매핑 된 메모리에 액세스하여 화면에 표시된 내용을 변경합니다. 그것은 당신이 보상해야하는 각 라인의 끝에서 화면에 매핑되지 않은 픽셀의 '더티 영역'이있는 픽셀 단위로 가로로 저장됩니다. 하지만 예, 메모리의 이미지 픽셀을 화면에 직접 복사 할 수 있습니다.

DirectX, OpenGL과 같은 것들. 명령을 화면에 직접 쓰는 대신 그래픽 카드로 보내면 자동으로 화면이 업데이트됩니다. "이봐, 네가이 이미지를 VRAM 여기, 여기, 여기에 넣는다"또는 "이 변환 행렬을 사용하여이 삼각형을 그려라."와 같은 명령은 픽셀 단위의 시간에 비해 약간의 시간이 걸립니다. CPU가 당신에게 감사 할 것입니다.

DirectX / OpenGL은 모든 명령을 지원하는 프로그래머 친화적 인 라이브러리입니다. 보다 직접적인 접근 방식은 비생산적 일뿐입니다.

SDL은 추상화 레이어이므로, 각 시스템에서 다른 방식으로 작업하게 될 것이라고 생각합니다. 하나는 세미 다이렉트 스크린 쓰기, 다른 Direct3D 등이 될 수 있습니다. 코드가 교차 플랫폼 인 경우 가능한 한 가장 빠릅니다.

GDI / GDI + 및 XWindow 시스템. 창을 그리기 위해 특별히 고안되었습니다. 원래 그들은 픽셀 단위 (pixel by pixel) 방식을 사용 했었습니다. 버튼을 누르거나 창을 옮길 때 다시 그려야했기 때문에 충분했습니다. 그러나 이제는 가속화 된 드로잉을 위해 Direct3D / OpenGL을 사용합니다. 효과). 최적화는 이러한 라이브러리의 버전 및 구현에 따라 다릅니다.

따라서 가장 강력한 성능과 속도를 원하는 경우 DirectX / openGL을 사용하십시오. SDL은 크로스 플랫폼 환경을 최대한 활용하고 OpenGL과 통합하는 데 확실히 유용합니다. 윈도우 시스템은 마지막으로 제공되지만 과소 평가하지는 않습니다. 특히 MS가 최근에 나오고있는 것들과 함께.




libX11은 X11의 가장 낮은 레벨 라이브러리입니다. opengl / directx가 드라이버 / 하드웨어와 직접 대화 (또는 지원되지 않는 운영체제를 에뮬레이트)한다고 생각하기 때문에 가장 낮은 수준의 라이브러리가 될 것입니다.

매우 낮은 수준의 프로그래밍으로 시작하려면 VGA 용 x86 어셈블리 코드를 찾아 dosbox 또는 유사한 복사본을 실행하십시오.




좋은 그래픽과 이미지 프로세싱 프로그래머가되기 위해서는이 낮은 수준의 지식이 필요하지 않지만, 내가 사용하고있는 것의 내부에 대해서는 우둔하지 않아야한다. 나는 이것을 추적하는 두 가지 방법, 즉 높은 수준의 아래 또는 낮은 수준의 것을 본다.

하향식은 원을 그리는 것과 같은 고급 그래픽 작업에서 하드웨어로 작업을 추적하는 방법을 따르는 문제입니다. OpenGL을 잘 알아보십시오. 그런 다음 Mesa (무료!)의 소스에서 OpenGL을 소프트웨어로 구현하는 방법을 살펴볼 수 있습니다. Xorg의 소스는 다음으로, 먼저 API 호출에서 클라이언트 측을 거쳐 X 서버로 이동하는 방법을 확인합니다. 마지막으로 하드웨어와 인터페이스하는 장치 드라이버를 살펴보십시오.

위로 : 자신의 그래픽 하드웨어를 제작하십시오. 컴퓨터에 연결할 수있는 방법 - 몇 바이트 크기의 레지스터를 통해 대량의 픽셀을 처리하는 방법, DMA가 작동하는 방법을 생각해보십시오. 장치 드라이버를 작성하고 앱 프로그래머에게 유용 할 그래픽 라이브러리를 설계 해보십시오.

상향식 방법은 느린 8 비트 마이크로 프로세서를 사용할 수있는 몇 년 전에 배웠다. 회로 및 하드웨어 - 소프트웨어 인터페이싱에 대한 직접적인 경험을 통해 어려운 디바이스 결정, 예를 들어 영리한 하드웨어를 사용하여 디바이스 드라이버 또는 상위 레벨에서 사각형을 페인트하는 것과 같은 어려운 설계 결정을 잘 이해하게되었습니다. 이 중 어느 것도 실용적인 일상의 가치는 없지만 최신 기술을 이해하기위한 지식의 토대를 제공합니다.




맨 아래에서 시작하려면 라인을 그립니다. 가장 기본적인 작업입니다. 컴퓨터 그래픽은 단순히 그리드 (화면)의 픽셀을 채우는 것에 불과하므로 (x0, y0)에서 (x1, y1)로가는 선을 채우기 위해 채울 픽셀을 결정해야합니다.

Bresenham의 알고리즘 을 확인하여 관련된 것에 대한 느낌을 얻으십시오.







MSWindows에서는 쉽게 사용할 수 있습니다 : 표준 Windows 프로그래밍 API 이든 DirectX-family API 이든 상관없이 API가 제공하는 것을 사용하면 사용자가 사용하는 것이므로 문서화가 잘됩니다.

X 윈도우 환경에서 제공되는 X11 라이브러리 를 사용합니다. X에서 윈도우 잉의 원리를 이해하려면이 작업을 수행하는 것이 좋습니다. 다른 사람들이하지 말라는 사실에 신경 쓰지 마십시오. 실제로 X에서 그래픽과 윈도우 작업을 이해하는 데 도움이 될 것입니다. X- 프로그래밍에 대한 설명서를 읽을 수 있습니다 (구글). (이 연습을 한 후에는 더 높은 수준의 라이브러리를 감상 할 수 있습니다!)

위와 별개로, 칩 레벨을 제외한 절대적으로 가장 낮은 레벨에서 사용할 수있는 다양한 그래픽 모드로 전환하는 인터럽트를 호출하여 화면 버퍼에 쓸 수 있지만, 어셈블러를 사용해야 할 것이고, 다른 것은 너무 느릴 것이다. 이 방법은 휴대용이 아닙니다.

또 다른 글은 훌륭한 자료 인 Abrash 's Black Book을 언급합니다.

편집 : 리눅스 프로그래밍에 관한 책은 : 커뮤니티의 일이며 많은 하우투가 있습니다. 또한 포럼을 찾아 가입하십시오. 문명 활동을하는 한 모든 도움을받을 수 있습니다.