Hammersley.hlsl 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423
  1. #ifndef UNITY_HAMMERSLEY_INCLUDED
  2. #define UNITY_HAMMERSLEY_INCLUDED
  3. // Ref: http://holger.dammertz.org/stuff/notes_HammersleyOnHemisphere.html
  4. uint ReverseBits32(uint bits)
  5. {
  6. #if (SHADER_TARGET >= 45)
  7. return reversebits(bits);
  8. #else
  9. bits = (bits << 16) | (bits >> 16);
  10. bits = ((bits & 0x00ff00ff) << 8) | ((bits & 0xff00ff00) >> 8);
  11. bits = ((bits & 0x0f0f0f0f) << 4) | ((bits & 0xf0f0f0f0) >> 4);
  12. bits = ((bits & 0x33333333) << 2) | ((bits & 0xcccccccc) >> 2);
  13. bits = ((bits & 0x55555555) << 1) | ((bits & 0xaaaaaaaa) >> 1);
  14. return bits;
  15. #endif
  16. }
  17. real VanDerCorputBase2(uint i)
  18. {
  19. return ReverseBits32(i) * rcp(4294967296.0); // 2^-32
  20. }
  21. real2 Hammersley2dSeq(uint i, uint sequenceLength)
  22. {
  23. return real2(real(i) / real(sequenceLength), VanDerCorputBase2(i));
  24. }
  25. static const real2 k_Hammersley2dSeq16[] = {
  26. real2(0.00000000, 0.00000000),
  27. real2(0.06250000, 0.50000000),
  28. real2(0.12500000, 0.25000000),
  29. real2(0.18750000, 0.75000000),
  30. real2(0.25000000, 0.12500000),
  31. real2(0.31250000, 0.62500000),
  32. real2(0.37500000, 0.37500000),
  33. real2(0.43750000, 0.87500000),
  34. real2(0.50000000, 0.06250000),
  35. real2(0.56250000, 0.56250000),
  36. real2(0.62500000, 0.31250000),
  37. real2(0.68750000, 0.81250000),
  38. real2(0.75000000, 0.18750000),
  39. real2(0.81250000, 0.68750000),
  40. real2(0.87500000, 0.43750000),
  41. real2(0.93750000, 0.93750000)
  42. };
  43. static const real2 k_Hammersley2dSeq32[] = {
  44. real2(0.00000000, 0.00000000),
  45. real2(0.03125000, 0.50000000),
  46. real2(0.06250000, 0.25000000),
  47. real2(0.09375000, 0.75000000),
  48. real2(0.12500000, 0.12500000),
  49. real2(0.15625000, 0.62500000),
  50. real2(0.18750000, 0.37500000),
  51. real2(0.21875000, 0.87500000),
  52. real2(0.25000000, 0.06250000),
  53. real2(0.28125000, 0.56250000),
  54. real2(0.31250000, 0.31250000),
  55. real2(0.34375000, 0.81250000),
  56. real2(0.37500000, 0.18750000),
  57. real2(0.40625000, 0.68750000),
  58. real2(0.43750000, 0.43750000),
  59. real2(0.46875000, 0.93750000),
  60. real2(0.50000000, 0.03125000),
  61. real2(0.53125000, 0.53125000),
  62. real2(0.56250000, 0.28125000),
  63. real2(0.59375000, 0.78125000),
  64. real2(0.62500000, 0.15625000),
  65. real2(0.65625000, 0.65625000),
  66. real2(0.68750000, 0.40625000),
  67. real2(0.71875000, 0.90625000),
  68. real2(0.75000000, 0.09375000),
  69. real2(0.78125000, 0.59375000),
  70. real2(0.81250000, 0.34375000),
  71. real2(0.84375000, 0.84375000),
  72. real2(0.87500000, 0.21875000),
  73. real2(0.90625000, 0.71875000),
  74. real2(0.93750000, 0.46875000),
  75. real2(0.96875000, 0.96875000)
  76. };
  77. static const real2 k_Hammersley2dSeq64[] = {
  78. real2(0.00000000, 0.00000000),
  79. real2(0.01562500, 0.50000000),
  80. real2(0.03125000, 0.25000000),
  81. real2(0.04687500, 0.75000000),
  82. real2(0.06250000, 0.12500000),
  83. real2(0.07812500, 0.62500000),
  84. real2(0.09375000, 0.37500000),
  85. real2(0.10937500, 0.87500000),
  86. real2(0.12500000, 0.06250000),
  87. real2(0.14062500, 0.56250000),
  88. real2(0.15625000, 0.31250000),
  89. real2(0.17187500, 0.81250000),
  90. real2(0.18750000, 0.18750000),
  91. real2(0.20312500, 0.68750000),
  92. real2(0.21875000, 0.43750000),
  93. real2(0.23437500, 0.93750000),
  94. real2(0.25000000, 0.03125000),
  95. real2(0.26562500, 0.53125000),
  96. real2(0.28125000, 0.28125000),
  97. real2(0.29687500, 0.78125000),
  98. real2(0.31250000, 0.15625000),
  99. real2(0.32812500, 0.65625000),
  100. real2(0.34375000, 0.40625000),
  101. real2(0.35937500, 0.90625000),
  102. real2(0.37500000, 0.09375000),
  103. real2(0.39062500, 0.59375000),
  104. real2(0.40625000, 0.34375000),
  105. real2(0.42187500, 0.84375000),
  106. real2(0.43750000, 0.21875000),
  107. real2(0.45312500, 0.71875000),
  108. real2(0.46875000, 0.46875000),
  109. real2(0.48437500, 0.96875000),
  110. real2(0.50000000, 0.01562500),
  111. real2(0.51562500, 0.51562500),
  112. real2(0.53125000, 0.26562500),
  113. real2(0.54687500, 0.76562500),
  114. real2(0.56250000, 0.14062500),
  115. real2(0.57812500, 0.64062500),
  116. real2(0.59375000, 0.39062500),
  117. real2(0.60937500, 0.89062500),
  118. real2(0.62500000, 0.07812500),
  119. real2(0.64062500, 0.57812500),
  120. real2(0.65625000, 0.32812500),
  121. real2(0.67187500, 0.82812500),
  122. real2(0.68750000, 0.20312500),
  123. real2(0.70312500, 0.70312500),
  124. real2(0.71875000, 0.45312500),
  125. real2(0.73437500, 0.95312500),
  126. real2(0.75000000, 0.04687500),
  127. real2(0.76562500, 0.54687500),
  128. real2(0.78125000, 0.29687500),
  129. real2(0.79687500, 0.79687500),
  130. real2(0.81250000, 0.17187500),
  131. real2(0.82812500, 0.67187500),
  132. real2(0.84375000, 0.42187500),
  133. real2(0.85937500, 0.92187500),
  134. real2(0.87500000, 0.10937500),
  135. real2(0.89062500, 0.60937500),
  136. real2(0.90625000, 0.35937500),
  137. real2(0.92187500, 0.85937500),
  138. real2(0.93750000, 0.23437500),
  139. real2(0.95312500, 0.73437500),
  140. real2(0.96875000, 0.48437500),
  141. real2(0.98437500, 0.98437500)
  142. };
  143. static const real2 k_Hammersley2dSeq256[] = {
  144. real2(0.00000000, 0.00000000),
  145. real2(0.00390625, 0.50000000),
  146. real2(0.00781250, 0.25000000),
  147. real2(0.01171875, 0.75000000),
  148. real2(0.01562500, 0.12500000),
  149. real2(0.01953125, 0.62500000),
  150. real2(0.02343750, 0.37500000),
  151. real2(0.02734375, 0.87500000),
  152. real2(0.03125000, 0.06250000),
  153. real2(0.03515625, 0.56250000),
  154. real2(0.03906250, 0.31250000),
  155. real2(0.04296875, 0.81250000),
  156. real2(0.04687500, 0.18750000),
  157. real2(0.05078125, 0.68750000),
  158. real2(0.05468750, 0.43750000),
  159. real2(0.05859375, 0.93750000),
  160. real2(0.06250000, 0.03125000),
  161. real2(0.06640625, 0.53125000),
  162. real2(0.07031250, 0.28125000),
  163. real2(0.07421875, 0.78125000),
  164. real2(0.07812500, 0.15625000),
  165. real2(0.08203125, 0.65625000),
  166. real2(0.08593750, 0.40625000),
  167. real2(0.08984375, 0.90625000),
  168. real2(0.09375000, 0.09375000),
  169. real2(0.09765625, 0.59375000),
  170. real2(0.10156250, 0.34375000),
  171. real2(0.10546875, 0.84375000),
  172. real2(0.10937500, 0.21875000),
  173. real2(0.11328125, 0.71875000),
  174. real2(0.11718750, 0.46875000),
  175. real2(0.12109375, 0.96875000),
  176. real2(0.12500000, 0.01562500),
  177. real2(0.12890625, 0.51562500),
  178. real2(0.13281250, 0.26562500),
  179. real2(0.13671875, 0.76562500),
  180. real2(0.14062500, 0.14062500),
  181. real2(0.14453125, 0.64062500),
  182. real2(0.14843750, 0.39062500),
  183. real2(0.15234375, 0.89062500),
  184. real2(0.15625000, 0.07812500),
  185. real2(0.16015625, 0.57812500),
  186. real2(0.16406250, 0.32812500),
  187. real2(0.16796875, 0.82812500),
  188. real2(0.17187500, 0.20312500),
  189. real2(0.17578125, 0.70312500),
  190. real2(0.17968750, 0.45312500),
  191. real2(0.18359375, 0.95312500),
  192. real2(0.18750000, 0.04687500),
  193. real2(0.19140625, 0.54687500),
  194. real2(0.19531250, 0.29687500),
  195. real2(0.19921875, 0.79687500),
  196. real2(0.20312500, 0.17187500),
  197. real2(0.20703125, 0.67187500),
  198. real2(0.21093750, 0.42187500),
  199. real2(0.21484375, 0.92187500),
  200. real2(0.21875000, 0.10937500),
  201. real2(0.22265625, 0.60937500),
  202. real2(0.22656250, 0.35937500),
  203. real2(0.23046875, 0.85937500),
  204. real2(0.23437500, 0.23437500),
  205. real2(0.23828125, 0.73437500),
  206. real2(0.24218750, 0.48437500),
  207. real2(0.24609375, 0.98437500),
  208. real2(0.25000000, 0.00781250),
  209. real2(0.25390625, 0.50781250),
  210. real2(0.25781250, 0.25781250),
  211. real2(0.26171875, 0.75781250),
  212. real2(0.26562500, 0.13281250),
  213. real2(0.26953125, 0.63281250),
  214. real2(0.27343750, 0.38281250),
  215. real2(0.27734375, 0.88281250),
  216. real2(0.28125000, 0.07031250),
  217. real2(0.28515625, 0.57031250),
  218. real2(0.28906250, 0.32031250),
  219. real2(0.29296875, 0.82031250),
  220. real2(0.29687500, 0.19531250),
  221. real2(0.30078125, 0.69531250),
  222. real2(0.30468750, 0.44531250),
  223. real2(0.30859375, 0.94531250),
  224. real2(0.31250000, 0.03906250),
  225. real2(0.31640625, 0.53906250),
  226. real2(0.32031250, 0.28906250),
  227. real2(0.32421875, 0.78906250),
  228. real2(0.32812500, 0.16406250),
  229. real2(0.33203125, 0.66406250),
  230. real2(0.33593750, 0.41406250),
  231. real2(0.33984375, 0.91406250),
  232. real2(0.34375000, 0.10156250),
  233. real2(0.34765625, 0.60156250),
  234. real2(0.35156250, 0.35156250),
  235. real2(0.35546875, 0.85156250),
  236. real2(0.35937500, 0.22656250),
  237. real2(0.36328125, 0.72656250),
  238. real2(0.36718750, 0.47656250),
  239. real2(0.37109375, 0.97656250),
  240. real2(0.37500000, 0.02343750),
  241. real2(0.37890625, 0.52343750),
  242. real2(0.38281250, 0.27343750),
  243. real2(0.38671875, 0.77343750),
  244. real2(0.39062500, 0.14843750),
  245. real2(0.39453125, 0.64843750),
  246. real2(0.39843750, 0.39843750),
  247. real2(0.40234375, 0.89843750),
  248. real2(0.40625000, 0.08593750),
  249. real2(0.41015625, 0.58593750),
  250. real2(0.41406250, 0.33593750),
  251. real2(0.41796875, 0.83593750),
  252. real2(0.42187500, 0.21093750),
  253. real2(0.42578125, 0.71093750),
  254. real2(0.42968750, 0.46093750),
  255. real2(0.43359375, 0.96093750),
  256. real2(0.43750000, 0.05468750),
  257. real2(0.44140625, 0.55468750),
  258. real2(0.44531250, 0.30468750),
  259. real2(0.44921875, 0.80468750),
  260. real2(0.45312500, 0.17968750),
  261. real2(0.45703125, 0.67968750),
  262. real2(0.46093750, 0.42968750),
  263. real2(0.46484375, 0.92968750),
  264. real2(0.46875000, 0.11718750),
  265. real2(0.47265625, 0.61718750),
  266. real2(0.47656250, 0.36718750),
  267. real2(0.48046875, 0.86718750),
  268. real2(0.48437500, 0.24218750),
  269. real2(0.48828125, 0.74218750),
  270. real2(0.49218750, 0.49218750),
  271. real2(0.49609375, 0.99218750),
  272. real2(0.50000000, 0.00390625),
  273. real2(0.50390625, 0.50390625),
  274. real2(0.50781250, 0.25390625),
  275. real2(0.51171875, 0.75390625),
  276. real2(0.51562500, 0.12890625),
  277. real2(0.51953125, 0.62890625),
  278. real2(0.52343750, 0.37890625),
  279. real2(0.52734375, 0.87890625),
  280. real2(0.53125000, 0.06640625),
  281. real2(0.53515625, 0.56640625),
  282. real2(0.53906250, 0.31640625),
  283. real2(0.54296875, 0.81640625),
  284. real2(0.54687500, 0.19140625),
  285. real2(0.55078125, 0.69140625),
  286. real2(0.55468750, 0.44140625),
  287. real2(0.55859375, 0.94140625),
  288. real2(0.56250000, 0.03515625),
  289. real2(0.56640625, 0.53515625),
  290. real2(0.57031250, 0.28515625),
  291. real2(0.57421875, 0.78515625),
  292. real2(0.57812500, 0.16015625),
  293. real2(0.58203125, 0.66015625),
  294. real2(0.58593750, 0.41015625),
  295. real2(0.58984375, 0.91015625),
  296. real2(0.59375000, 0.09765625),
  297. real2(0.59765625, 0.59765625),
  298. real2(0.60156250, 0.34765625),
  299. real2(0.60546875, 0.84765625),
  300. real2(0.60937500, 0.22265625),
  301. real2(0.61328125, 0.72265625),
  302. real2(0.61718750, 0.47265625),
  303. real2(0.62109375, 0.97265625),
  304. real2(0.62500000, 0.01953125),
  305. real2(0.62890625, 0.51953125),
  306. real2(0.63281250, 0.26953125),
  307. real2(0.63671875, 0.76953125),
  308. real2(0.64062500, 0.14453125),
  309. real2(0.64453125, 0.64453125),
  310. real2(0.64843750, 0.39453125),
  311. real2(0.65234375, 0.89453125),
  312. real2(0.65625000, 0.08203125),
  313. real2(0.66015625, 0.58203125),
  314. real2(0.66406250, 0.33203125),
  315. real2(0.66796875, 0.83203125),
  316. real2(0.67187500, 0.20703125),
  317. real2(0.67578125, 0.70703125),
  318. real2(0.67968750, 0.45703125),
  319. real2(0.68359375, 0.95703125),
  320. real2(0.68750000, 0.05078125),
  321. real2(0.69140625, 0.55078125),
  322. real2(0.69531250, 0.30078125),
  323. real2(0.69921875, 0.80078125),
  324. real2(0.70312500, 0.17578125),
  325. real2(0.70703125, 0.67578125),
  326. real2(0.71093750, 0.42578125),
  327. real2(0.71484375, 0.92578125),
  328. real2(0.71875000, 0.11328125),
  329. real2(0.72265625, 0.61328125),
  330. real2(0.72656250, 0.36328125),
  331. real2(0.73046875, 0.86328125),
  332. real2(0.73437500, 0.23828125),
  333. real2(0.73828125, 0.73828125),
  334. real2(0.74218750, 0.48828125),
  335. real2(0.74609375, 0.98828125),
  336. real2(0.75000000, 0.01171875),
  337. real2(0.75390625, 0.51171875),
  338. real2(0.75781250, 0.26171875),
  339. real2(0.76171875, 0.76171875),
  340. real2(0.76562500, 0.13671875),
  341. real2(0.76953125, 0.63671875),
  342. real2(0.77343750, 0.38671875),
  343. real2(0.77734375, 0.88671875),
  344. real2(0.78125000, 0.07421875),
  345. real2(0.78515625, 0.57421875),
  346. real2(0.78906250, 0.32421875),
  347. real2(0.79296875, 0.82421875),
  348. real2(0.79687500, 0.19921875),
  349. real2(0.80078125, 0.69921875),
  350. real2(0.80468750, 0.44921875),
  351. real2(0.80859375, 0.94921875),
  352. real2(0.81250000, 0.04296875),
  353. real2(0.81640625, 0.54296875),
  354. real2(0.82031250, 0.29296875),
  355. real2(0.82421875, 0.79296875),
  356. real2(0.82812500, 0.16796875),
  357. real2(0.83203125, 0.66796875),
  358. real2(0.83593750, 0.41796875),
  359. real2(0.83984375, 0.91796875),
  360. real2(0.84375000, 0.10546875),
  361. real2(0.84765625, 0.60546875),
  362. real2(0.85156250, 0.35546875),
  363. real2(0.85546875, 0.85546875),
  364. real2(0.85937500, 0.23046875),
  365. real2(0.86328125, 0.73046875),
  366. real2(0.86718750, 0.48046875),
  367. real2(0.87109375, 0.98046875),
  368. real2(0.87500000, 0.02734375),
  369. real2(0.87890625, 0.52734375),
  370. real2(0.88281250, 0.27734375),
  371. real2(0.88671875, 0.77734375),
  372. real2(0.89062500, 0.15234375),
  373. real2(0.89453125, 0.65234375),
  374. real2(0.89843750, 0.40234375),
  375. real2(0.90234375, 0.90234375),
  376. real2(0.90625000, 0.08984375),
  377. real2(0.91015625, 0.58984375),
  378. real2(0.91406250, 0.33984375),
  379. real2(0.91796875, 0.83984375),
  380. real2(0.92187500, 0.21484375),
  381. real2(0.92578125, 0.71484375),
  382. real2(0.92968750, 0.46484375),
  383. real2(0.93359375, 0.96484375),
  384. real2(0.93750000, 0.05859375),
  385. real2(0.94140625, 0.55859375),
  386. real2(0.94531250, 0.30859375),
  387. real2(0.94921875, 0.80859375),
  388. real2(0.95312500, 0.18359375),
  389. real2(0.95703125, 0.68359375),
  390. real2(0.96093750, 0.43359375),
  391. real2(0.96484375, 0.93359375),
  392. real2(0.96875000, 0.12109375),
  393. real2(0.97265625, 0.62109375),
  394. real2(0.97656250, 0.37109375),
  395. real2(0.98046875, 0.87109375),
  396. real2(0.98437500, 0.24609375),
  397. real2(0.98828125, 0.74609375),
  398. real2(0.99218750, 0.49609375),
  399. real2(0.99609375, 0.99609375)
  400. };
  401. // Loads elements from one of the precomputed tables for sample counts of 16, 32, 64, 256.
  402. // Computes sample positions at runtime otherwise.
  403. real2 Hammersley2d(uint i, uint sampleCount)
  404. {
  405. switch (sampleCount)
  406. {
  407. case 16: return k_Hammersley2dSeq16[i];
  408. case 32: return k_Hammersley2dSeq32[i];
  409. case 64: return k_Hammersley2dSeq64[i];
  410. case 256: return k_Hammersley2dSeq256[i];
  411. default: return Hammersley2dSeq(i, sampleCount);
  412. }
  413. }
  414. #endif // UNITY_HAMMERSLEY_INCLUDED