unity에서 shader를 짤때..

반응형

이전에 PC시절에는 HLSL을 사용했고 언렬3에서는 glsl을 사용했는데 유니티로 넘어와서는

처음에는 surface shader를 사용하다가 뭔가 찜찜하고 애매하고, 새 문법도 자주 까먹고,

내가 surface shader로 짜도 유니티가 vertex, fragment로 자동으로 변환해 주는데 이 과정도 없었으면 좋겠고 해서,

그냥 cg로 짜다보니 그냥 맘편히 계속 cg로 짜게 되었다.

다른 사람은 surface가 편하다고 하는데 나도 옛날 마인드인가 그냥 손에익은게 편한듯...


실제로 surface shader로 만들어진 shader 파일을 보면 인스펙터 창에 아래와 같이 generated code 버튼이 있다.

이 버튼을 누르면 자동으로 vertex, fragment shader로 변환된 코드를 보여준다.


surface shader를 사용하지 않고 vertex, fragment shader로 구현한 shader 파일은 아래와 같이 보인다.


surface shader는 실제 cg라기 보다는 unity 매크로로 이루어진 거라 cg로 한번 변환이 들어간다.

어차피 이 변환이 게임 성능이나 퍼포먼스에는 영향이 미치지 않겠지만 만들어준 코드를 보면

그냥 내가 내입맞대로 잘 짜는게 더 좋을것 같다.

그래도 surface shader는 입맛에 맞다면 나름 좋은 방식인 것 같다.

겉으로는 코드가 단순해지고 코딩 시간이 줄기 때문이다.


출처 : unity shader system


위 이미지는 cg/hlsl을 glsl로 변환하는 과정을 도식화 한 것이다.

cg로 shader를 짜면 이를 중간중간에 들어간 shaderlab 코드를 cg로 만들어 주고 이를 다시 hlsl로 만들어 준다.

그리고 다시 이를 glsl로 변환하고 최적화를 두번 해 준다.


여기서 드는 생각.

1. Cg랑 HLSL이랑 이 두 언어는 분명 다른언어인데 유니티는 왜 똑같이 취급할까?

간단하게 정리하자면 Cg랑 HLSL이랑 문법이 거의 똑같고 호환이 잘되서 걍 하나라고 말하는 듯 하다.

실제로는 Cg는 nvidia, hlsl은 microsoft거니까.. 자세히 알아보길 원한다면 아래 참고사이트를 보면 굳굳.

cg == hlsl or cg != hlsl

cg vs glsl 비교

셰이더 종류


2. 완벽하게 내입맛대로 유니티가 자동르로 바꾸는 구문없는 shader를 만들기 위해 glsl로 짜는게 좋을까?

유니티에서는 shader를 작성할 때 cg처럼 glsl도 가능하다.

CGPROGRAM 처럼 GLSLPROGRAM을 지원한다.

하지만 raw GLSL은 테스트 목적으로만 권장하며 특정 디바이스에 맞게 사용할 때만 사용해야 한다.

위의 이미지를 보면 cg/hlsl -> glsl의 변환은 지원을 하지만 glsl -> cg/hlsl의 변환은 지원하지 않는다.


유니티 도큐먼트를 보면..

"ShaderLab 내의 Shader들은 CG/HLSL 프로그래밍 언어로 작성되었다.

Cg와 Dx9-Styile HLSL 은 실제로 하나이고 같은 언어이며, 그래서 CG와 HLSL을 교대해서 쓸 수 있다.

(자세한 내용은 이곳을 참조하세요.)


Reference Link

- What would you choose to write unity shaders GLSL, HLSL/CG or Surface lang?

- unit doc, GLSL 쉐이더 프로그램

- unity doc, Shader Compilation for Multiple Platforms

- unity doc, Shading Language used in Unity

- unity shader system

- cg == hlsl or cg != hlsl

- cg vs glsl 비교

- 셰이더 종류

- Shader Compilation for Multiple Platforms

-

'Unity > Unity Study' 카테고리의 다른 글

ExecuteInEditMode  (0) 2017.09.13
Inspector에서 AnimationCurve 버그  (0) 2017.07.21
ARB_precision_hint_fastest  (0) 2017.07.10
The Magic Of Material Property Blocks  (0) 2017.06.23
RenderQueue  (0) 2017.06.21
TAGS.

Comments