Search Unity

Question how can i get the RWByteAddressBuffer back to cpu correctly?

Discussion in 'Shaders' started by KiraSnow, Aug 12, 2022.

  1. KiraSnow

    KiraSnow

    Joined:
    Feb 22, 2021
    Posts:
    21
    i'm trying to get this buffer back to cpu for debug rendering, but after i use GetData to get back it to cpu in a list, this looks different to what i'm expect, for example if i render every pixel in camera, the every value in RWByteAddressBuffer should be filled, but after i get this to cpu, i found that only part of value at front of list has been filled. ( by read value in compute shader, i'm sure that in gpu side is read and write correctly)

    Code (CSharp):
    1.  
    2. private GraphicsBuffer startOffsetBuffer;
    3. private int startOffsetBufferId;
    4.  
    5. //....
    6. int bufferSizeHead = Dim.x * Dim.y;
    7. int bufferStrideHead = sizeof(uint);
    8. startOffsetBuffer = new GraphicsBuffer(GraphicsBuffer.Target.Raw, bufferSizeHead, bufferStrideHead);
    9. startOffsetBufferId = Shader.PropertyToID("StartOffsetBuffer");
    10.  
    11. cmd = new CommandBuffer();
    12. cmd.SetRenderTarget(targetTexture);
    13. cmd.ClearRenderTarget(true, true,Color.black);
    14. cmd.SetRandomWriteTarget(1, fragmentLinkBuffer);
    15. cmd.SetRandomWriteTarget(2, startOffsetBuffer);
    16. cmd.DrawRenderer(targetMeshRenderer, linkedListMaterial);
    17. targetCamera.AddCommandBuffer(CameraEvent.AfterEverything, cmd);
    18. //....
    19. linkedListMaterial.SetBuffer(startOffsetBufferId, startOffsetBuffer);
    20. //....
    21.  
    22. // try to get back to cpu
    23. uint[] startOffsetTable = new uint[Dim.x * Dim.y];
    24. startOffsetBuffer.GetData(startOffsetTable);
    25.  

    RWByteAddressBuffer StartOffsetBuffer : register(u2);
    //...

    uint uStartOffsetAddress = idx.y*(_Dim.x +1)+ idx.x;
    uint uOldStartOffset;
    StartOffsetBuffer.InterlockedExchange(uStartOffsetAddress, uPixelCount, uOldStartOffset);

     
  2. KiraSnow

    KiraSnow

    Joined:
    Feb 22, 2021
    Posts:
    21
    emmm, i found that i can get close value by divide idx by 4, the problem seems like the date stride not right so it jumped 3 values...
    but i still don't known how to fix it...