일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- 게임제작
- C#
- 리듬게임에디터
- 짐벌락
- 인터페이스
- callbyvalue
- 확장메서드
- callbyreference
- 1인개발
- ar
- 유니티
- AR Foundation
- Quaternion
- Unity
- AR세팅
- ExtensionMethod
- 병맛게임
- 레이캐스트
- 로케트
- ARProgect
- github
- 리듬게임
- 게임
- 델리게이트
- 게임개발
- 소규모프로젝트
- Euler
- AR게임
- raycast
- 깃허브
- Today
- Total
Ssssong += Dev
[유니티/셰이더] OmniShader 분석 본문
OmniShadeCore.cginc 분석
- 참고하면 좋은 Shader 수학 함수
https://shimans.tistory.com/50
Surface Shader 수학함수
http://blog.naver.com/dieofflee/220074075105 유니티 Shader에서 사용되는 다양한 함수들이 있습니다 그중 Cg수학 함수만 먼저 정리해보도록 하겠습니다 Unity에서 제공하는 Mathf 함수와 비슷하다고 생각하시
shimans.tistory.com
struct v2f
-----------------------------------------------------------
싱글 패스 인스턴스화 렌더링 - Unity 매뉴얼
Single Pass Instanced 렌더링(’스테레오 인스턴싱’이라고도 불림)을 사용하면 GPU가 단일 렌더 패스를 수행하여 각 드로우 콜을 인스턴스화된 드로우 콜로 교체합니다. 이렇게 하면 두 드로우 콜 간
docs.unity3d.com
struct v2f {} 구조체에
UNITY_VERTEX_INPUT_INSTANCE_ID
UNITY_VERTEX_OUTPUT_STEREO
라 선언된 부분이 어떤 역할을 하는 지 알아보았다.
GPU 인스턴싱에 대한 것이었다!
(유니티 도큐먼트 중에서)
싱글 패스 인스턴스화 렌더링
Single Pass Instanced 렌더링(스테레오 렌더링)을 사용하면 GPU가 단일 렌더 패스를 수행하여
각 드로우 콜을 인스턴스화된 드로우 콜로 교체합니다. 이렇게 하면 두 드로우 콜 간의 캐시 일관성으로 인해 CPU 사용이 대폭 감소하고 GPU 사용은 소폭 감소합니다. 또한 애플리케이션의 전력 소비도 크게 절감됩니다.
캐시 일관성 : 여러 로컬 캐시에 저장되는 공유 리소스 데이터의 균일성.
https://en.wikipedia.org/wiki/Cache_coherence
Cache coherence - Wikipedia
From Wikipedia, the free encyclopedia Jump to navigation Jump to search Computer architecture term concerning shared resource data An illustration showing multiple caches of some memory, which acts as a shared resource Incoherent caches: The caches have di
en.wikipedia.org
트리플라나 매핑
struct v2f 선언 시 TRIPLANAR인지 아닌지 검사하는 부분이 있어 찾아보았다.
TRIPLANAR 여부에 따라 v2f 구조체에서 float3 tan_world 계산 결과가 다르다.(이 이유도 생각해보자.)
https://github.com/iamslash/UnityShaderTutorial/blob/master/Assets/Tutorials/triplanar/triplanar.md
GitHub - iamslash/UnityShaderTutorial: awesome unity3d shader tutorial
awesome unity3d shader tutorial. Contribute to iamslash/UnityShaderTutorial development by creating an account on GitHub.
github.com
TRIPLANAR
uv 좌표는 그리드에서 펼쳐지며 XY 평면에 고르게 배치되는데
지형의 높이 차이를 고려하지 않고 늘이기를 유발하기 때문에 텍스처가 뒤틀려 있다.
이를 방지하기 위해 사용하는 매핑 기술이다.
트리플라나 매핑은 UV 좌표를 사용하지 않고 vertex shader에서 물체의 로컬 좌표나 월드 좌표를 반환하고
fragment shader에서 새로운 UV 좌표를 만들어 물체에 투영시키는 기법이다.
공식이 있는데... 원리가 바로 안읽히지만 천천히 읽어보자.
half3 blend = abs(i.objNormal);
blend /= dot(blend, 1.0)
FUNCTIONS
-----------------------------------------------------------
PlantSway
-> 식물 흔들리는 효과 적용
ColorBrightness
-> 색깔 밝기 조절
TangentSpaceNormalToWorldSpaceNormal
float3 TangentSpaceNormalToWorldSpaceNormal(float3 nor_world, float4 tan_world, float3 nor_tan) {
float3 bin_world = cross(nor_world, tan_world.xyz) * tan_world.w;
float3 ts0 = float3(tan_world.x, bin_world.x, nor_world.x);
float3 ts1 = float3(tan_world.y, bin_world.y, nor_world.y);
float3 ts2 = float3(tan_world.z, bin_world.z, nor_world.z);
return normalize(float3(dot(ts0, nor_tan), dot(ts1, nor_tan), dot(ts2, nor_tan)));
}
여기서 cross는 외적 계산이다. 그래픽스 책 다시 보고 생각해보자...
IsLitMainLight
bool IsLitMainLight(float3 unity_LightData, uint meshRenderingLayers, bool isSpecular) {
// Specular is on for baked directional lighting
#if DIRLIGHTMAP_COMBINED
if (isSpecular)
return true;
#endif
// Fix for URP mixed lighting
#if URP && LIGHTMAP_ON
return false;
#endif
bool cullingMask = unity_LightData.z == 1;
#if URP && (_LIGHT_LAYERS && UNITY_VERSION >= 202102)
bool layerMask = IsMatchingLightLayer(_MainLightLayerMask, meshRenderingLayers);
return cullingMask && layerMask;
#else
return cullingMask;
#endif
}
여기도 좀 더 이해해보자.
BlendDetail
-> 컬러 블렌딩 설정. _DETAILBLEND 설정에 따라 컬러 블렌딩 계산을 다르게 해주고 있다.
BlendMatCap
-> _MATCAPBLED 설정에 따라 컬러를 섞어준다.
MatCap 셰이더는 모바일에서 유용하게 사용할 수 있는 이미지 기반 라이팅 중 하나이다.
Material Capture는 현실 세계의 라이팅을 수집해서 캡쳐하기 위한 구체를 의미한다.
보통 CG 영상이나 이미지에서 실사 렌더링을 위한 라이팅 참고 자료로 사용하기 위한 용도로 만들어진다.
MatCap 셰이더는 이런 Material Capture를 그대로 텍스쳐로 만들어서 라이팅 결과로 활용하는 것이다.
재질에 따른 라티잉르 미리 텍스처로 만들어놓기 때문에 실시간으로 라이팅 연산을 하지 않고도
실사적인 라이팅을 표현할 수 있다.
https://learn.foundry.com/ko/modo/content/help/pages/shading_lighting/shader_items/matcap.html
매트 캡 쉐이더
learn.foundry.com
PBS 느낌을 흉내내기 위한 Metallic MatCap 쉐이더
들어가며물리기반렌더링( Physically based rendering, PBR, Physically based shading, PBS, 이하 PBR, PBS)이라는 키워드가 떠오른 것은 꽤 오래 되었고 이미 PC나 콘솔에서는 널리 적용되었습니다. 최근 출시한 메
ozlael.tistory.com
BlendRim
-> Rim 블랜딩을 위해 _RIMBLEND 설정에 따라 연산해준다.
BlendLayer1 , BlendLayer2, BlendLayer3
-> 각 레이어에 의한 블랜딩 설정에 따라 연산해준다.
BlendHeightColors
-> _HEIGHTCOLORSBLEND 설정에 따라 연산해준다. 높이에 따른 색
Layer1 / Layer2 / Layer3
-> 레이어 텍스처를 계산해주기 위한 메서드.
그런데 여기 쓰인 TRANSFORM_TEX는 뭘까?
TRANSFORM_TEX
UnityCG.cginc 폴더에 보면 이런게 있다 // Transforms 2D UV by scale/bias property#define TRANSFORM_TEX(tex,name) (tex.xy * name##_ST.xy + name##_ST.zw) 코드에서는 UnityCG.cginc를 include 해서 아래와 같이 사용한다.o.uv = TRANSFORM_
mgun.tistory.com
머티리얼이 가진 기울기와 오프셋 필드와 관련된다.
VERTEX SHADER
-----------------------------------------------------------
v2f vert(appdata_full b) {} 으로 구성된다.
v2f o;
UNITY_INITIALIZE_OUTPUT(v2f, o) //주어진 타입의 변수 이름을 0으로 초기화
UNITY_SETUP_INSTANCE_ID(v); //이 옵션을 사용하여 인스턴스 ID가 셰이더 함수에 엑세스할 수 있게 만들 수 있다.
UNITY_TRANSFER_INSTANCE_ID(v, o); //이 옵션을 사용하여 버텍스 셰이더의 입력 구조에서 출력 주조로 인스턴스 ID를 복사할 수 있다.
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); //텍스처 배열에서 어느 쪽 눈에 렌더링되어야 하는지(Single Pass Instanced 렌더링 참조)
https://docs.unity3d.com/kr/2018.4/Manual/GPUInstancing.html
GPU 인스턴싱 - Unity 매뉴얼
GPU 인스턴싱을 사용하면 적은 수의 드로우 콜을 사용하여 동일한 메시의 여러 복제본을 한 번에 그리거나 렌더링할 수 있습니다. 씬에서 반복적으로 나타나는 건물, 나무, 풀 등의 오브젝트를
docs.unity3d.com
https://docs.unity3d.com/kr/2018.4/Manual/SinglePassInstancing.html
싱글 패스 인스턴스화 렌더링 - Unity 매뉴얼
Single Pass Instanced 렌더링(’스테레오 인스턴싱’이라고도 불림)을 사용하면 GPU가 단일 렌더 패스를 수행하여 각 드로우 콜을 인스턴스화된 드로우 콜로 교체합니다. 이렇게 하면 두 드로우 콜 간
docs.unity3d.com
mul() 연산은 행렬 곱셈이다.
이후 o에 대한 버텍스 계산 다수...
FRAGMENT SHADER
-----------------------------------------------------------
버텍스 셰이더에서 전달 받은 값으로 레스터라이즈를 수행한다.
UnpackNormal
https://forum.unity.com/threads/unpacknormal-fixed4-packednormal-role.101163/
UnpackNormal(fixed4 packednormal) role ?
Hello ! I really don't understand the UnpackNormal( ) function... Let-alone the code inside "UnityCG.cginc" ... inline fixed3...
forum.unity.com
https://m.blog.naver.com/sorkelf/40157218010
법선 매핑(노멀 맵, Normal Map) 파헤치기
폴리곤의 표면에는 텍스처가 입혀져 있다. 이것은 3D 게임을 만들려는 사람은 물론 누구라도 알고 있는 사...
blog.naver.com
위 블로그를 보면 노말맵 벡터 계산에 대해 좀 더 알 수 있다.
노말맵은 RGB로 표현되어 각 R,G,B를 벡터의 XYZ값으로 치환해야 한다.
색상값은 0~1의 범위로 마이너스를 표현하지 못하므로 0~1 범위를 -1~1범위로 치환해주는 과정 또한 필요하다.