설명 없음
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

GeometryPoolKernels.compute 4.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. #pragma kernel MainUpdateIndexBuffer16
  2. #pragma kernel MainUpdateIndexBuffer32
  3. #pragma kernel MainUpdateVertexBuffer
  4. #include "GeometryPoolDefs.cs.hlsl"
  5. #include "GeometryPool.hlsl"
  6. #pragma multi_compile UV0_DIM2 UV0_DIM3 UV0_DIM4
  7. #pragma multi_compile UV1_DIM2 UV1_DIM3 UV1_DIM4
  8. //#pragma enable_d3d11_debug_symbols
  9. #define GROUP_SIZE_X 256
  10. #define GROUP_SIZE_X_HALF (GROUP_SIZE_X >> 1)
  11. int _DispatchIndexOffset;
  12. int _InputIBBaseOffset;
  13. int _InputIBCount;
  14. int _InputFirstVertex;
  15. int _OutputIBOffset;
  16. ByteAddressBuffer _InputIndexBuffer;
  17. RWStructuredBuffer<uint> _OutputIndexBuffer;
  18. [numthreads(GROUP_SIZE_X,1,1)]
  19. void MainUpdateIndexBuffer32(uint3 dispatchThreadID : SV_DispatchThreadID, int3 groupID : SV_GroupID)
  20. {
  21. uint bufferOffset = _DispatchIndexOffset + dispatchThreadID.x;
  22. if (bufferOffset >= (uint)_InputIBCount)
  23. return;
  24. uint indexVal = _InputIndexBuffer.Load((_InputIBBaseOffset + bufferOffset) << 2u);
  25. _OutputIndexBuffer[(uint)_OutputIBOffset + bufferOffset] = indexVal - _InputFirstVertex;
  26. }
  27. groupshared uint _ldsIndexCache[GROUP_SIZE_X_HALF + 1];
  28. [numthreads(GROUP_SIZE_X,1,1)]
  29. void MainUpdateIndexBuffer16(uint3 dispatchThreadID : SV_DispatchThreadID, uint groupIndex : SV_GroupIndex, uint3 groupID : SV_GroupID)
  30. {
  31. if (groupIndex < (GROUP_SIZE_X_HALF + 1))
  32. _ldsIndexCache[groupIndex] = _InputIndexBuffer.Load((GROUP_SIZE_X_HALF * (groupID.x) + groupIndex + (uint)(_InputIBBaseOffset + _DispatchIndexOffset) / 2) << 2u);
  33. GroupMemoryBarrierWithGroupSync();
  34. uint bufferOffset = _DispatchIndexOffset + dispatchThreadID.x;
  35. if (bufferOffset >= (uint)_InputIBCount)
  36. return;
  37. uint localOffset = groupIndex + ((_InputIBBaseOffset + _DispatchIndexOffset) & 0x1);
  38. uint pair = _ldsIndexCache[localOffset >> 1u];
  39. uint value = (localOffset & 0x1) ? (pair >> 16) : (pair & 0xffff);
  40. _OutputIndexBuffer[(uint)_OutputIBOffset + bufferOffset] = value - _InputFirstVertex;
  41. }
  42. int _InputVBCount;
  43. int _InputBaseVertexOffset;
  44. int _DispatchVertexOffset;
  45. int _OutputVBSize;
  46. int _OutputVBOffset;
  47. int _InputPosBufferStride;
  48. int _InputPosBufferOffset;
  49. int _InputUv0BufferStride;
  50. int _InputUv0BufferOffset;
  51. int _InputUv1BufferStride;
  52. int _InputUv1BufferOffset;
  53. int _InputNormalBufferStride;
  54. int _InputNormalBufferOffset;
  55. ByteAddressBuffer _PosBuffer;
  56. ByteAddressBuffer _Uv0Buffer;
  57. ByteAddressBuffer _Uv1Buffer;
  58. ByteAddressBuffer _NormalBuffer;
  59. RWStructuredBuffer<uint> _OutputVB;
  60. int _AttributesMask;
  61. [numthreads(GROUP_SIZE_X, 1, 1)]
  62. void MainUpdateVertexBuffer(uint3 dispatchThreadID : SV_DispatchThreadID)
  63. {
  64. int inputVertexOffset = _DispatchVertexOffset + (int)dispatchThreadID.x;
  65. if ((int)inputVertexOffset >= _InputVBCount)
  66. return;
  67. inputVertexOffset += _InputBaseVertexOffset;
  68. GeoPoolVertex vtx = (GeoPoolVertex)0;
  69. if (_AttributesMask & GEOPOOLVERTEXATTRIBS_POSITION)
  70. vtx.pos = asfloat(_PosBuffer.Load3(_InputPosBufferOffset + (inputVertexOffset * _InputPosBufferStride)));
  71. if (_AttributesMask & GEOPOOLVERTEXATTRIBS_UV0)
  72. {
  73. #if UV0_DIM2
  74. vtx.uv0.xy = asfloat(_Uv0Buffer.Load2(_InputUv0BufferOffset + (inputVertexOffset * _InputUv0BufferStride)));
  75. #elif UV0_DIM3
  76. vtx.uv0.xyz = asfloat(_Uv0Buffer.Load3(_InputUv0BufferOffset + (inputVertexOffset * _InputUv0BufferStride)));
  77. #elif UV0_DIM4
  78. vtx.uv0 = asfloat(_Uv0Buffer.Load4(_InputUv0BufferOffset + (inputVertexOffset * _InputUv0BufferStride)));
  79. #endif
  80. }
  81. if (_AttributesMask & GEOPOOLVERTEXATTRIBS_UV1)
  82. {
  83. #if UV1_DIM2
  84. vtx.uv1.xy = asfloat(_Uv1Buffer.Load2(_InputUv1BufferOffset + (inputVertexOffset * _InputUv1BufferStride)));
  85. #elif UV1_DIM3
  86. vtx.uv1.xyz = asfloat(_Uv1Buffer.Load3(_InputUv1BufferOffset + (inputVertexOffset * _InputUv1BufferStride)));
  87. #elif UV1_DIM4
  88. vtx.uv1 = asfloat(_Uv1Buffer.Load4(_InputUv1BufferOffset + (inputVertexOffset * _InputUv1BufferStride)));
  89. #endif
  90. }
  91. if (_AttributesMask & GEOPOOLVERTEXATTRIBS_NORMAL)
  92. vtx.N = asfloat(_NormalBuffer.Load3(_InputNormalBufferOffset + (inputVertexOffset * _InputNormalBufferStride)));
  93. uint outputVertexOffset = _DispatchVertexOffset + (int)dispatchThreadID.x;
  94. GeometryPool::StoreVertex(_OutputVBOffset + outputVertexOffset, vtx, _OutputVBSize, _OutputVB);
  95. }