개발 · 컴퓨터공학 / / 2024. 7. 9. 09:00

쉐이더가 byte 형태로 되어있다? precompiled binary shader

728x90
반응형

 

shader 코드가 어디있지?

int test(ID3D11Device* device, ID3D11DeviceContext* deviceContext, float** vertices, float** normals, vector<face>** faceVectors, int* vertexCount, vector<vertex>** vertexVectors, vector<vertex>** normalVectors
    , MeshInfo* stMeshInfo, unsigned char* mMaskedInput, unsigned char* labeledInput) {
	  // Compile shader
	  ID3D11ComputeShader* computeShader = nullptr;
	  HRESULT hr = device->CreateComputeShader(g_csCreoSculptor, sizeof(g_csCreoSculptor), nullptr, &computeShader);
	  if (FAILED(hr))
	  {
	      printf("Failed compiling shader");
	      stMeshInfo->ErrorCode = 3;
	      return -1;
	  }
	

create compute shader 함수에서 분명 쉐이더를 주고 있다. 

그런데 shader 파일이 어딨나 했는데, g_csCreoSculptor는 BYTE로 되어있는 shader language의 내용을 담고 있는 모양이다.

 

이런 형태는 처음봤다.

여태까지는 HLSL 등의 shader language를 사용했었는데

알아보니 이미 컴파일을 해버린 형태의 binary shader라고 한다.

 

왜 precompiled binary shader를 쓰는가

프리컴파일된 바이너리 셰이더를 사용하는 데에는 몇 가지 이유가 있다. 주된 이유는 성능 향상, 안정성, 그리고 배포의 용이성이라고 한다.

 

1. 컴파일 시간 단축

  • 빠른 로딩 시간: HLSL 코드를 애플리케이션 실행 시점에서 컴파일하면 시간이 걸릴 수 있다. 프리컴파일된 바이너리 셰이더는 이미 컴파일되어 있으므로 로딩 시간이 크게 단축된다.
  • 일관된 성능: 런타임 컴파일을 피함으로써 애플리케이션의 초기화 과정이 빨라진다.

2. 안정성

  • 컴파일 오류 방지: HLSL 코드를 런타임에 컴파일하면 컴파일 오류가 발생할 수 있다. 프리컴파일된 셰이더를 사용하면 이러한 문제를 미리 발견하고 해결할 수 있다.
  • 일관된 결과: 프리컴파일된 셰이더는 이미 검증된 바이너리이므로 동일한 셰이더 코드가 모든 환경에서 일관된 결과를 제공한다.

3. 배포의 용이성

  • 보안: 프리컴파일된 바이너리 파일은 소스 코드에 비해 역공학이 더 어렵다. 이는 셰이더 코드의 보호를 강화할 수 있다.
  • 파일 크기 감소: HLSL 소스 코드와 컴파일러를 포함하는 것보다 프리컴파일된 바이너리 파일을 포함하는 것이 배포 파일 크기를 줄일 수 있다.

4. 개발 워크플로우의 개선

  • 버그 추적 및 디버깅: 개발 과정에서 컴파일된 바이너리를 사용하면 컴파일러 버그나 환경 의존적인 문제를 미리 발견할 수 있다. 이는 디버깅을 용이하게 한다.
  • 빌드 프로세스 분리: 셰이더 컴파일을 빌드 프로세스의 일부로 포함시키면 메인 애플리케이션의 빌드와 셰이더의 컴파일을 분리할 수 있어 빌드 시간을 최적화할 수 있다.

 

728x90
반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유