후디니 VDB from Polygons Voxel Size와 메모리 계산
VDB from Polygons에서 Voxel Size를 절반으로 낮추면 메모리도 항상 8배가 될까요? Pyro 글에서 본 8배 규칙을 그대로 가져오면 SDF를 과대평가할 수 있습니다. SDF는 표면 주변의 좁은 띠만 활성화할 수 있기 때문입니다.
Fill Interior를 끈 SDF는 물체의 부피가 아니라 표면적과 Band 폭으로 복셀 수를 먼저 어림하세요. 반대로 Fog나 내부를 채운 필드는 부피 규모로 커질 수 있습니다. 아래 계산기에 형상 크기와 Voxel Size를 넣고, Houdini 19.5.435에서 같은 메시를 바꿔 가며 잰 값과 비교해 보겠습니다.
VDB 활성 복셀·메모리 어림 계산기
크기 단위는 씬 단위로 통일하세요. 상자와 구는 단순한 형상으로 가정합니다.
예를 들어 면적 11.6659, Voxel Size 0.1, Band 3/3을 입력하면 SDF 추정치는 약 7,000개입니다. Float32 값 배열만 보면 약 27.3 KiB입니다. 이 수치는 VDB 파일 용량이나 Windows 작업 관리자에 표시되는 Houdini 전체 메모리와 같지 않습니다.
VDB from Polygons의 Voxel Size는 복셀 한 변의 길이입니다

복셀은 3차원 공간을 나눈 작은 상자입니다. Voxel Size를 0.1에서 0.05로 줄이면 한 변이 절반이 됩니다. 같은 물체를 더 촘촘한 격자로 표현할 수 있지만, 계산량은 저장하는 필드의 모양에 따라 달라집니다.
SideFX 문서는 Voxel Size를 출력 VDB 복셀의 크기로 설명합니다. 이 값보다 작은 표면 특징은 결과에 나타나지 않을 수 있습니다. 따라서 노이즈를 없애려고 무작정 낮추기보다, 보존할 최소 디테일과 물체 크기를 함께 보세요.
Exterior와 Interior Band는 표면 바깥·안쪽의 거리 범위입니다
VDB from Polygons에서 Use World Space for Band를 끄면 Exterior Band Voxels와 Interior Band Voxels는 표면을 기준으로 각각 몇 복셀까지 계산할지를 정합니다. Exterior는 표면 바깥쪽, Interior는 안쪽입니다. 이 글의 계산기는 복셀 단위 Band를 가정합니다.
표면적이 같은 두 물체라도 Band 폭이 넓으면 SDF가 저장할 거리 구간이 커집니다. 그래서 단순히 물체 크기만 입력해서는 충분하지 않습니다. Exterior와 Interior 값을 실제 노드와 같은 단위로 넣어야 합니다. Use World Space for Band를 켜서 거리 단위로 입력한다면, 값을 Voxel Size로 나눠 복셀 수로 바꿔 비교하세요.
Distance VDB와 Fog VDB는 저장하는 값이 다릅니다
Distance VDB는 표면까지의 거리를 저장하는 SDF입니다. 닫힌 메시에서는 물체 안쪽 값이 음수, 바깥쪽 값이 양수입니다. Fill Interior를 끄면 0 표면 주변의 좁은 band가 중심이므로, 빈 공간까지 같은 밀도로 채우는 격자와는 다릅니다.
Fog VDB는 density field입니다. 표면 근처의 띠를 만드는 용도와 내부를 채우는 용도를 구별해야 합니다. Fill Interior를 켜면 닫힌 메시의 안쪽으로 값이 이어지고, 문서 설명대로 표면의 0부터 가장 안쪽의 1까지 gradient가 만들어집니다. 닫히지 않은 메시에서는 내부를 정의할 수 없으니 먼저 구멍과 면 방향을 확인하세요.
Fog 내부 값이 물체 안에 존재한다고 해서 전체 경계 상자가 항상 dense 배열로 저장된다는 뜻은 아닙니다. OpenVDB는 background 값과 같은 빈 영역을 거의 저장하지 않는 sparse 구조입니다. 값이 일정한 타일이나 비활성 영역도 활용할 수 있으므로, Fog의 부피 추정과 실제 메모리 사용량은 같은 숫자로 취급하면 안 됩니다.
여기서 말하는 표면 band는 Pyro solver의 컨테이너와 다른 기준입니다. 연기 시뮬레이션에서 Voxel Size를 반으로 줄였을 때의 밀집 격자 기준은 Pyro Voxel Size와 메모리 글에서 따로 다뤘습니다.
SDF는 면적, 내부를 채운 필드는 부피로 먼저 어림합니다
Fill Interior를 끈 SDF의 활성 복셀 수는 표면적을 복셀 면적으로 나눈 뒤, 표면 안팎의 band 폭을 곱해 대략 계산할 수 있습니다. 식은 표면적 ÷ Voxel Size² × (Exterior Band + Interior Band)입니다. Voxel Size가 절반이면 분모가 4분의 1이 되므로, 같은 면적과 band라면 활성 복셀은 약 4배가 됩니다.
내부를 채운 SDF나 Fog는 내부 값이 부피 규모로 들어갑니다. 기본 추정은 부피 ÷ Voxel Size³입니다. Voxel Size가 절반이면 같은 부피의 복셀 수는 약 8배가 됩니다. 격자 반올림, 표면 voxel, exterior band, sparse 타일 때문에 실제 값은 이 식과 다를 수 있습니다.
직접 표면적만 아는 경우에는 SDF narrow-band 추정은 가능하지만 Fog의 내부 채움은 부피를 별도로 알아야 합니다. 계산기에서 경계 상자를 고르면 표면적과 부피를 직육면체로 계산합니다. 실제 메시는 이 상자보다 표면적이 작거나 부피가 다를 수 있으니, Houdini의 Measure SOP나 실제 메시 치수를 사용하는 편이 낫습니다.
같은 구 메시로 SDF 활성 복셀과 메모리를 측정했습니다
Houdini 19.5.435 Commercial의 hython에서 같은 닫힌 Polygon Sphere를 변환했습니다. 구의 반지름은 1, Rows는 32, Columns는 64이며 Houdini가 측정한 표면적은 11.6659 씬 단위²입니다. Distance VDB만 만들고 Fill Interior는 끈 상태에서 Exterior와 Interior Band를 각각 3으로 고정했습니다.
각 설정은 한 번 워밍업한 다음 SOP를 강제 cook해 세 번 쟀습니다. 활성 복셀은 activeVoxelCount(), 메모리는 출력 geometry의 memoryusage 추정값이며 시간은 세 번의 중앙값입니다.
| Voxel Size | 계산기 추정 | 실측 활성 복셀 | geometry 메모리 추정 | cook 중앙값 |
|---|---|---|---|---|
| 0.20 | 1,750 | 1,958 | 2,451,704 bytes 2.34 MiB | 0.0220초 |
| 0.10 | 7,000 | 7,202 | 2,541,752 bytes 2.42 MiB | 0.0250초 |
| 0.05 | 27,998 | 28,180 | 2,760,440 bytes 2.63 MiB | 0.0265초 |
Voxel Size를 0.20에서 0.10으로 낮췄을 때 활성 복셀은 3.68배, 0.10에서 0.05로 낮췄을 때 3.91배가 됐습니다. 계산식은 각각 약 1,750, 7,000, 27,998개를 예상했습니다. 이 메시와 band에서는 실측과 가까웠지만, 거친 0.20 격자에서는 경계가 복셀과 맞물리는 영향이 더 컸습니다.
Band 폭도 결과를 바꿉니다. Voxel Size 0.1에서 Band 1/1은 2,370개, 3/3은 7,202개, 6/6은 15,669개였습니다. band를 두 배로 늘렸다고 활성 복셀이 정확히 두 배가 되지는 않습니다. 곡면의 기울기와 voxelization이 함께 작용합니다.
실측 메모리는 각각 2.34, 2.42, 2.63 MiB였습니다. 복셀 수와 같은 비율로 늘지 않은 이유는 이 값이 원시 float 값만 세는 숫자가 아니기 때문입니다. Houdini geometry의 고정 비용과 VDB 트리 구조가 포함된 추정치입니다. 이 작은 메시의 cook 시간도 약 0.02초대라서 큰 제작 메시의 메모리나 시간을 예측하는 기준으로 쓰면 안 됩니다.
여기까지 정리하면, 계산기는 기준값이고 실측이 최종 확인입니다
계산식은 같은 형상·필드·band를 비교할 때 해상도를 정하는 출발점입니다. 전체 bounding box를 채우는 volume의 이론값, SDF 표면 band의 근사값, Houdini가 실제로 쓰는 메모리는 서로 다른 숫자입니다. 계산기에 표시되는 float32 용량은 활성 값만 곱한 원시 payload라서 메모리 상한도 아닙니다.
캐시 파일 크기까지 알고 싶다면 메모리 추정과 분리해 보세요. 저장 형식과 압축은 후디니 캐시 형식별 용량 실측에서 따로 비교했습니다.
실제 씬에서는 이 순서로 Voxel Size를 정하세요
- 먼저 보존해야 하는 최소 표면 디테일을 정하고 Voxel Size를 고르세요.
- 노드에서 Distance VDB인지 Fog VDB인지, Fill Interior가 켜졌는지 확인하세요.
- Exterior·Interior Band 단위가 voxel인지 world space인지 확인하고 같은 단위로 계산기에 넣으세요.
- 표면만 쓰는 SDF는 표면적 식을, 내부를 채우는 필드는 부피 식을 기준으로 비교하세요.
- 작은 테스트 메시에서 activeVoxelCount와 geometry memoryusage를 읽고, 큰 실제 메시에서는 Houdini의 프로세스 메모리도 별도로 확인하세요.
결국 SDF의 좁은 band는 부피보다 표면적을 먼저 보세요. 내부를 채우는 Fog나 SDF는 부피 규모의 값이 들어가지만, sparse 저장과 실제 메모리 오버헤드 때문에 활성 복셀 추정만으로 전체 RAM을 단정하지 마세요.
참고 자료
vfx 잡학지식

댓글 0
첫 댓글을 남겨보세요.