2008-10-25 6 views
35

그래픽 응용 프로그램을 만드는 데 사용할 수있는 다양한 추상화 계층에 대해 알아보고 싶습니다.저수준 그래픽 프로그래밍에 대해 배웁니다.

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

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

여기에 또 다른 질문이 있습니다. Programming Windows이 제안됩니다. Linux의 경우는 어떻습니까? 그런 책이 있나요?

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

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

+4

"Linux의 경우는 무엇입니까? 해당 책이 있습니까?" - 현재 하나 있습니다 - http://www.amazon.com/The-Linux-Programming-Interface-Handbook/dp/1593272200 - 매우 드물게 책이 100 % 별 5 개 등급을 갖고 있으며 39 개가 합리적으로 우수합니다 표본의 크기. –

+0

맥스, 나는 같은 질문을 가지고있다. 나는 당신이 모든 질문을 통해 자신의 길을 찾았 음을 알고 싶다. 왜냐하면이 같은 질문들은 나를 괴롭히기 때문이다. –

+0

@SurajJain,별로는 아니지만, 나는 몇 가지 다른 질문이있다. 당신도 시작할 수 있도록 요청했습니다. http://stackoverflow.com/questions/235151/game-programming-how-to-avoid-reinventing-the-wheel http://stackoverflow.com/questions/12850071/무엇보다 간단한 방법으로 렌더링하는 방법 - 단일 - 조명 - 소스로 큐브 - –

답변

21

Michael Abrash's Graphics Programming 'Black Book'은 시작하기 좋은 장소입니다. 게다가 무료로 다운로드 할 수 있습니다!

+2

이것은 깨진 링크입니다 – Prabu

+1

http://www.drdobbs.com/high에서 구할 수 있습니다 -performance-computing/184404919 (당분간은 :)). –

+1

감사합니다. 링크를 업데이트했습니다. –

2

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

이 중 하나가 멈 추면 언제든지 라이브러리에 파묻혀 정확히 그들이 무엇을하고 있는지 알 수 있습니다.

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

4

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

관련 항목에 대한 느낌을 얻으려면 Bresenham's algorithm을 확인하십시오. http://developer.amd.com/documentation/guides/Pages/default.aspx

HTH

+3

그리드의 픽셀을 채워서 선을 그리는 경우 픽셀을 설정하는 것보다 선을 그리는 것이 더 기본적인 방법 일 수 있습니까? :) – unwind

3

오픈 GPU 문서 섹션을 참조하십시오. opengl/directx가 드라이버/하드웨어와 직접 대화 (또는 지원되지 않는 운영 체제를 에뮬레이션)한다고 생각하기 때문에 가장 낮은 수준의 라이브러리가됩니다.

으로 시작하여 매우 낮은 레벨 프로그래밍 인 경우 VGA 용 x86 어셈블리 코드를 찾아 dosbox 또는 유사한 복사본을 실행하십시오.

2

libX11는 X11에 대한 낮은 수준의 라이브러리입니다 :

3

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

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

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

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

+0

선생님, 질문이 있습니다. 오랫동안 물어보고 싶었습니다. 그래픽 라이브러리를 포함하지 않고 C가 서클과 같은 것으로 만들 수있는 기능을 가지고 있었거나, 기본적인 것, 픽셀을 조작하는 것, 코드가 길어? –

3

는 간단합니다 : 당신은 API 또는 프로그래밍 표준 창인지, API가 제공하는 기능 사용 DirectX를 가족 API의 : 그건 당신이 무엇을 사용, 그들은 잘 설명되어 있습니다.

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

위와는 별도로, 가능한 가장 낮은 레벨 (칩 레벨 제외)에서 사용할 수있는 다양한 그래픽 모드로 전환되는 인터럽트를 호출 할 수 있습니다 - 여러 가지가 있고 화면 버퍼에 씁니다. 그러나이 경우 어셈블러를 사용해야하므로 다른 작업은 너무 느립니다. 이 방법은 휴대용이 아닙니다.

다른 게시물은 Abrash 's Black Book - 훌륭한 자료입니다.

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

36

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

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

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

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

DirectX/OpenGL은 명령을 원활하게 수행 할 수 있도록 모든 지원 기능이있는 카드로 명령을 보내는 프로그래머 용 라이브러리입니다. 보다 직접적인 접근 방식은 비생산적 일뿐입니다.

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

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

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

+1

Heh, heh, Na, 가장 낮은 레벨은 VGA 컨트롤러의 VHDL 또는 Verilog 디자인입니다! 사실 이것을 체크해보세요 http://neil.franklin.ch/Projects/SoftVGA/ 마이크로 컨트롤러 만 사용하고 있습니다! – NoMoreZealots

관련 문제