현재 사용하는 CAD 그래픽 엔진이 라인타입의 shape를 제대로 표현하지 못하는 문제가 있었다.

shape라 하면 어떤 선 개체가 그냥 일반적인 선이 아니라 화살표나 모양, 텍스트를 가진 패턴이 있는 선 개체인 경우에 이 화살표 같은 것들을 말한다. 얘네들 정보는 .shx 파일 안에 모양 정보가 있고 이 파일은 shxConverter 라이브러리로 읽어서 선 개체가 .shx 파일의 몇번 선 모양을 참조하는지에 따라 선에 모양을 추가하게 된다.

아무튼 처음에는 대부분의 기능이 구현되어 있고 System.Window.Shape 하위의 개체들을 해당 엔진의 모델로 변환하기만 하면 된다고 전해 들었는데 사실 그렇지 않았다.

어떤 라인(실제로 직선들의 집합일 수도 있고 어떤 부분은 Arc일 수도 있다)에 라인타입이 적용되려면

  1. 라인타입의 패턴 길이에 따라 실제 선 개체에서 패턴(instance)이 몇번 진행되는지 계산
  2. 각 instance가 선 개체에서 어느 위치에 있는지 offset을 계산
    해서 버퍼에 제공해야 한다. 그러면 쉐이더가 이 계산값들을 가지고 instance를 그려줘야 하는데 float 기반으로 계산되는 쉐이더에서 오버플로우를 방지하기 위해 위치 계산을 일시적으로 (0,0,0) 기준으로 하고 나중에 되돌려 놓는 옵션에 대한 if 블럭이 존재했다.

라인타입 shape가 보이지 않는 문제는 이 if블럭 내부가 틀리게 구현되어 있어 발생한 문제였다.

그래서 결과적으로 전혀 기반 지식이 없는 상태에서 DirectX 쉐이더와 버퍼를 수정해야 하는 조금 생소한 업무가 떨어졌다.

‘아무튼 해라’

‘안되면 될때까지’의 해병(병1147기)정신으로 공부하다 보니 DeviceDeviceContext 가 나와서 좀 찾아봤다.

ID3D11Device

  • 정의: ID3D11Device인터페이스는 GPU가 사용하는 버퍼, 텍스쳐, 쉐이더, 상태 등의 리소스를 생성, 관리하는 virtual adapter이다. 여기서 virtual adapter라 함은 실제 물리적 GPU와 어플리케이션 사이의 중간다리 역할을 하는 (소프트웨어로 추상화한)논리적 장치라는 의미를 가진다.
  • 주요 역할:
    • 리소스의 생성: 버텍스 버퍼, 인덱스 버퍼, 쉐이더와 같은 그래픽스 리소스를 생성
    • 기능 조회: 그래픽 하드웨어에 내장된 쉐이더 모델, 텍스쳐 형식 같은 기능들을 조회
    • 어댑터: 물리적 그래픽 하드웨어를 추상화하고 하드웨어를 구체적으로 알지 못하더라도 일관적인 인터페이스를 제공

ID3D11DeviceContext

  • 정의: GPU와 애플리케이션 간의 렌더링 명령 및 그래픽 파이프라인 상태를 관리하는 작업 환경. Rendering context 라고도 하는데 context를 그냥 수능영어식으로 맥락, 문맥 이래버리면 감이 안온다. 사전에 설정된 환경값이 아니라 렌더링 명령, 파이프라인의 작업 상태에 따라 상호작용하는 ‘작업 환경’이라는 말이 딱 적당한듯 함.
  • 주요 역할:
    • 명령 발행(Command Issuance): Draw call 을 발행
    • 상태 관리: Input layouts, 쉐이더 단계, blend states나rasterizer states와 같은 파이프라인 상태를 정하거나 갱신
    • 리소스 바인딩:하고 Device가 생성한 리소스들을 GPU 파이프라인에 바인딩