Няма описание
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.

OcclusionCullingCommonShaderVariables.cs 4.2KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. namespace UnityEngine.Rendering
  2. {
  3. // TODO make consistent with InstanceOcclusionCullerShaderVariables
  4. [GenerateHLSL(needAccessors = false, generateCBuffer = true)]
  5. internal unsafe struct OcclusionCullingCommonShaderVariables
  6. {
  7. [HLSLArray(OccluderContext.k_MaxOccluderMips, typeof(ShaderGenUInt4))]
  8. public fixed uint _OccluderMipBounds[OccluderContext.k_MaxOccluderMips * 4];
  9. [HLSLArray(OccluderContext.k_MaxSubviewsPerView, typeof(Matrix4x4))]
  10. public fixed float _ViewProjMatrix[OccluderContext.k_MaxSubviewsPerView * 16]; // from view-centered world space
  11. [HLSLArray(OccluderContext.k_MaxSubviewsPerView, typeof(Vector4))]
  12. public fixed float _ViewOriginWorldSpace[OccluderContext.k_MaxSubviewsPerView * 4];
  13. [HLSLArray(OccluderContext.k_MaxSubviewsPerView, typeof(Vector4))]
  14. public fixed float _FacingDirWorldSpace[OccluderContext.k_MaxSubviewsPerView * 4];
  15. [HLSLArray(OccluderContext.k_MaxSubviewsPerView, typeof(Vector4))]
  16. public fixed float _RadialDirWorldSpace[OccluderContext.k_MaxSubviewsPerView * 4];
  17. public Vector4 _DepthSizeInOccluderPixels;
  18. public Vector4 _OccluderDepthPyramidSize;
  19. public uint _OccluderMipLayoutSizeX;
  20. public uint _OccluderMipLayoutSizeY;
  21. public uint _OcclusionTestDebugFlags;
  22. public uint _OcclusionCullingCommonPad0;
  23. public int _OcclusionTestCount;
  24. public int _OccluderSubviewIndices; // packed 4 bits each
  25. public int _CullingSplitIndices; // packed 4 bits each
  26. public int _CullingSplitMask; // only used for early out
  27. internal OcclusionCullingCommonShaderVariables(
  28. in OccluderContext occluderCtx,
  29. in InstanceOcclusionTestSubviewSettings subviewSettings,
  30. bool occlusionOverlayCountVisible,
  31. bool overrideOcclusionTestToAlwaysPass)
  32. {
  33. for (int i = 0; i < occluderCtx.subviewCount; ++i)
  34. {
  35. if (occluderCtx.IsSubviewValid(i))
  36. {
  37. unsafe
  38. {
  39. for (int j = 0; j < 16; ++j)
  40. _ViewProjMatrix[16 * i + j] = occluderCtx.subviewData[i].viewProjMatrix[j];
  41. for (int j = 0; j < 4; ++j)
  42. {
  43. _ViewOriginWorldSpace[4 * i + j] = occluderCtx.subviewData[i].viewOriginWorldSpace[j];
  44. _FacingDirWorldSpace[4 * i + j] = occluderCtx.subviewData[i].facingDirWorldSpace[j];
  45. _RadialDirWorldSpace[4 * i + j] = occluderCtx.subviewData[i].radialDirWorldSpace[j];
  46. }
  47. }
  48. }
  49. }
  50. _OccluderMipLayoutSizeX = (uint)occluderCtx.occluderMipLayoutSize.x;
  51. _OccluderMipLayoutSizeY = (uint)occluderCtx.occluderMipLayoutSize.y;
  52. _OcclusionTestDebugFlags
  53. = (overrideOcclusionTestToAlwaysPass ? (uint)OcclusionTestDebugFlag.AlwaysPass : 0)
  54. | (occlusionOverlayCountVisible ? (uint)OcclusionTestDebugFlag.CountVisible : 0);
  55. _OcclusionCullingCommonPad0 = 0;
  56. _OcclusionTestCount = subviewSettings.testCount;
  57. _OccluderSubviewIndices = subviewSettings.occluderSubviewIndices;
  58. _CullingSplitIndices = subviewSettings.cullingSplitIndices;
  59. _CullingSplitMask = subviewSettings.cullingSplitMask;
  60. _DepthSizeInOccluderPixels = occluderCtx.depthBufferSizeInOccluderPixels;
  61. Vector2Int textureSize = occluderCtx.occluderDepthPyramidSize;
  62. _OccluderDepthPyramidSize = new Vector4(textureSize.x, textureSize.y, 1.0f / textureSize.x, 1.0f / textureSize.y);
  63. for (int i = 0; i < occluderCtx.occluderMipBounds.Length; ++i)
  64. {
  65. var mipBounds = occluderCtx.occluderMipBounds[i];
  66. unsafe
  67. {
  68. _OccluderMipBounds[4*i + 0] = (uint)mipBounds.offset.x;
  69. _OccluderMipBounds[4*i + 1] = (uint)mipBounds.offset.y;
  70. _OccluderMipBounds[4*i + 2] = (uint)mipBounds.size.x;
  71. _OccluderMipBounds[4*i + 3] = (uint)mipBounds.size.y;
  72. }
  73. }
  74. }
  75. }
  76. }