Home SH와 LightingData.asset
Post
Cancel

SH와 LightingData.asset

저번에 라이트 프로브를 구우면 저장된다고 언급했습니다.

네. 이제 그 데이터를 까볼 차례입니다.

테스트 환경

Untitled

정확한 측정을 위해 9번째 라이트프로브를 0,0,0에 배치, 렌더러 한놈도 0,0,0에 배치합니다


그리고 렌더러를 통해 sh 계수를 확인합니다.

1
2
3
4
5
6
7
8
LightProbes.GetInterpolatedProbe(transform.position, GetComponent<Renderer>(), out var sh);
var str = new List<float>();
for (int i = 0; i < 27; ++i)
{
    str.Add(sh[0, i]);
}
Debug.Log(string.Join("\n", str.ToArray()));

결과는 다음과 같습니다

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
    0.3936577
   -0.009278025
   -0.00286768
    0.2757259
    0.001405876
   -0.002220681
   -0.01042761
   -0.002857562
    0.04266184
    0.4405702
    0.2885313
    0.002337989
    0.005848728
    0.002141719
   -0.003302233
   -0.00873787
   -0.004457876
   -0.03024092
    0.5067607
    0.06571686
    0.2580564
    0.01104203
    0.003900682
   -0.005937763
    0.02884575
   -0.006483006
    0.00857236

그리고 라이트맵을 구운 후,

씬을 뒤져보면 아무것도 안나옵니다.

라이팅 데이터 뜯어보기

LightingData.asset을 찾아서 hexEditor를 통해 데이터를 까봅니다.

Untitled

난리가 났지만 침착하게, 필요한 리스트를 가져와봅니다.


두개의 나열리스트가 있는데, 일단 뒤쪽을 데려오겠습니다. 위쪽은 너무 빡세요

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
LightProbes

PPtr<EditorExtension>

m_FileID

m_PathID

PPtr<PrefabInstance>

LightProbeData

m_Data

ProbeSetTetrahedralization

m_Tetrahedralization

m_Tetrahedra

Tetrahedron

indices[0]

indices[1]
indices[2]
indices[3]
neighbors[0]
neighbors[1]
neighbors[2]
neighbors[3]
Matrix3x4f
matrix
e00
e01
e02
e03
e10
e11
e12
e13
e20
e21
e22
e23
isValid
m_HullRays
x
y
z
m_ProbeSets
ProbeSetIndex
m_Hash
bytes[0]
bytes[1]
bytes[2]
bytes[3]
bytes[4]
bytes[5]
bytes[6]
bytes[7]
bytes[8]
bytes[9]
bytes[10]
bytes[11]
bytes[12]
bytes[13]
bytes[14]
bytes[15]
m_Offset
m_Size
m_Positions
m_NonTetrahedralizedProbeSetIndexMap
m_BakedCoefficients
SphericalHarmonicsL2
sh[ 0]
sh[ 1]
sh[ 2]
sh[ 3]
sh[ 4]
sh[ 5]
sh[ 6]
sh[ 7]
sh[ 8]
sh[ 9]
sh[10]
sh[11]
sh[12]
sh[13]
sh[14]
sh[15]
sh[16]
sh[17]
sh[18]
sh[19]
sh[20]
sh[21]
sh[22]
sh[23]
sh[24]
sh[25]
sh[26]
m_BakedLightOcclusion
LightProbeOcclusion
m_ProbeOcclusionLightIndex
m_Occlusion
m_OcclusionMaskChannel

그러면 SH 값은 파일의 끝에 가깝겠군요.

hex editor형식으로 데이터를 열어보면,

Untitled

쓸데없는 데이터 치우고 읽어보면 익숙한 float32의 값이 보입니다.

네. “0.00857236”. sh[26]의 값과 유사합니다 (유니티의 디버그 로그는 적당히 값을 반올림합니다)


그러면 27개의 값이 모두 동일할까요?

sh.gif

정답은 『맞다』 입니다.

Untitled

이렇게 한블럭이 프로브 하나의 sh를 담당하는 것이죠 (4바이트 * 3 * 9)


그렇게 총 9개의 블럭,

Untitled (아래 한줄 더있음)

이만큼의 데이터가 SH용 데이터입니다.

Untitled

m_BakedCoefficients = 프로브의 갯수입니다. 09개죠.

Untitled

m_Positions의 데이터는 27(9개, x,y,z, 마지막은 0,0,0이므로 00 00 00 ..) 개입니다.

1
2
00 00 80 3F = 1,
00 00 80 BF = -1

위 값을 본다면

Untitled

인덱스에 대한 포지션을 알 수 있죠. (혹은 반대로라거나)

Untitled

여기는 정확히 무슨데이터인지 모르겠습니다.

offset or size이며, 13\frac{1}{\sqrt{3}} 과 0 입니다.


전반적으로 다 09 00 00 00 인 사이즈(9)를 붙이고 시작하니 읽기 좀 낫네요.

아래

이 뒤쪽 데이터는

Untitled

1
2
3
4
5
m_BakedLightOcclusion
LightProbeOcclusion
m_ProbeOcclusionLightIndex
m_Occlusion
m_OcclusionMaskChannel

의 데이터를 담당하고 있을 것입니다.

아니면 버퍼로 더 데이터가 들어갈 수도 있을 것 입니다.

후기

하지만 저는 이제 관심이 없습니다.

데이터 찾는다고 눈깔빠져라 찾았거든요.

처음엔 버퍼끝마다 1바이트씩 미는줄 알았습니다.

엔디안도 리틀인지 빅인지 모르는 상태였구요.


에라이.


끝.

This post is licensed under CC BY 4.0 by the author.