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에 데이터를 읽고 쓰는 부분을 모아서 처리해보니 훨씬 더 빠른것을 확인할 수 있었다.