Programing 공부
데이터 읽고 쓰기
RuNaPi
2023. 5. 26. 15:44
도형들을 복셀화한다음 복셀정보를 텍스처에 기록하던 도중 다음과 같이 하고있었다.
그런데 UAV에 데이터를 읽고 쓰기하는 작업이 오버헤드가 읽어날 경우 많이 느린것을 깨달았다.
[numthreads(4, 4, 4)]
void main(uint3 DTid : SV_DispatchThreadID)
{
uint3 _id = DTid * 2;
[unroll(8)]
for (uint i = 0; i < 8; i++)
{
uint3 _temp = uint3(0, 0, 0);
_temp.x = (i && 1u);
_temp.y = (i && 2u) >> 1;
_temp.z = (i && 4u) >> 2;
uint3 _wirtePos = _id + _temp;
uint _id = Flatten3D(_wirtePos, voxel_radiance._dataRes);
VoxelType voxel = VoxelGrid[_id];
float4 _color = DecodeColor(voxel._colorMask);
VoxelTexture[_wirtePos] = _color;
VoxelGrid[_id]._colorMask = 0;
}
}
기존에는 위와 같이 for문으로 처리를 했었는데 해상도를 256으로 바꾸던 과정에서 시간이 매우 오래 걸리는것을 확인하였다.
[numthreads(4, 4, 4)]
void main(uint3 DTid : SV_DispatchThreadID)
{
uint3 _id = DTid * 2;
uint _idies[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
uint3 _wirtePos[8] = {
uint3(0, 0, 0),
...
uint3(0, 0, 0)
};
float4 _colors[8] = {
float4(0.f, 0.f, 0.f, 0.f),
...
float4(0.f, 0.f, 0.f, 0.f)
};
_wirtePos[0] = _id + uint3(0, 0, 0);
...
_wirtePos[7] = _id + uint3(1, 1, 1);
_idies[0] = Flatten3D(_wirtePos[0], voxel_radiance._dataRes);
...
_idies[7] = Flatten3D(_wirtePos[7], voxel_radiance._dataRes);
VoxelType voxel[8] = {
VoxelGrid[_idies[0]],
...
VoxelGrid[_idies[7]]
};
_colors[0] = DecodeColor(voxel[0]._colorMask);
...
_colors[7] = DecodeColor(voxel[7]._colorMask);
VoxelTexture[_wirtePos[0]] = _colors[0];
...
VoxelTexture[_wirtePos[7]] = _colors[7];
VoxelGrid[_idies[0]]._colorMask = 0;
...
VoxelGrid[_idies[7]]._colorMask = 0;
}
그래서 한번 UAV에 데이터를 읽고 쓰는 부분을 모아서 처리해보니 훨씬 더 빠른것을 확인할 수 있었다.