ㅎㅇㅎㅇ
지난번에 윈도우 다루기에 이어서, 이번에는 디바이스(GPU)를 다루는 방법에 대해서 써볼까 함
지난글
https://gall.dcinside.com/mgallery/board/view/?id=game_dev&no=187225
인붕이들 헬로우똥 엔진 깎는 에렌임오늘은 윈도우를 다루는 기능을 한번 구현해 봤음rust에서 윈도우는 주로 winit이라는 모듈을 통해 다룸 (거의 표준처럼 쓰임ㅇㅇ bevy에서도 씀)https://docs.rs/wi
gall.dcinside.com
우선 내가 만드는 엔진은 vulkan, wgpu, webgpu, webgl 이렇게 4개 버전으로 렌더링 엔진이 구현될 예정이라, 각각 따로 설명이 필요한듯
vulkan은 어렵고 복잡하다는 악명이 자자한데, 이름값처럼 진짜 복잡하더라고;;
(복잡해...)
vulkan에서 디바이스를 다루기 위해서 거쳐야할 작업들이 여러개가 있음
일단 디바이스부터가 2종류임ㅋㅋㅋ
1. 물리 디바이스
2. 논리 디바이스 (=일반적으로 그냥 디바이스라고 부름)
물리 디바이스는 말 그대로 gpu를 말하는거고, 논리 디바이스는 디바이스를 컨트롤하기 위한 인터페이스라고 보면됨
우리는 이 논리 디바이스를 생성해야, 이를 컨트롤해서 실제 화면에다가 무언가를 그릴 수 있게 됨ㅇㅇ
논리 디바이스 인터페이스를 확보하기 위한 순서는 다음과 같음
1. vulkan 인스턴스 생성
2. 서피스 생성 (윈도우에서 어떤 영역에 그릴 것인지를 결정하는)
3. 물리 디바이스 목록 가져오기
4. 물리 디바이스 중 가장 적절한 디바이스 선택하기
5. 물리 디바이스를 컨트롤하는 논리 디바이스 인터페이스 생성하기
아직 아무것도 그리기 전임에도 불구하고, 굉장히 코드도 복잡하고 과정도 장황함
자세한 구현 내용은 아래 폴더 참고하고,
https://github.com/erenengine/eren/tree/main/eren_vulkan_render_shared/src
이 중 물리 디바이스와 논리 디바이스 관련된 부분
https://github.com/erenengine/eren/blob/main/eren_vulkan_render_shared/src/physical_device.rs
다음 버전의 에렌엔진을 작업하는 소스코드 저장소입니다. Contribute to erenengine/eren development by creating an account on GitHub.
github.com
https://github.com/erenengine/eren/blob/main/eren_vulkan_render_shared/src/device.rs
다음 버전의 에렌엔진을 작업하는 소스코드 저장소입니다. Contribute to erenengine/eren development by creating an account on GitHub.
github.com
생성 자체는 추상화를 해서 아래처럼 간단하게 쓸 수 있게 했음
https://github.com/erenengine/eren/blob/main/eren_vulkan_render_shared/examples/test_device.rs
다음 버전의 에렌엔진을 작업하는 소스코드 저장소입니다. Contribute to erenengine/eren development by creating an account on GitHub.
github.com
이제 논리 디바이스를 확보했으니, 이 논리 디바이스에 명령을 보내거나 데이터를 전송(업로드)하여 gpu를 통해 화면에 실제로 그릴 수 있게 됨ㅇㅇ
wgpu에서는 복잡한 물리 디바이스 관련된 내용들을 숨기고, 이를 어댑터라는 녀석으로 추상화 하더라고.
덕분에 초기 설정이 매우 많이 줄어듦ㅇㅇ (예를 들어 가장 적절한 물리 디바이스를 선택하는 과정 등)
그냥 내부적으로 알아서 하는 부분들이 많음
과정 자체는 크게 다르지 않음. 물리 디바이스 관련된 부분을 어댑터로만 바뀐 정도?
그래도 물리 디바이스와 관련된 많은 과정이 생략됨
1. wgpu 인스턴스 생성
2. 서피스 생성
3. 어댑터 요청 (<- 물리 디바이스 관련 내용 싹 빠짐ㅇㅇ)
4. 논리 디바이스 인터페이스 생성하기
관련 코드는 아래에 있음
https://github.com/erenengine/eren/tree/main/eren_render_shared/src
다음 버전의 에렌엔진을 작업하는 소스코드 저장소입니다. Contribute to erenengine/eren development by creating an account on GitHub.
github.com
wgpu가 webgpu api를 사용하기 때문에, webgpu에서의 코드는 위 wgpu와 크게 다르지 않음
그냥 언어가 rust -> ts로 바뀐 정도...
유일하게 차이가 나는 점은, 서피스를 생성하는 부분이 생략된 부분인데,
이건 아마도 어디에 그릴지가 초기부터 정해져있어서(html의 canvas) 그런 것이라고 사료됨ㅇㅇ
관련 코드는 아래에. (WebGPU와 WebGL 관련 코드는 Eren.JS로 코드 저장소를 분리함)
https://github.com/erenengine/erenjs/tree/main/eren-webgpu-render-shared/src
Contribute to erenengine/erenjs development by creating an account on GitHub.
github.com
놀랍게도 webgl에서는 디바이스를 다루는 코드 자체가 없음;;
그냥 바로 드로잉부터 시작함ㅋㅋㅋㅋ 그래서 관련 코드도 없음~~
이제 디바이스를 다루는 기능들도 모두 구현되었으니, 다음 글에서는 실제로 화면에 무언가 그려보겠음
그럼 모두 화이팅!!
댓글 3