블로그 이미지
자신의 단점을 메꾸는 것을 단(鍛)이라 하고 자신의 강점을 갈고 닦는 것을 련(鍊)이라 하여, 두가지를 합친 것을 단련이라고 부른다. 붕대마음

카테고리

전체목록 (667)
참고사이트 (8)
Goal (4)
Travel (10)
My Life (105)
Game (35)
Game Review (7)
Game Plan (0)
Books (5)
English (1)
Optimizing (12)
Study (218)
유용한 것들_etc (44)
유용한 것들_func (20)
Unity (48)
Unreal (87)
작업장 (54)
RenderMonkey (6)
정리요망 (1)
따라잡기 시리즈 (0)
링크용 (0)
Total344,974
Today26
Yesterday53

'unity shader'에 해당되는 글 2건

  1. 2017.07.10 unity에서 shader를 짤때..
  2. 2017.01.16 Optimizing Shader Load Time

이전에 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
unity에서 shader를 짤때..  (0) 2017.07.10
ARB_precision_hint_fastest  (0) 2017.07.10
The Magic Of Material Property Blocks  (0) 2017.06.23
RenderQueue  (0) 2017.06.21
Posted by 붕대마음

댓글을 달아 주세요

필요에 의해 모자란 실력으로 번역하였습니다.

원문을 참고하시길 권해드립니다. 

원문에 대한 링크는 아래 Reference Link에 있습니다.


셰이더 로드 시간 최적화.

셰이더는 GPU에서 실행되는 작은 프로그램이며, 로딩하는데 시간이 좀 걸린다.

각 개별 GPU 프로그램은 전형적으로 로드하는데 많은 시간이 필요하지 않지만

셰이더는 내부적으로 많은 "변형"을 가지고 있다.

예를 들어 Standard Shader의 경우, 완전히 컴파일 되면, 조금씩 다른 수천개의

GPU 프로그램이 되는데 이는 두가지 잠재적 문제를 만든다.

1. 셰이더 변형이 많으면 게임 구축시간과 게임 데이터 사이즈가 증가한다.

2. 많은 수의 셰이더 변형을 로딩하는 동안 게임은 느려지고 메모리는 증가한다.


Shader build time stripping

게임을 빌드하는 동안 유니티는 내부 셰이더 변형중에서 일부가

게임에 사용되지 않는걸 감지하여 빌드데이터에서 스킵할 수 있다.

build time stripping이 아래와 같은 일을 한다.


1. #pragma shader_feature 구문을 사용하는 셰이더에 대한 개별 셰이더 특성.

만약 특정 변형을 사용하는 머티리얼을 쓰는곳이 없다면 빌드에 포함되지 않는다.

내부 셰이더 변형 문서를 참조.

내장 셰이더중에서는 표준셰이더가 이것을 사용한다.

2. 어느 scene에서도 사용되지 않는 안개와 라이트 매핑 모드를 처리하는 셰이더 변형은

게임 데이터에 포함되지 않는다.

원한다면 이 기능은 Graphics Settings를 참고하여 오버라이드 할 수 있다.


위의 조합을 사용하면 셰이더 데이터 크기가 크게 줄어든다.

예를들어, 완전히 컴파일 된 표준 셰이더는 수 백 메가 바이트 이지만,

일반적인 프로젝트에서는 단지 2메가 바이트 정도밖에 되지 않으며

종종 응용 프로그램 패키징 과정에 의해 더 압축이 된다.


Default Unity shader loading behavior

모두 기본설정으로 되어 있다면 유니티는 shaderlab shader 오브젝트를 메모리로

로드하지만 내부 셰이더 변형이 실제로 필요하기 전까지는 생성하지 않는다.


이는 게임 빌드 안에 포함된 셰이더 변형들이 사용 될 가능성이 있지만,

실제로 사용되기 전까지는 로드 시간이나 비용이 없다는 것을 의미한다.

예를 들어, 셰이더는 항상 그림자가 있는 점광원을 처리하는 변형을 포함하지만,

만약 게임에서 절대 그림자가 있는 점광원을 사용하지 않는다면 , 이 특별한 변형을

굳이 로드할 의미가 없다.


이러한 기본 동작은 셰이더 변수가 필요해 지는 첫번 째 순간에

새 GPU 프로그램 코드가 그래픽 드라이버에 로드되어야 하기 때문에

렉이 걸릴 수 있다는 부작용이 있다.

이러한 현상이 게임 플레이 중에 발생하는 것은 그닥 좋지 않기 떄문에

유니티는 ShaderVariantCollection asset을 사용하여 이 현상을 해결한다.


Shader Variant Collections

ShaderVariantCollection은 기본적으로 셰이더들의 목록 에셋이며,

각 셰이더는 로드 할 패스 타입들과 셰이더 키워드 조합들의 목록이다.


Shader variant collection inspector


실제로 사용되어지는 셰이더와 셰이더의 변형을 기반으로 이 에셋을 만들기 위해,

에디터는 셰이더와 셰이더의 변형이 실제로 사용되어지는지를 추적 할 수 있다.

Graphics Settings 에는 현재 추적된 셰이더에서 새로운 ShaderVariantCollection을 

만드들거나 현재 추적된 셰이더 목록을 지우는 버튼이 있다.


에디터에서 사용되어지는 셰이더로부터 ShaderVariantCollection을 생성.

한번 ShaderVariantCollection 에셋이 있으면, 게임을 로드하는 동안

변형들이 자동으로 선로딩(Graphics Settings에 있는 선로딩 셰이더 리스트)

되어지도록 설정하거나, 스크립트에서 개별 셰이더 변형 모음을 선로딩 할 수 있다.

이에 대해서는 SHaderVariantCollection 클래스를 참조하자.


Reference Link

- Optimizing Shader Load Time (원문)

- Making multiple shader program variants (원문)

- Standard Shader (원문)

- Graphics Settings (원문)

- ShaderVariantCollection (원문)

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

sending message header failed  (0) 2017.02.26
Unity 5.5 AssetBundle.LoadAssetAsync  (0) 2017.01.18
Optimizing Shader Load Time  (0) 2017.01.16
특정 android mobile chipset에서 half 문제  (0) 2016.09.21
shader tip with Intel  (0) 2016.09.08
unity bug with tegra k1  (0) 2016.09.03
Posted by 붕대마음

댓글을 달아 주세요

최근에 달린 댓글

최근에 받은 트랙백

글 보관함