Computer >> 컴퓨터 >  >> 프로그램 작성 >> BASH 프로그래밍

Bash용 OpenGL 바인딩

Perl 5의 디자인과 "접착 언어"로서의 적합성을 설명하는 이전 기사에서 이전에 Bash용 OpenGL 바인딩을 작성한 적이 있다고 언급했습니다. 이것은 증거 없이 하기에는 너무 믿기 힘든 진술이었을 것입니다. 그래서 저는 하드 드라이브의 먼지 투성이의 구석으로 돌아가서 그것을 파헤치고, 조금 다듬고, 글꼴 지원을 개선하고, 문서를 작성하고, 그것을 에 게시했습니다. 내 사이트와 GitHub에 있습니다. (직접 경험하려면 Bash와 OpenGL을 모두 지원하는 시스템이 필요하지만 여기에 동영상이 있습니다.)

이제 내 고백:My DeLorean은 Perl을 실행합니다.에서 설명한 DeLorean 대시보드의 Perl 그래픽 내 OpenGL for Bash 프로젝트와 기록을 공유합니다. 재미있고 아이러니하게도 나는 원래 13년 전 겨울왕국 거품을 보고 누군가가 Perl로 실시간 비디오 게임을 작성했다는 사실에 내 기술적인 감각이 화를 낸 후 이 프로젝트를 시작했습니다. 그 당시 제 기본 언어는 C++이었고 비디오 게임용으로 OpenGL을 공부하고 있었습니다. 나는 친구들에게 그것이 3D이고 Bash로 작성된다면 더 나빠질 것이라고 선언했습니다. 그 아이디어를 큰 소리로 말했지만 계속해서 저를 자극했고 결국 실시간 그래픽에 Perl을 사용하는 "끔찍함"을 한 단계 더 끌어보기로 결정했습니다.

배시 확장

Bash에 OpenGL 지원을 추가하는 가장 직접적인 방법은 소스 코드를 변경하고 각 OpenGL 기능을 쉘 "내장"으로 추가하는 것입니다. 그러나 그것을 경험할 수 있는 유일한 사람들은 Bash의 사용자 정의 버전을 기꺼이 설치하려는 사람들일 것이고 아마도 아무도 그렇게 하고 싶어하지 않을 것입니다. 또한 "Bash 방식"으로 일을 처리하는 것 같지도 않았습니다.

그런 다음 각 OpenGL 기능이 경로에 설치되고 해당 기능을 실행하기 위한 메시지를 전달하기 위해 OpenGL 서버에 연결할 클라이언트를 호출하는 클라이언트-서버에 대한 아이디어가 떠올랐습니다. 그것은 유쾌하게 "끔찍한" 해결책이 되었을 것입니다. 하지만 아무리 최적화를 열심히 해도 전체 목표에 성공했다고 말하기에는 여전히 너무 느렸습니다.

마지막으로 표준 입력에서 OpenGL 명령을 읽고 사용자 입력 이벤트를 표준 출력에 쓰는 "OpenGL 인터프리터" 프로세스가 있는 디자인을 결정했습니다. 그런 다음 Bash 스크립트는 파이프에 연결된 이 인터프리터를 시작할 수 있으며 각 OpenGL 명령은 파이프에 쓰는 Bash 함수가 될 수 있습니다. 내가 그 일을 하는 동안 효율성 트릭을 모두 쏟아붓고 정적으로 컴파일된 해시 테이블과 레드-블랙 트리를 사용하여 일반 C로 인터프리터를 작성하기로 결정했습니다.

OpenGL 즉시 모드

OpenGL 세부 정보는 이 프로젝트가 DeLorean 대시보드 프로젝트와 교차하기 시작하는 곳입니다. 먼저 한 걸음 물러나서 OpenGL API를 요약하겠습니다.

OpenGL은 3D 좌표 및 텍스처 측면에서 그래픽을 계획한 다음 해당 데이터를 그래픽 카드로 보내 2D 화면으로 렌더링하는 프로그램을 작성하는 것입니다. 정말 간단하게, 칠해지는 화면의 영역을 설명하는 데 사용하는 수학 세트와 해당 영역의 각 픽셀 색상을 설명하는 수학 세트가 있습니다.

가장 일반적인 작업은 가상 3D 공간에서 삼각형의 세 모서리를 설명하고 OpenGL이 2D 화면의 위치를 ​​파악한 다음 해당 영역에 걸쳐 2D 이미지를 늘리도록 지시하고 다른 이미지와 결합하거나 변경될 수도 있습니다. 일부 밝기 계산에 의해. 프로그램의 메인 루프는 버퍼를 지우고 볼 수 있는 모든 다각형을 플로팅한 다음 화면으로 전송하여 한 프레임의 비디오를 생성합니다. 이 전체 스턴트를 16밀리초 이내에 완료하면 초당 60프레임을 유지하고 멋진 유동적인 그래픽을 가질 수 있습니다.

OpenGL API의 기원에 대해 권위 있는 사람과 말할 수는 없지만 스트리밍 아이디어를 기반으로 구축되었다는 것은 분명합니다. 아마도 X11 디스플레이 프로토콜과 호환될 뿐만 아니라 좋은 생각이기 때문입니다. 따라서 각 함수 호출이 작업 결과를 알려주는 상태를 반환하는 다른 API와 달리 대부분의 OpenGL 함수에는 반환 값이 없습니다. glVertex3f(1,2,3)와 같은 OpenGL 함수를 시각화하면 파이프 위에 세 개의 숫자를 쓰는 인쇄 명령문으로, 당신은 그것이 배후에서 어떻게 작동하는지 꽤 잘 알고 있습니다. 사실, Bash 바인딩의 경우 문자 그대로 glVertex 1 2 3 파이프를 통해 glVertex 1 2 3 실행됩니다. Bash 스크립트는 그래픽 명령이 의도한 대로 작동하는지 여부를 전혀 알지 못한 채 블라인드로 실행됩니다.

수년에 걸쳐 OpenGL API에 대한 몇 가지 큰 수정이 있었고 사람들은 "보유" 모드와 "즉시" 모드에 대해 책에 전체 장을 작성했지만 모두 두 가지 개념으로 요약됩니다.

  • 각 프레임마다 파이프를 통해 모든 데이터를 다시 보내는 것은 느리므로 다른 쪽 끝에 일부를 캐시해 보겠습니다.
  • 내장된 수학으로 모든 사람의 요구를 충족시킬 수는 없습니다. 따라서 사람들이 자신만의 맞춤 수학을 설명할 수 있는 언어를 제공하겠습니다.

즉, 새로운 OpenGL API가 제공하는 캐싱 및 사용자 지정 수학이 훨씬 더 효율적이고 최상위 비디오 게임에 확실히 필요하지만 설정 및 작업(및 학습)에 더 많은 노력이 필요하며 아마도 애호가에게 좋습니다. 또한 고급 그래픽 효과나 디테일이 높은 모델을 수행하지 않는 한 필요하지 않습니다.

따라서 Bash OpenGL 바인딩은 "더 이상 사용되지 않는" API만 다루지만 여전히 교육 및 수정 목적으로 사람들이 보도록 권장합니다.

목록 표시

운 좋게도 원래 OpenGL API에는 몇 가지 캐싱 메커니즘이 있으며 사용하기 쉽습니다. 대략 다음과 같은 순서로 작동합니다.

<블록 인용>

"Hey OpenGL, 원격 끝에 개체 37을 생성해 주세요."

"다음은 개체 37을 설명하는 데이터입니다."

"다음 렌더링 단계에서 개체 37 사용"

더 쉽게 만들기 위해 Bash 바인딩을 사용하면 숫자 대신 이름을 사용할 수 있습니다.

첫 번째 주요 유형의 개체는 2D 이미지를 그래픽 카드에 로드한 다음 이를 사용하여 다각형을 "페인트"하는 텍스처입니다. 두 번째는 일련의 OpenGL 명령을 기록한 다음 단일 OpenGL 명령인 것처럼 재생하는 "표시 목록"입니다.

표시 목록은 임시 프로토타이핑에 적합합니다. 간단한 정점 명령을 사용하여 3D(또는 2D) 모델을 설명하는 몇 가지 점을 표시한 다음 해당 점 시퀀스를 표시 목록으로 기록하면 이제 단일 명령으로 해당 모델을 렌더링할 수 있습니다.

이 기능의 예를 보려면 Examples 디렉토리에서 Robot.sh를 확인하십시오. 시작할 때 로봇 몸의 각 부분에 대해 하나의 표시 목록을 만들고 실행하는 동안 로봇을 렌더링하기 위해 프레임당 58줄의 텍스트만 내보냅니다. Bash는 16밀리초 내에 58줄의 텍스트를 매우 쉽게 생성할 수 있으므로(12년 전에는 가능했음) 데모를 일반 하드웨어에서 최고 속도로 실행할 수 있었습니다.

디스플레이 목록은 내가 DeLorean 대시보드 소프트웨어에서 사용하고 있는 Perl 그래픽에 적용한 주요 트릭입니다. Perl 함수 호출은 특히 OpenGL 1.4와 같은 함수가 많은 API의 경우 C에 비해 약간 비싸지만 디스플레이 목록에 항목을 결합함으로써 Perl은 비디오 프레임당 수행할 작업이 많지 않습니다. Bash 프로젝트에서 이 트릭을 배우지 않았다면 Perl 프로젝트는 거의 성공하지 못했을 것입니다.

내가 12년 전에 이것을 게시하지 않은 이유는 무엇입니까?

Bash에서 멋진 애니메이션 데모를 만들 수 있었지만 실제 목표는 Bash로 완전한 게임을 만드는 것이었습니다. 나는 오래된 비행 시뮬레이션 게임인 ​​Terminal Velocity의 클론을 목표로 하고 있었고 큐브 필드를 통과할 수 있는 우주선까지 얻었지만(예제에서 Flight.sh 참조) 다음 문제는 충돌 감지였습니다. Bash에서 사용할 수 있는 기본 요소는 변수 이름과 배열 변수의 전역 "연관 배열"이며(비록 버전 4에는 이제 연관 배열 변수가 있음) 모든 수학은 정수입니다. 고정 소수점 정수 수학에서 3D 행렬 회전을 풀 수 있었지만 충돌 감지를 구현하는 것은 너무 큰 장애물처럼 보였습니다. 또한 내 글꼴 API에 만족하지 못했습니다. 이러한 문제에 대한 솔루션을 고려하는 동안 프로젝트는 점차 내 목록에서 사라졌습니다.

여기서 내가 (내가 쓴 대로) "Bash는 끔찍한 접착제 언어입니다."라고 결론지었습니다. 이 프로젝트가 농담(또는 교육 도구)으로 시작되고 끝났지만 Perl의 동일한 프로그램 스타일이 실제 응용 프로그램에 매우 유용한 것으로 판명되었습니다. 13년 전에 Frozen Bubble을 좀 더 진지하게 고려했다면 지금은 내가 가장 좋아하는 언어인 Perl을 먼저 시작할 수 있었을 것입니다.

버그 수정 외에 이 프로젝트를 개선할 계획은 없지만 OpenGL의 개념을 배우고자 하는 사람들이나 자유 시간이 많고 Doom을 작성하려는 강한 열망이 있는 사람들에게 최소한 유용할 수 있다고 생각했습니다. M4에서 복제합니다.

즐기다! 그리고 이 링크를 재미있게 전달하세요. 그렇지 않으면 아무도 당신을 믿지 않을 것입니다.