둠 엔진

Doom engine
id Tech 1
개발자ID 소프트웨어(John Carmack, John Romero, Dave Taylor)
최종 발매
1.9 / 1995년 2월 1일; 27년(1995-02-01)
리포지토리github.com/id-Software/DOOM
기록 위치C, 어셈블리 언어
플랫폼DOS, Microsoft Windows, MacOS, Linux, Android, Amiga Workbench, NeXTSTEP, Macintosh, Commodore Amiga, NeXT, Atari Jaguar, Sega 32X, Sony PlayStation, Panasonic 3DO, 닌텐도 64, 게임보이 어드밴스, 닌텐도 스위치
후계자지진엔진
면허증GNU GPL-2.0 또는 라이터[1]
3DO: MIT[2]

엔진으로도 알려진 id Tech 1id Software games Doom and Doom II: Hell on Earth에 동력을 공급하는 게임 엔진이다.헤르틱, 헥센: 비욘드 헤르틱, 바운스: Sigil, Hacx: Twitch'n Kill, Freedoom, 기타 라이센스 소유자가 제작한 게임 카맥이 만든 으로 마이크 아브라시, 존 로메로, 데이브 테일러, 폴 라덱이 쓴 보조 기능을 가지고 있다.원래 NeXT 컴퓨터로 개발된 이 컴퓨터는 DOS포팅되어 Doom의 초기 릴리즈가 되었고, 이후 여러 게임기와 운영체제에 포팅되었다.

Linux 버전의 Doom에 대한 소스 코드는 1997년 12월 23일 비상업적 사용에 대한 권리를 허가한 라이센스에 따라 대중에게 공개되었고, 그 후 약 일주일 후인 1997년 12월 29일에 Linux 버전의 Doom II가 공개되었다.[3][4]소스코드는 이후 1999년 10월 3일 GNU General Public License v2.0 이상에 따라 재발매되었다.[5][6]이후 생성된 수십 개의 비공식 소스 포트는 이전에 지원되지 않던 운영 체제에서 을 실행할 수 있게 하고 때로는 새로운 기능으로 엔진의 기능을 획기적으로 확장시킨다.

엔진은 겉보기에는 3D 공간을 렌더링하지만, 그 공간은 2차원 평면도에서 투영된다.시선은 항상 바닥과 평행하고 벽은 바닥과 수직이어야 하며 다층 구조나 경사면(각도가 다른 플로어와 천장)을 만들 수 없다.이러한 한계에도 불구하고, 엔진은 ID의 이전 울펜슈타인 3D 엔진에서 기술적 비약을 상징했다. 엔진은 ID Software의 롱 라인의 게임 엔진 목록에 그것을 분류하기 위해 나중에 "id Tech 1"로 이름이 바뀌었다.[7]

게임계

엔진은 게임의 나머지 부분과 렌더링을 분리한다.그래픽 엔진은 최대한 빨리 작동하지만 게임 세계는 하드웨어와 상관없이 초당 35프레임으로 작동하기 때문에 여러 플레이어가 다양한 성능의 컴퓨터를 이용해 서로 대적할 수 있다.[8]

레벨 구조

Doom이 내부적으로 레벨을 어떻게 나타내는지를 보여주는 간단한 설정

편집기에서 뷰 매핑

위에서 내려다본 모든 레벨은 실제로 2차원적인 것으로, 엔진의 주요 제한사항 중 하나인 룸 오버 룸은 불가능하다는 것을 보여준다.그러나 이러한 제한은 은빛 안감을 가지고 있는데, 오른쪽의 첫 번째 이미지와 마찬가지로 벽과 플레이어의 위치를 나타내는 "지도 모드"를 쉽게 표시할 수 있다.

기본 객체

기준 단위는 정점이며, 이는 단일 2D 점을 나타낸다.그런 다음 정점(또는 내부에서 언급되는 "버텍스")을 "라인라인"이라고 하는 양식 에 결합한다.각 라인에는 "측면"이라고 알려진 한 면 또는 두 면 중 하나를 가질 수 있다.그리고 나서 사이드 디프는 함께 묶여서 다각형을 형성한다; 이것들은 "섹터"라고 불린다.섹터는 레벨의 특정 영역을 나타낸다.

섹터

각 부분에는 바닥 높이, 천장 높이, 조명 수준, 바닥 질감, 천장 질감 등 여러 가지 특성이 있다.예를 들어 특정 영역에서 다른 광도를 가지려면 다른 광도를 가진 해당 영역에 대해 새로운 영역이 생성되어야 한다.따라서 단면 일면 일면 일면 일면 일면 일면 일면 일면 일면 일면 일면 일면 일면 일면 일면 일면 일면 일면 일면 일면 일면 일면 일면 일

사이드 에프스

측면은 벽 질감을 저장하는 데 사용된다. 측면 질감은 바닥 질감과 천장 질감과 완전히 분리된다.각 측면은 세 가지 질감을 가질 수 있는데, 이를 중간, 위쪽, 아래쪽 질감이라고 한다.한쪽 면 리네프에서는 벽의 텍스쳐에 중간 질감만 사용한다.양면 라인엔 상황이 더 복잡하다.하단 및 상단 텍스처는 인접한 섹터의 바닥 및 천장 높이가 다른 간격을 메우기 위해 사용된다. 예를 들어 하위 텍스처는 스텝에 사용된다.사이드 디프는 대부분 그렇지 않지만 중간 질감을 가질 수 있다; 이것은 중간 질감을 공중에 매달게 하는데 사용된다.예를 들어, 투명한 막대 질감이 케이지로 형성되는 것을 볼 때, 이것은 양면 라인 에프 위에 중간 질감이 있는 예다.

이진 공간 분할

Doom은 BSP(Binary Space Partitioning)라고 알려진 시스템을 사용한다.[9]한 레벨의 BSP 데이터를 미리 생성하기 위해 도구를 사용한다.이 과정은 대규모로 진행되려면 상당한 시간이 걸릴 수 있다.에서 벽을 움직일 수 없는 것은 이것 때문이다; 문과 승강기가 위아래로 움직이는 동안, 어느 것도 옆으로 움직이는 법이 없다.

레벨은 이진수 나무로 나뉜다. 트리의 각 위치는 레벨의 특정 영역(루트 노드가 전체 레벨을 나타냄)을 나타내는 "노드"이다.나무의 각 가지에는 노드의 영역을 두 개의 서브노드로 나누는 분할선이 있다.동시에, 분할선은 "segs"[10]라고 불리는 선 세그먼트로 라인ef를 나눈다.

나무의 잎에는 볼록한 다각형이 있는데, 여기서 더 이상의 수위 분열이 필요하지 않다.이러한 볼록 폴리곤은 서브섹터(또는 "SSECTORS")라고 하며 특정 섹터에 결합된다.각 하위 영역에는 그것과 관련된 segs 목록이 있다.[9]

BSP 시스템은 렌더링을 위해 하위 벡터를 올바른 순서로 정렬한다.알고리즘은 상당히 간단하다.

  1. 루트 노드에서 시작하십시오.
  2. 이 노드의 하위 노드를 반복적으로 그리십시오.카메라에 가장 가까운 아동 노드는 먼저 Scanline 알고리즘을 사용하여 그린다.이는 노드의 구분선 어느 쪽에 카메라가 있는지 살펴봄으로써 알 수 있다.
  3. 하위 섹터에 도달하면 그리십시오.[11]

픽셀의 전체 열이 채워지면(즉, 더 이상 공백이 남지 않음) 프로세스가 완료된다.이 순서는 보이지 않는 도면 객체를 시간이 사용되지 않도록 보장하며, 그 결과 지도는 속도 위반 없이 매우 커질 수 있다.

렌더링

벽 그리기

의 모든 벽은 수직으로 그려진다; 위아래를 제대로 볼 수 없는 것은 이것 때문이다.'y-shareing'을 통해 위/아래 형태의 룩업을 할 수 있으며, 현대적인 둠 소스 포트는 물론, 이레틱과 같이 엔진을 사용하는 후기 게임도 많이 한다.본질적으로 이것은 화면 내에서 수평선을 위아래로 이동함으로써 작동하며, 실제로 더 높은 가시 가능 영역에 "창"을 제공한다.창문을 위아래로 움직이면 위아래로 보는 듯한 착각을 일으킬 수 있다.하지만 이는 선수가 더 위아래로 볼수록 시야가 왜곡될 것이다.

엔진은 BSP 트리를 가로지르면서 벽을 렌더링하며, 카메라로부터 거리의 순서에 따라 서브섹터를 그려 가장 가까운 seg가 먼저 그려지도록 한다.씨그들이 그려질 때, 그것들은 링크된 리스트에 저장된다.이것은 나중에 렌더링한 다른 찌꺼기를 자르는데 사용되어 과다한 회전을 감소시킨다.이것은 나중에 스프라이트의 가장자리를 자르는 데도 사용된다.

엔진이 특정 x 좌표에서 견고한(1면) 벽에 도달하면 해당 영역에 더 이상 선을 그릴 필요가 없다.클리핑을 위해 엔진은 단단한 벽에 도달한 스크린 영역의 "맵"을 저장한다.이것은 플레이어가 볼 수 없는 레벨의 먼 부분을 완전히 잘라낼 수 있게 한다.

Doom 그래픽 형식은 벽 질감을 수직 기둥 세트로 저장하며, 이는 렌더러에게 유용하며, 렌더러에게 기본적으로 많은 수직 질감의 수직 열을 그려 벽을 렌더링한다.

바닥 및 천장

바닥과 천장을 그리는 시스템("평판")은 벽에 사용되는 시스템보다 덜 우아하다.플랫은 플러드 필 유사 알고리즘으로 그려진다.이 때문에, 바닥이나 천장이 화면 가장자리까지 흘러내리는 '구멍'을 얻기 위해 불량 BSP 빌더를 사용하면, 흔히 '슬라임 트레일'이라고 부르는 시각적 오류가 발생할 수 있다.[12]플레이어가 노크립을 이용해 레벨 밖으로 이동하면 바닥이 뒤집히고 천장이 빈 공간을 넘어 레벨에서 뻗어나가는 것처럼 보이는 이유도 여기에 있다.

바닥과 천장은 "visplane"로 그려져 있다.이는 특정 높이, 조명 수준 및 질감의 바닥 또는 천장에서의 수평 질감의 런을 나타낸다(두 개의 인접한 섹터가 정확히 동일한 바닥을 가진 경우, 이것들은 하나의 양면체로 병합될 수 있다).visplane의 각 x 위치는 그리기 위한 특정한 수직선을 가지고 있다.

각 x 위치에 하나의 수직선을 그리는 이 한계 때문에, 때때로 visplane을 여러 개의 visplane으로 분할해야 한다.예를 들어, 두 개의 동심원 사각형이 있는 바닥을 보는 것을 고려해 보십시오.내부 광장은 주변 바닥을 수직으로 나눈다.내부 사각형이 그려지는 수평 범위에서는 주변 바닥에 대해 두 개의 시각판이 필요하다.

이것은 많은 마퍼들을 오랫동안 좌절시켰던 의 고전적인 한계 중 하나로 이어진다.Doom은 visplane 개수에 대해 정적인 제한을 포함했다. 초과하면 "visplane overflow"가 발생하여 "visplane an no visplane!" 또는 "visplane overflow (128 이상)"라는 두 메시지 중 하나로 게임이 DOS로 종료되게 된다.visplane 한도를 호출하는 가장 쉬운 방법은 큰 체커보드 바닥 패턴이다. 이것은 많은 수의 visplane을 만든다.

Segs가 렌더링될 때, visplane도 추가되어 Segs의 가장자리에서 화면의 수직 가장자리로 확장된다.이것들은 기존의 시각판에 도달할 때까지 확장된다.이러한 작동 방식 때문에, 시스템은 전체 엔진에 의해 순서대로 세그스가 렌더링된다는 사실에 의존한다. 먼저 다른 사람들에 의해 "차단"될 수 있도록 visplane을 더 가까이 끌어당길 필요가 있다.도핑이 해제되면 앞에서 설명한 것처럼 바닥이나 천장이 스크린 가장자리까지 "블러져" 나오게 된다.결국, visplane은 특정한 질감을 그리는 화면의 특정 영역의 "지도"를 형성한다.

visplane은 기본적으로 수직 "스트립"으로 구성되지만, 실제 낮은 레벨의 렌더링은 질감의 수평 "스팬" 형태로 수행된다.모든 visplane이 구성된 후, 그것들은 스팬으로 변환되어 화면에 렌더링된다.이것은 균형잡힌 것으로 보인다: 수직 스트립으로 육면조성을 하는 것이 더 쉽지만 바닥과 천장 텍스처가 어떻게 보이는지 특성상 수평 스트립으로 그리는 것이 더 쉽다.

사물(스프리트)

레벨 내의 각 섹터에는 해당 섹터에 저장된 항목의 링크된 목록이 있다.각 섹터가 그려질 때 스프라이트는 그릴 스프라이트 목록에 배치된다.만약 시야에 들어오지 않는다면 이것들은 무시된다.

스프라이트의 가장자리는 이전에 그린 씨그 리스트를 확인하여 클리핑한다.의 스프라이트는 벽과 동일한 열 기반 형식으로 저장되며, 이는 다시 렌더러에게 유용하다.벽을 그리는 데 사용되는 것과 동일한 기능이 스프라이트를 그리는 데도 사용된다.

서브섹터는 순서가 보장되지만, 그 안에 있는 스프라이트는 그렇지 않다.은 그릴 스프라이트 목록("vissprites")을 저장하고 렌더링하기 전에 목록을 정렬한다.멀리 떨어진 스프라이트가 가까운 스프라이트보다 먼저 그려진다.이것은 다소 과로를 유발하지만 보통 이것은 무시해도 된다.

예를 들어 투명 막대에 사용되는 양면 선에 중간 질감의 최종 문제가 있다.이들은 다른 벽이 아닌 렌더링 프로세스 끝에 있는 스프라이트와 혼합되어 그려진다.

엔진을 사용하는 게임

엔진은 고전적인 1인칭 슈터 에 동력을 공급한 결과 대부분의 명성을 얻었고, 다른 여러 게임에서 사용되었다.보통 "빅4" 엔진 게임은 , 이단, 헥센: 비욘드 이단, 그리고 투쟁이라고 여겨진다. 시길 탐험.

엔진에 직접 구축된 게임
Doom 또는 Doom II 코드 기반 게임

참고 항목

메모들

참조

  1. ^ https://www.gamers.org/pub/idgames/source/doomsrc.txt
  2. ^ "Doom3do/LICENSE at master · Olde-Skuul/Doom3do". GitHub.
  3. ^ Staff (December 29, 1997). "Doom II Source Available". PC Gamer US. Archived from the original on February 18, 1998. Retrieved November 20, 2019.
  4. ^ [1] ftp://ftp.idsoftware.com/idstuff/source/
  5. ^ GNU GPL 아래의 Doom 소스 코드 - Doomworld /idgames 데이터베이스 프런트엔드
  6. ^ 3ddownloads.comDoom 소스 코드, 2004년 2월 24일 웨이백 머신보관 - 1997년에 출시된, 현재 GNU GPL v2 또는 v2-or-properties에 따라 보관
  7. ^ "id Tech 1 (Concept)". Giant Bomb.
  8. ^ Schuytema, Paul C. (August 1994). "The Lighter Side Of Doom". Computer Gaming World. pp. 140, 142.
  9. ^ a b Abrash, Michael. "Quake's 3-D Engine: The Big Picture". Retrieved 22 August 2012.
  10. ^ Apted, Andrew. "SPECIFICATION for GL-Nodes". Retrieved 22 August 2012.
  11. ^ Sanglard, Fabien. "Doom engine code review". Retrieved 23 August 2012.
  12. ^ 슬라임 트레일 - 더 둠 위키

외부 링크