2
0

common.shader 39 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235
  1. render_states = {
  2. default = {
  3. states = {
  4. rgb_write_enable = true
  5. alpha_write_enable = true
  6. depth_write_enable = true
  7. depth_enable = true
  8. blend_enable = false
  9. depth_func = "lequal"
  10. blend_src = "src_alpha"
  11. blend_dst = "inv_src_alpha"
  12. blend_equation = "add"
  13. cull_mode = "cw"
  14. primitive_type = "pt_triangles"
  15. }
  16. }
  17. opacity = {
  18. inherit = "default"
  19. states = {
  20. cull_mode = "none"
  21. depth_write_enable = false
  22. depth_enable = false
  23. blend_enable = true
  24. blend_src = "src_alpha"
  25. blend_dst = "inv_src_alpha"
  26. "defined(DEPTH_ENABLED)" = {
  27. depth_enable = true
  28. }
  29. }
  30. }
  31. }
  32. sampler_states = {
  33. clamp_point = {
  34. wrap_u = "clamp"
  35. wrap_v = "clamp"
  36. wrap_w = "clamp"
  37. filter_min = "point"
  38. filter_mag = "point"
  39. }
  40. clamp_anisotropic = {
  41. wrap_u = "clamp"
  42. wrap_v = "clamp"
  43. wrap_w = "clamp"
  44. filter_min = "anisotropic"
  45. filter_mag = "anisotropic"
  46. }
  47. mirror_point = {
  48. wrap_u = "mirror"
  49. wrap_v = "mirror"
  50. wrap_w = "mirror"
  51. filter_min = "point"
  52. filter_mag = "point"
  53. }
  54. mirror_anisotropic = {
  55. wrap_u = "mirror"
  56. wrap_v = "mirror"
  57. wrap_w = "mirror"
  58. filter_min = "anisotropic"
  59. filter_mag = "anisotropic"
  60. }
  61. }
  62. bgfx_shaders = {
  63. common = {
  64. code = """
  65. /*
  66. * Copyright 2011-2023 Branimir Karadzic. All rights reserved.
  67. * License: https://github.com/bkaradzic/bgfx/blob/master/LICENSE
  68. */
  69. #ifndef BGFX_SHADER_H_HEADER_GUARD
  70. #define BGFX_SHADER_H_HEADER_GUARD
  71. #if !defined(BGFX_CONFIG_MAX_BONES)
  72. # define BGFX_CONFIG_MAX_BONES 192
  73. #endif // !defined(BGFX_CONFIG_MAX_BONES)
  74. #ifndef __cplusplus
  75. #if BGFX_SHADER_LANGUAGE_HLSL > 300
  76. # define BRANCH [branch]
  77. # define LOOP [loop]
  78. # define UNROLL [unroll]
  79. #else
  80. # define BRANCH
  81. # define LOOP
  82. # define UNROLL
  83. #endif // BGFX_SHADER_LANGUAGE_HLSL > 300
  84. #if (BGFX_SHADER_LANGUAGE_HLSL > 300 || BGFX_SHADER_LANGUAGE_METAL || BGFX_SHADER_LANGUAGE_SPIRV) && BGFX_SHADER_TYPE_FRAGMENT
  85. # define EARLY_DEPTH_STENCIL [earlydepthstencil]
  86. #else
  87. # define EARLY_DEPTH_STENCIL
  88. #endif // BGFX_SHADER_LANGUAGE_HLSL > 300 && BGFX_SHADER_TYPE_FRAGMENT
  89. #if BGFX_SHADER_LANGUAGE_GLSL
  90. # define ARRAY_BEGIN(_type, _name, _count) _type _name[_count] = _type[](
  91. # define ARRAY_END() )
  92. #else
  93. # define ARRAY_BEGIN(_type, _name, _count) _type _name[_count] = {
  94. # define ARRAY_END() }
  95. #endif // BGFX_SHADER_LANGUAGE_GLSL
  96. #if BGFX_SHADER_LANGUAGE_HLSL \
  97. || BGFX_SHADER_LANGUAGE_PSSL \
  98. || BGFX_SHADER_LANGUAGE_SPIRV \
  99. || BGFX_SHADER_LANGUAGE_METAL
  100. # define CONST(_x) static const _x
  101. # define dFdx(_x) ddx(_x)
  102. # define dFdy(_y) ddy(-(_y))
  103. # define inversesqrt(_x) rsqrt(_x)
  104. # define fract(_x) frac(_x)
  105. # define bvec2 bool2
  106. # define bvec3 bool3
  107. # define bvec4 bool4
  108. // To be able to patch the uav registers on the DXBC SPDB Chunk (D3D11 renderer) the whitespaces around
  109. // '_type[_reg]' are necessary. This only affects shaders with debug info (i.e., those that have the SPDB Chunk).
  110. # if BGFX_SHADER_LANGUAGE_HLSL > 400 || BGFX_SHADER_LANGUAGE_PSSL || BGFX_SHADER_LANGUAGE_SPIRV || BGFX_SHADER_LANGUAGE_METAL
  111. # define REGISTER(_type, _reg) register( _type[_reg] )
  112. # else
  113. # define REGISTER(_type, _reg) register(_type ## _reg)
  114. # endif // BGFX_SHADER_LANGUAGE_HLSL
  115. # if BGFX_SHADER_LANGUAGE_HLSL > 300 || BGFX_SHADER_LANGUAGE_PSSL || BGFX_SHADER_LANGUAGE_SPIRV || BGFX_SHADER_LANGUAGE_METAL
  116. # if BGFX_SHADER_LANGUAGE_HLSL > 400 || BGFX_SHADER_LANGUAGE_PSSL || BGFX_SHADER_LANGUAGE_SPIRV || BGFX_SHADER_LANGUAGE_METAL
  117. # define dFdxCoarse(_x) ddx_coarse(_x)
  118. # define dFdxFine(_x) ddx_fine(_x)
  119. # define dFdyCoarse(_y) ddy_coarse(-(_y))
  120. # define dFdyFine(_y) ddy_fine(-(_y))
  121. # endif // BGFX_SHADER_LANGUAGE_HLSL > 400
  122. # if BGFX_SHADER_LANGUAGE_HLSL || BGFX_SHADER_LANGUAGE_SPIRV || BGFX_SHADER_LANGUAGE_METAL
  123. float intBitsToFloat(int _x) { return asfloat(_x); }
  124. vec2 intBitsToFloat(uint2 _x) { return asfloat(_x); }
  125. vec3 intBitsToFloat(uint3 _x) { return asfloat(_x); }
  126. vec4 intBitsToFloat(uint4 _x) { return asfloat(_x); }
  127. # endif // BGFX_SHADER_LANGUAGE_HLSL || BGFX_SHADER_LANGUAGE_SPIRV || BGFX_SHADER_LANGUAGE_METAL
  128. float uintBitsToFloat(uint _x) { return asfloat(_x); }
  129. vec2 uintBitsToFloat(uint2 _x) { return asfloat(_x); }
  130. vec3 uintBitsToFloat(uint3 _x) { return asfloat(_x); }
  131. vec4 uintBitsToFloat(uint4 _x) { return asfloat(_x); }
  132. uint floatBitsToUint(float _x) { return asuint(_x); }
  133. uvec2 floatBitsToUint(vec2 _x) { return asuint(_x); }
  134. uvec3 floatBitsToUint(vec3 _x) { return asuint(_x); }
  135. uvec4 floatBitsToUint(vec4 _x) { return asuint(_x); }
  136. int floatBitsToInt(float _x) { return asint(_x); }
  137. ivec2 floatBitsToInt(vec2 _x) { return asint(_x); }
  138. ivec3 floatBitsToInt(vec3 _x) { return asint(_x); }
  139. ivec4 floatBitsToInt(vec4 _x) { return asint(_x); }
  140. uint bitfieldReverse(uint _x) { return reversebits(_x); }
  141. uint2 bitfieldReverse(uint2 _x) { return reversebits(_x); }
  142. uint3 bitfieldReverse(uint3 _x) { return reversebits(_x); }
  143. uint4 bitfieldReverse(uint4 _x) { return reversebits(_x); }
  144. # if !BGFX_SHADER_LANGUAGE_SPIRV
  145. uint packHalf2x16(vec2 _x)
  146. {
  147. return (f32tof16(_x.y)<<16) | f32tof16(_x.x);
  148. }
  149. vec2 unpackHalf2x16(uint _x)
  150. {
  151. return vec2(f16tof32(_x & 0xffff), f16tof32(_x >> 16) );
  152. }
  153. # endif // !BGFX_SHADER_LANGUAGE_SPIRV
  154. struct BgfxSampler2D
  155. {
  156. SamplerState m_sampler;
  157. Texture2D m_texture;
  158. };
  159. struct BgfxISampler2D
  160. {
  161. Texture2D<ivec4> m_texture;
  162. };
  163. struct BgfxUSampler2D
  164. {
  165. Texture2D<uvec4> m_texture;
  166. };
  167. struct BgfxSampler2DArray
  168. {
  169. SamplerState m_sampler;
  170. Texture2DArray m_texture;
  171. };
  172. struct BgfxSampler2DShadow
  173. {
  174. SamplerComparisonState m_sampler;
  175. Texture2D m_texture;
  176. };
  177. struct BgfxSampler2DArrayShadow
  178. {
  179. SamplerComparisonState m_sampler;
  180. Texture2DArray m_texture;
  181. };
  182. struct BgfxSampler3D
  183. {
  184. SamplerState m_sampler;
  185. Texture3D m_texture;
  186. };
  187. struct BgfxISampler3D
  188. {
  189. Texture3D<ivec4> m_texture;
  190. };
  191. struct BgfxUSampler3D
  192. {
  193. Texture3D<uvec4> m_texture;
  194. };
  195. struct BgfxSamplerCube
  196. {
  197. SamplerState m_sampler;
  198. TextureCube m_texture;
  199. };
  200. struct BgfxSamplerCubeShadow
  201. {
  202. SamplerComparisonState m_sampler;
  203. TextureCube m_texture;
  204. };
  205. struct BgfxSampler2DMS
  206. {
  207. Texture2DMS<vec4> m_texture;
  208. };
  209. vec4 bgfxTexture2D(BgfxSampler2D _sampler, vec2 _coord)
  210. {
  211. return _sampler.m_texture.Sample(_sampler.m_sampler, _coord);
  212. }
  213. vec4 bgfxTexture2DBias(BgfxSampler2D _sampler, vec2 _coord, float _bias)
  214. {
  215. return _sampler.m_texture.SampleBias(_sampler.m_sampler, _coord, _bias);
  216. }
  217. vec4 bgfxTexture2DLod(BgfxSampler2D _sampler, vec2 _coord, float _level)
  218. {
  219. return _sampler.m_texture.SampleLevel(_sampler.m_sampler, _coord, _level);
  220. }
  221. vec4 bgfxTexture2DLodOffset(BgfxSampler2D _sampler, vec2 _coord, float _level, ivec2 _offset)
  222. {
  223. return _sampler.m_texture.SampleLevel(_sampler.m_sampler, _coord, _level, _offset);
  224. }
  225. vec4 bgfxTexture2DProj(BgfxSampler2D _sampler, vec3 _coord)
  226. {
  227. vec2 coord = _coord.xy * rcp(_coord.z);
  228. return _sampler.m_texture.Sample(_sampler.m_sampler, coord);
  229. }
  230. vec4 bgfxTexture2DProj(BgfxSampler2D _sampler, vec4 _coord)
  231. {
  232. vec2 coord = _coord.xy * rcp(_coord.w);
  233. return _sampler.m_texture.Sample(_sampler.m_sampler, coord);
  234. }
  235. vec4 bgfxTexture2DGrad(BgfxSampler2D _sampler, vec2 _coord, vec2 _dPdx, vec2 _dPdy)
  236. {
  237. return _sampler.m_texture.SampleGrad(_sampler.m_sampler, _coord, _dPdx, _dPdy);
  238. }
  239. vec4 bgfxTexture2DArray(BgfxSampler2DArray _sampler, vec3 _coord)
  240. {
  241. return _sampler.m_texture.Sample(_sampler.m_sampler, _coord);
  242. }
  243. vec4 bgfxTexture2DArrayLod(BgfxSampler2DArray _sampler, vec3 _coord, float _lod)
  244. {
  245. return _sampler.m_texture.SampleLevel(_sampler.m_sampler, _coord, _lod);
  246. }
  247. vec4 bgfxTexture2DArrayLodOffset(BgfxSampler2DArray _sampler, vec3 _coord, float _level, ivec2 _offset)
  248. {
  249. return _sampler.m_texture.SampleLevel(_sampler.m_sampler, _coord, _level, _offset);
  250. }
  251. float bgfxShadow2D(BgfxSampler2DShadow _sampler, vec3 _coord)
  252. {
  253. return _sampler.m_texture.SampleCmpLevelZero(_sampler.m_sampler, _coord.xy, _coord.z);
  254. }
  255. float bgfxShadow2DProj(BgfxSampler2DShadow _sampler, vec4 _coord)
  256. {
  257. vec3 coord = _coord.xyz * rcp(_coord.w);
  258. return _sampler.m_texture.SampleCmpLevelZero(_sampler.m_sampler, coord.xy, coord.z);
  259. }
  260. vec2 bgfxTextureSize(BgfxSampler2DShadow _sampler, int _lod)
  261. {
  262. vec2 result;
  263. float numberOfMipMapLevels;
  264. _sampler.m_texture.GetDimensions(_lod, result.x, result.y, numberOfMipMapLevels);
  265. return result;
  266. }
  267. vec4 bgfxShadow2DArray(BgfxSampler2DArrayShadow _sampler, vec4 _coord)
  268. {
  269. return _sampler.m_texture.SampleCmpLevelZero(_sampler.m_sampler, _coord.xyz, _coord.w);
  270. }
  271. vec2 bgfxTextureSize(BgfxSampler2DArrayShadow _sampler, int _lod)
  272. {
  273. vec2 result;
  274. float numberOfMipMapLevels;
  275. float numberOfElements;
  276. _sampler.m_texture.GetDimensions(_lod, result.x, result.y, numberOfElements, numberOfMipMapLevels);
  277. return result;
  278. }
  279. vec4 bgfxTexture3D(BgfxSampler3D _sampler, vec3 _coord)
  280. {
  281. return _sampler.m_texture.Sample(_sampler.m_sampler, _coord);
  282. }
  283. vec4 bgfxTexture3DLod(BgfxSampler3D _sampler, vec3 _coord, float _level)
  284. {
  285. return _sampler.m_texture.SampleLevel(_sampler.m_sampler, _coord, _level);
  286. }
  287. ivec4 bgfxTexture3D(BgfxISampler3D _sampler, vec3 _coord)
  288. {
  289. uvec3 size;
  290. _sampler.m_texture.GetDimensions(size.x, size.y, size.z);
  291. return _sampler.m_texture.Load(ivec4(_coord * size, 0) );
  292. }
  293. uvec4 bgfxTexture3D(BgfxUSampler3D _sampler, vec3 _coord)
  294. {
  295. uvec3 size;
  296. _sampler.m_texture.GetDimensions(size.x, size.y, size.z);
  297. return _sampler.m_texture.Load(ivec4(_coord * size, 0) );
  298. }
  299. vec4 bgfxTextureCube(BgfxSamplerCube _sampler, vec3 _coord)
  300. {
  301. return _sampler.m_texture.Sample(_sampler.m_sampler, _coord);
  302. }
  303. vec4 bgfxTextureCubeBias(BgfxSamplerCube _sampler, vec3 _coord, float _bias)
  304. {
  305. return _sampler.m_texture.SampleBias(_sampler.m_sampler, _coord, _bias);
  306. }
  307. vec4 bgfxTextureCubeLod(BgfxSamplerCube _sampler, vec3 _coord, float _level)
  308. {
  309. return _sampler.m_texture.SampleLevel(_sampler.m_sampler, _coord, _level);
  310. }
  311. float bgfxShadowCube(BgfxSamplerCubeShadow _sampler, vec4 _coord)
  312. {
  313. return _sampler.m_texture.SampleCmpLevelZero(_sampler.m_sampler, _coord.xyz, _coord.w);
  314. }
  315. vec4 bgfxTexelFetch(BgfxSampler2D _sampler, ivec2 _coord, int _lod)
  316. {
  317. return _sampler.m_texture.Load(ivec3(_coord, _lod) );
  318. }
  319. vec4 bgfxTexelFetchOffset(BgfxSampler2D _sampler, ivec2 _coord, int _lod, ivec2 _offset)
  320. {
  321. return _sampler.m_texture.Load(ivec3(_coord, _lod), _offset );
  322. }
  323. vec2 bgfxTextureSize(BgfxSampler2D _sampler, int _lod)
  324. {
  325. vec2 result;
  326. float numberOfMipMapLevels;
  327. _sampler.m_texture.GetDimensions(_lod, result.x, result.y, numberOfMipMapLevels);
  328. return result;
  329. }
  330. vec2 bgfxTextureSize(BgfxISampler2D _sampler, int _lod)
  331. {
  332. vec2 result;
  333. float numberOfMipMapLevels;
  334. _sampler.m_texture.GetDimensions(_lod, result.x, result.y, numberOfMipMapLevels);
  335. return result;
  336. }
  337. vec2 bgfxTextureSize(BgfxUSampler2D _sampler, int _lod)
  338. {
  339. vec2 result;
  340. float numberOfMipMapLevels;
  341. _sampler.m_texture.GetDimensions(_lod, result.x, result.y, numberOfMipMapLevels);
  342. return result;
  343. }
  344. vec4 bgfxTextureGather0(BgfxSampler2D _sampler, vec2 _coord)
  345. {
  346. return _sampler.m_texture.GatherRed(_sampler.m_sampler, _coord);
  347. }
  348. vec4 bgfxTextureGather1(BgfxSampler2D _sampler, vec2 _coord)
  349. {
  350. return _sampler.m_texture.GatherGreen(_sampler.m_sampler, _coord);
  351. }
  352. vec4 bgfxTextureGather2(BgfxSampler2D _sampler, vec2 _coord)
  353. {
  354. return _sampler.m_texture.GatherBlue(_sampler.m_sampler, _coord);
  355. }
  356. vec4 bgfxTextureGather3(BgfxSampler2D _sampler, vec2 _coord)
  357. {
  358. return _sampler.m_texture.GatherAlpha(_sampler.m_sampler, _coord);
  359. }
  360. vec4 bgfxTextureGatherOffset0(BgfxSampler2D _sampler, vec2 _coord, ivec2 _offset)
  361. {
  362. return _sampler.m_texture.GatherRed(_sampler.m_sampler, _coord, _offset);
  363. }
  364. vec4 bgfxTextureGatherOffset1(BgfxSampler2D _sampler, vec2 _coord, ivec2 _offset)
  365. {
  366. return _sampler.m_texture.GatherGreen(_sampler.m_sampler, _coord, _offset);
  367. }
  368. vec4 bgfxTextureGatherOffset2(BgfxSampler2D _sampler, vec2 _coord, ivec2 _offset)
  369. {
  370. return _sampler.m_texture.GatherBlue(_sampler.m_sampler, _coord, _offset);
  371. }
  372. vec4 bgfxTextureGatherOffset3(BgfxSampler2D _sampler, vec2 _coord, ivec2 _offset)
  373. {
  374. return _sampler.m_texture.GatherAlpha(_sampler.m_sampler, _coord, _offset);
  375. }
  376. vec4 bgfxTextureGather0(BgfxSampler2DArray _sampler, vec3 _coord)
  377. {
  378. return _sampler.m_texture.GatherRed(_sampler.m_sampler, _coord);
  379. }
  380. vec4 bgfxTextureGather1(BgfxSampler2DArray _sampler, vec3 _coord)
  381. {
  382. return _sampler.m_texture.GatherGreen(_sampler.m_sampler, _coord);
  383. }
  384. vec4 bgfxTextureGather2(BgfxSampler2DArray _sampler, vec3 _coord)
  385. {
  386. return _sampler.m_texture.GatherBlue(_sampler.m_sampler, _coord);
  387. }
  388. vec4 bgfxTextureGather3(BgfxSampler2DArray _sampler, vec3 _coord)
  389. {
  390. return _sampler.m_texture.GatherAlpha(_sampler.m_sampler, _coord);
  391. }
  392. ivec4 bgfxTexelFetch(BgfxISampler2D _sampler, ivec2 _coord, int _lod)
  393. {
  394. return _sampler.m_texture.Load(ivec3(_coord, _lod) );
  395. }
  396. uvec4 bgfxTexelFetch(BgfxUSampler2D _sampler, ivec2 _coord, int _lod)
  397. {
  398. return _sampler.m_texture.Load(ivec3(_coord, _lod) );
  399. }
  400. vec4 bgfxTexelFetch(BgfxSampler2DMS _sampler, ivec2 _coord, int _sampleIdx)
  401. {
  402. return _sampler.m_texture.Load(_coord, _sampleIdx);
  403. }
  404. vec4 bgfxTexelFetch(BgfxSampler2DArray _sampler, ivec3 _coord, int _lod)
  405. {
  406. return _sampler.m_texture.Load(ivec4(_coord, _lod) );
  407. }
  408. vec4 bgfxTexelFetch(BgfxSampler3D _sampler, ivec3 _coord, int _lod)
  409. {
  410. return _sampler.m_texture.Load(ivec4(_coord, _lod) );
  411. }
  412. vec3 bgfxTextureSize(BgfxSampler3D _sampler, int _lod)
  413. {
  414. vec3 result;
  415. float numberOfMipMapLevels;
  416. _sampler.m_texture.GetDimensions(_lod, result.x, result.y, result.z, numberOfMipMapLevels);
  417. return result;
  418. }
  419. # define SAMPLER2D(_name, _reg) \
  420. uniform SamplerState _name ## Sampler : REGISTER(s, _reg); \
  421. uniform Texture2D _name ## Texture : REGISTER(t, _reg); \
  422. static BgfxSampler2D _name = { _name ## Sampler, _name ## Texture }
  423. # define ISAMPLER2D(_name, _reg) \
  424. uniform Texture2D<ivec4> _name ## Texture : REGISTER(t, _reg); \
  425. static BgfxISampler2D _name = { _name ## Texture }
  426. # define USAMPLER2D(_name, _reg) \
  427. uniform Texture2D<uvec4> _name ## Texture : REGISTER(t, _reg); \
  428. static BgfxUSampler2D _name = { _name ## Texture }
  429. # define sampler2D BgfxSampler2D
  430. # define texture2D(_sampler, _coord) bgfxTexture2D(_sampler, _coord)
  431. # define texture2DBias(_sampler, _coord, _bias) bgfxTexture2DBias(_sampler, _coord, _bias)
  432. # define texture2DLod(_sampler, _coord, _level) bgfxTexture2DLod(_sampler, _coord, _level)
  433. # define texture2DLodOffset(_sampler, _coord, _level, _offset) bgfxTexture2DLodOffset(_sampler, _coord, _level, _offset)
  434. # define texture2DProj(_sampler, _coord) bgfxTexture2DProj(_sampler, _coord)
  435. # define texture2DGrad(_sampler, _coord, _dPdx, _dPdy) bgfxTexture2DGrad(_sampler, _coord, _dPdx, _dPdy)
  436. # define SAMPLER2DARRAY(_name, _reg) \
  437. uniform SamplerState _name ## Sampler : REGISTER(s, _reg); \
  438. uniform Texture2DArray _name ## Texture : REGISTER(t, _reg); \
  439. static BgfxSampler2DArray _name = { _name ## Sampler, _name ## Texture }
  440. # define sampler2DArray BgfxSampler2DArray
  441. # define texture2DArray(_sampler, _coord) bgfxTexture2DArray(_sampler, _coord)
  442. # define texture2DArrayLod(_sampler, _coord, _lod) bgfxTexture2DArrayLod(_sampler, _coord, _lod)
  443. # define texture2DArrayLodOffset(_sampler, _coord, _level, _offset) bgfxTexture2DArrayLodOffset(_sampler, _coord, _level, _offset)
  444. # define SAMPLER2DMS(_name, _reg) \
  445. uniform Texture2DMS<vec4> _name ## Texture : REGISTER(t, _reg); \
  446. static BgfxSampler2DMS _name = { _name ## Texture }
  447. # define sampler2DMS BgfxSampler2DMS
  448. # define SAMPLER2DSHADOW(_name, _reg) \
  449. uniform SamplerComparisonState _name ## SamplerComparison : REGISTER(s, _reg); \
  450. uniform Texture2D _name ## Texture : REGISTER(t, _reg); \
  451. static BgfxSampler2DShadow _name = { _name ## SamplerComparison, _name ## Texture }
  452. # define sampler2DShadow BgfxSampler2DShadow
  453. # define shadow2D(_sampler, _coord) bgfxShadow2D(_sampler, _coord)
  454. # define shadow2DProj(_sampler, _coord) bgfxShadow2DProj(_sampler, _coord)
  455. # define SAMPLER2DARRAYSHADOW(_name, _reg) \
  456. uniform SamplerComparisonState _name ## SamplerComparison : REGISTER(s, _reg); \
  457. uniform Texture2DArray _name ## Texture : REGISTER(t, _reg); \
  458. static BgfxSampler2DArrayShadow _name = { _name ## SamplerComparison, _name ## Texture }
  459. # define sampler2DArrayShadow BgfxSampler2DArrayShadow
  460. # define shadow2DArray(_sampler, _coord) bgfxShadow2DArray(_sampler, _coord)
  461. # define SAMPLER3D(_name, _reg) \
  462. uniform SamplerState _name ## Sampler : REGISTER(s, _reg); \
  463. uniform Texture3D _name ## Texture : REGISTER(t, _reg); \
  464. static BgfxSampler3D _name = { _name ## Sampler, _name ## Texture }
  465. # define ISAMPLER3D(_name, _reg) \
  466. uniform Texture3D<ivec4> _name ## Texture : REGISTER(t, _reg); \
  467. static BgfxISampler3D _name = { _name ## Texture }
  468. # define USAMPLER3D(_name, _reg) \
  469. uniform Texture3D<uvec4> _name ## Texture : REGISTER(t, _reg); \
  470. static BgfxUSampler3D _name = { _name ## Texture }
  471. # define sampler3D BgfxSampler3D
  472. # define texture3D(_sampler, _coord) bgfxTexture3D(_sampler, _coord)
  473. # define texture3DLod(_sampler, _coord, _level) bgfxTexture3DLod(_sampler, _coord, _level)
  474. # define SAMPLERCUBE(_name, _reg) \
  475. uniform SamplerState _name ## Sampler : REGISTER(s, _reg); \
  476. uniform TextureCube _name ## Texture : REGISTER(t, _reg); \
  477. static BgfxSamplerCube _name = { _name ## Sampler, _name ## Texture }
  478. # define samplerCube BgfxSamplerCube
  479. # define textureCube(_sampler, _coord) bgfxTextureCube(_sampler, _coord)
  480. # define textureCubeBias(_sampler, _coord, _bias) bgfxTextureCubeBias(_sampler, _coord, _bias)
  481. # define textureCubeLod(_sampler, _coord, _level) bgfxTextureCubeLod(_sampler, _coord, _level)
  482. # define SAMPLERCUBESHADOW(_name, _reg) \
  483. uniform SamplerComparisonState _name ## SamplerComparison : REGISTER(s, _reg); \
  484. uniform TextureCube _name ## Texture : REGISTER(t, _reg); \
  485. static BgfxSamplerCubeShadow _name = { _name ## SamplerComparison, _name ## Texture }
  486. # define samplerCubeShadow BgfxSamplerCubeShadow
  487. # define shadowCube(_sampler, _coord) bgfxShadowCube(_sampler, _coord)
  488. # define texelFetch(_sampler, _coord, _lod) bgfxTexelFetch(_sampler, _coord, _lod)
  489. # define texelFetchOffset(_sampler, _coord, _lod, _offset) bgfxTexelFetchOffset(_sampler, _coord, _lod, _offset)
  490. # define textureSize(_sampler, _lod) bgfxTextureSize(_sampler, _lod)
  491. # define textureGather(_sampler, _coord, _comp) bgfxTextureGather ## _comp(_sampler, _coord)
  492. # define textureGatherOffset(_sampler, _coord, _offset, _comp) bgfxTextureGatherOffset ## _comp(_sampler, _coord, _offset)
  493. # else
  494. # define sampler2DShadow sampler2D
  495. vec4 bgfxTexture2DProj(sampler2D _sampler, vec3 _coord)
  496. {
  497. return tex2Dproj(_sampler, vec4(_coord.xy, 0.0, _coord.z) );
  498. }
  499. vec4 bgfxTexture2DProj(sampler2D _sampler, vec4 _coord)
  500. {
  501. return tex2Dproj(_sampler, _coord);
  502. }
  503. float bgfxShadow2D(sampler2DShadow _sampler, vec3 _coord)
  504. {
  505. #if 0
  506. float occluder = tex2D(_sampler, _coord.xy).x;
  507. return step(_coord.z, occluder);
  508. #else
  509. return tex2Dproj(_sampler, vec4(_coord.xy, _coord.z, 1.0) ).x;
  510. #endif // 0
  511. }
  512. float bgfxShadow2DProj(sampler2DShadow _sampler, vec4 _coord)
  513. {
  514. #if 0
  515. vec3 coord = _coord.xyz * rcp(_coord.w);
  516. float occluder = tex2D(_sampler, coord.xy).x;
  517. return step(coord.z, occluder);
  518. #else
  519. return tex2Dproj(_sampler, _coord).x;
  520. #endif // 0
  521. }
  522. # define SAMPLER2D(_name, _reg) uniform sampler2D _name : REGISTER(s, _reg)
  523. # define SAMPLER2DMS(_name, _reg) uniform sampler2DMS _name : REGISTER(s, _reg)
  524. # define texture2D(_sampler, _coord) tex2D(_sampler, _coord)
  525. # define texture2DProj(_sampler, _coord) bgfxTexture2DProj(_sampler, _coord)
  526. # define SAMPLER2DARRAY(_name, _reg) SAMPLER2D(_name, _reg)
  527. # define texture2DArray(_sampler, _coord) texture2D(_sampler, (_coord).xy)
  528. # define texture2DArrayLod(_sampler, _coord, _lod) texture2DLod(_sampler, _coord, _lod)
  529. # define SAMPLER2DSHADOW(_name, _reg) uniform sampler2DShadow _name : REGISTER(s, _reg)
  530. # define shadow2D(_sampler, _coord) bgfxShadow2D(_sampler, _coord)
  531. # define shadow2DProj(_sampler, _coord) bgfxShadow2DProj(_sampler, _coord)
  532. # define SAMPLER3D(_name, _reg) uniform sampler3D _name : REGISTER(s, _reg)
  533. # define texture3D(_sampler, _coord) tex3D(_sampler, _coord)
  534. # define SAMPLERCUBE(_name, _reg) uniform samplerCUBE _name : REGISTER(s, _reg)
  535. # define textureCube(_sampler, _coord) texCUBE(_sampler, _coord)
  536. # define texture2DLod(_sampler, _coord, _level) tex2Dlod(_sampler, vec4( (_coord).xy, 0.0, _level) )
  537. # define texture2DGrad(_sampler, _coord, _dPdx, _dPdy) tex2Dgrad(_sampler, _coord, _dPdx, _dPdy)
  538. # define texture3DLod(_sampler, _coord, _level) tex3Dlod(_sampler, vec4( (_coord).xyz, _level) )
  539. # define textureCubeLod(_sampler, _coord, _level) texCUBElod(_sampler, vec4( (_coord).xyz, _level) )
  540. # endif // BGFX_SHADER_LANGUAGE_HLSL > 300
  541. vec3 instMul(vec3 _vec, mat3 _mtx) { return mul(_mtx, _vec); }
  542. vec3 instMul(mat3 _mtx, vec3 _vec) { return mul(_vec, _mtx); }
  543. vec4 instMul(vec4 _vec, mat4 _mtx) { return mul(_mtx, _vec); }
  544. vec4 instMul(mat4 _mtx, vec4 _vec) { return mul(_vec, _mtx); }
  545. bvec2 lessThan(vec2 _a, vec2 _b) { return _a < _b; }
  546. bvec3 lessThan(vec3 _a, vec3 _b) { return _a < _b; }
  547. bvec4 lessThan(vec4 _a, vec4 _b) { return _a < _b; }
  548. bvec2 lessThanEqual(vec2 _a, vec2 _b) { return _a <= _b; }
  549. bvec3 lessThanEqual(vec3 _a, vec3 _b) { return _a <= _b; }
  550. bvec4 lessThanEqual(vec4 _a, vec4 _b) { return _a <= _b; }
  551. bvec2 greaterThan(vec2 _a, vec2 _b) { return _a > _b; }
  552. bvec3 greaterThan(vec3 _a, vec3 _b) { return _a > _b; }
  553. bvec4 greaterThan(vec4 _a, vec4 _b) { return _a > _b; }
  554. bvec2 greaterThanEqual(vec2 _a, vec2 _b) { return _a >= _b; }
  555. bvec3 greaterThanEqual(vec3 _a, vec3 _b) { return _a >= _b; }
  556. bvec4 greaterThanEqual(vec4 _a, vec4 _b) { return _a >= _b; }
  557. bvec2 notEqual(vec2 _a, vec2 _b) { return _a != _b; }
  558. bvec3 notEqual(vec3 _a, vec3 _b) { return _a != _b; }
  559. bvec4 notEqual(vec4 _a, vec4 _b) { return _a != _b; }
  560. bvec2 equal(vec2 _a, vec2 _b) { return _a == _b; }
  561. bvec3 equal(vec3 _a, vec3 _b) { return _a == _b; }
  562. bvec4 equal(vec4 _a, vec4 _b) { return _a == _b; }
  563. float mix(float _a, float _b, float _t) { return lerp(_a, _b, _t); }
  564. vec2 mix(vec2 _a, vec2 _b, vec2 _t) { return lerp(_a, _b, _t); }
  565. vec3 mix(vec3 _a, vec3 _b, vec3 _t) { return lerp(_a, _b, _t); }
  566. vec4 mix(vec4 _a, vec4 _b, vec4 _t) { return lerp(_a, _b, _t); }
  567. float mod(float _a, float _b) { return _a - _b * floor(_a / _b); }
  568. vec2 mod(vec2 _a, vec2 _b) { return _a - _b * floor(_a / _b); }
  569. vec3 mod(vec3 _a, vec3 _b) { return _a - _b * floor(_a / _b); }
  570. vec4 mod(vec4 _a, vec4 _b) { return _a - _b * floor(_a / _b); }
  571. #else
  572. # define CONST(_x) const _x
  573. # define atan2(_x, _y) atan(_x, _y)
  574. # define mul(_a, _b) ( (_a) * (_b) )
  575. # define saturate(_x) clamp(_x, 0.0, 1.0)
  576. # define SAMPLER2D(_name, _reg) uniform sampler2D _name
  577. # define SAMPLER2DMS(_name, _reg) uniform sampler2DMS _name
  578. # define SAMPLER3D(_name, _reg) uniform sampler3D _name
  579. # define SAMPLERCUBE(_name, _reg) uniform samplerCube _name
  580. # define SAMPLER2DSHADOW(_name, _reg) uniform sampler2DShadow _name
  581. # define SAMPLER2DARRAY(_name, _reg) uniform sampler2DArray _name
  582. # define SAMPLER2DMSARRAY(_name, _reg) uniform sampler2DMSArray _name
  583. # define SAMPLERCUBEARRAY(_name, _reg) uniform samplerCubeArray _name
  584. # define SAMPLER2DARRAYSHADOW(_name, _reg) uniform sampler2DArrayShadow _name
  585. # define ISAMPLER2D(_name, _reg) uniform isampler2D _name
  586. # define USAMPLER2D(_name, _reg) uniform usampler2D _name
  587. # define ISAMPLER3D(_name, _reg) uniform isampler3D _name
  588. # define USAMPLER3D(_name, _reg) uniform usampler3D _name
  589. # if BGFX_SHADER_LANGUAGE_GLSL >= 130
  590. # define texture2D(_sampler, _coord) texture(_sampler, _coord)
  591. # define texture2DArray(_sampler, _coord) texture(_sampler, _coord)
  592. # define texture3D(_sampler, _coord) texture(_sampler, _coord)
  593. # define textureCube(_sampler, _coord) texture(_sampler, _coord)
  594. # define texture2DLod(_sampler, _coord, _lod) textureLod(_sampler, _coord, _lod)
  595. # define texture2DLodOffset(_sampler, _coord, _lod, _offset) textureLodOffset(_sampler, _coord, _lod, _offset)
  596. # define texture2DBias(_sampler, _coord, _bias) texture(_sampler, _coord, _bias)
  597. # define textureCubeBias(_sampler, _coord, _bias) texture(_sampler, _coord, _bias)
  598. # else
  599. # define texture2DBias(_sampler, _coord, _bias) texture2D(_sampler, _coord, _bias)
  600. # define textureCubeBias(_sampler, _coord, _bias) textureCube(_sampler, _coord, _bias)
  601. # endif // BGFX_SHADER_LANGUAGE_GLSL >= 130
  602. vec3 instMul(vec3 _vec, mat3 _mtx) { return mul(_vec, _mtx); }
  603. vec3 instMul(mat3 _mtx, vec3 _vec) { return mul(_mtx, _vec); }
  604. vec4 instMul(vec4 _vec, mat4 _mtx) { return mul(_vec, _mtx); }
  605. vec4 instMul(mat4 _mtx, vec4 _vec) { return mul(_mtx, _vec); }
  606. float rcp(float _a) { return 1.0/_a; }
  607. vec2 rcp(vec2 _a) { return vec2(1.0)/_a; }
  608. vec3 rcp(vec3 _a) { return vec3(1.0)/_a; }
  609. vec4 rcp(vec4 _a) { return vec4(1.0)/_a; }
  610. #endif // BGFX_SHADER_LANGUAGE_*
  611. vec2 vec2_splat(float _x) { return vec2(_x, _x); }
  612. vec3 vec3_splat(float _x) { return vec3(_x, _x, _x); }
  613. vec4 vec4_splat(float _x) { return vec4(_x, _x, _x, _x); }
  614. #if BGFX_SHADER_LANGUAGE_GLSL >= 130 || BGFX_SHADER_LANGUAGE_HLSL || BGFX_SHADER_LANGUAGE_PSSL || BGFX_SHADER_LANGUAGE_SPIRV || BGFX_SHADER_LANGUAGE_METAL
  615. uvec2 uvec2_splat(uint _x) { return uvec2(_x, _x); }
  616. uvec3 uvec3_splat(uint _x) { return uvec3(_x, _x, _x); }
  617. uvec4 uvec4_splat(uint _x) { return uvec4(_x, _x, _x, _x); }
  618. #endif // BGFX_SHADER_LANGUAGE_GLSL >= 130 || BGFX_SHADER_LANGUAGE_HLSL || BGFX_SHADER_LANGUAGE_PSSL || BGFX_SHADER_LANGUAGE_SPIRV || BGFX_SHADER_LANGUAGE_METAL
  619. mat4 mtxFromRows(vec4 _0, vec4 _1, vec4 _2, vec4 _3)
  620. {
  621. #if BGFX_SHADER_LANGUAGE_GLSL
  622. return transpose(mat4(_0, _1, _2, _3) );
  623. #else
  624. return mat4(_0, _1, _2, _3);
  625. #endif // BGFX_SHADER_LANGUAGE_GLSL
  626. }
  627. mat4 mtxFromCols(vec4 _0, vec4 _1, vec4 _2, vec4 _3)
  628. {
  629. #if BGFX_SHADER_LANGUAGE_GLSL
  630. return mat4(_0, _1, _2, _3);
  631. #else
  632. return transpose(mat4(_0, _1, _2, _3) );
  633. #endif // BGFX_SHADER_LANGUAGE_GLSL
  634. }
  635. mat3 mtxFromRows(vec3 _0, vec3 _1, vec3 _2)
  636. {
  637. #if BGFX_SHADER_LANGUAGE_GLSL
  638. return transpose(mat3(_0, _1, _2) );
  639. #else
  640. return mat3(_0, _1, _2);
  641. #endif // BGFX_SHADER_LANGUAGE_GLSL
  642. }
  643. mat3 mtxFromCols(vec3 _0, vec3 _1, vec3 _2)
  644. {
  645. #if BGFX_SHADER_LANGUAGE_GLSL
  646. return mat3(_0, _1, _2);
  647. #else
  648. return transpose(mat3(_0, _1, _2) );
  649. #endif // BGFX_SHADER_LANGUAGE_GLSL
  650. }
  651. #if BGFX_SHADER_LANGUAGE_GLSL
  652. #define mtxFromRows3(_0, _1, _2) transpose(mat3(_0, _1, _2) )
  653. #define mtxFromRows4(_0, _1, _2, _3) transpose(mat4(_0, _1, _2, _3) )
  654. #define mtxFromCols3(_0, _1, _2) mat3(_0, _1, _2)
  655. #define mtxFromCols4(_0, _1, _2, _3) mat4(_0, _1, _2, _3)
  656. #else
  657. #define mtxFromRows3(_0, _1, _2) mat3(_0, _1, _2)
  658. #define mtxFromRows4(_0, _1, _2, _3) mat4(_0, _1, _2, _3)
  659. #define mtxFromCols3(_0, _1, _2) transpose(mat3(_0, _1, _2) )
  660. #define mtxFromCols4(_0, _1, _2, _3) transpose(mat4(_0, _1, _2, _3) )
  661. #endif // BGFX_SHADER_LANGUAGE_GLSL
  662. uniform vec4 u_viewRect;
  663. uniform vec4 u_viewTexel;
  664. uniform mat4 u_view;
  665. uniform mat4 u_invView;
  666. uniform mat4 u_proj;
  667. uniform mat4 u_invProj;
  668. uniform mat4 u_viewProj;
  669. uniform mat4 u_invViewProj;
  670. uniform mat4 u_model[BGFX_CONFIG_MAX_BONES];
  671. uniform mat4 u_modelView;
  672. uniform mat4 u_modelViewProj;
  673. uniform vec4 u_alphaRef4;
  674. #define u_alphaRef u_alphaRef4.x
  675. #endif // __cplusplus
  676. #endif // BGFX_SHADER_H_HEADER_GUARD
  677. /*
  678. * Copyright 2011-2023 Branimir Karadzic. All rights reserved.
  679. * License: https://github.com/bkaradzic/bgfx/blob/master/LICENSE
  680. */
  681. #ifndef __SHADERLIB_SH__
  682. #define __SHADERLIB_SH__
  683. vec4 encodeRE8(float _r)
  684. {
  685. float exponent = ceil(log2(_r) );
  686. return vec4(_r / exp2(exponent)
  687. , 0.0
  688. , 0.0
  689. , (exponent + 128.0) / 255.0
  690. );
  691. }
  692. float decodeRE8(vec4 _re8)
  693. {
  694. float exponent = _re8.w * 255.0 - 128.0;
  695. return _re8.x * exp2(exponent);
  696. }
  697. vec4 encodeRGBE8(vec3 _rgb)
  698. {
  699. vec4 rgbe8;
  700. float maxComponent = max(max(_rgb.x, _rgb.y), _rgb.z);
  701. float exponent = ceil(log2(maxComponent) );
  702. rgbe8.xyz = _rgb / exp2(exponent);
  703. rgbe8.w = (exponent + 128.0) / 255.0;
  704. return rgbe8;
  705. }
  706. vec3 decodeRGBE8(vec4 _rgbe8)
  707. {
  708. float exponent = _rgbe8.w * 255.0 - 128.0;
  709. vec3 rgb = _rgbe8.xyz * exp2(exponent);
  710. return rgb;
  711. }
  712. vec3 encodeNormalUint(vec3 _normal)
  713. {
  714. return _normal * 0.5 + 0.5;
  715. }
  716. vec3 decodeNormalUint(vec3 _encodedNormal)
  717. {
  718. return _encodedNormal * 2.0 - 1.0;
  719. }
  720. vec2 encodeNormalSphereMap(vec3 _normal)
  721. {
  722. return normalize(_normal.xy) * sqrt(_normal.z * 0.5 + 0.5);
  723. }
  724. vec3 decodeNormalSphereMap(vec2 _encodedNormal)
  725. {
  726. float zz = dot(_encodedNormal, _encodedNormal) * 2.0 - 1.0;
  727. return vec3(normalize(_encodedNormal.xy) * sqrt(1.0 - zz*zz), zz);
  728. }
  729. vec2 octahedronWrap(vec2 _val)
  730. {
  731. // Reference(s):
  732. // - Octahedron normal vector encoding
  733. // https://web.archive.org/web/20191027010600/https://knarkowicz.wordpress.com/2014/04/16/octahedron-normal-vector-encoding/comment-page-1/
  734. return (1.0 - abs(_val.yx) )
  735. * mix(vec2_splat(-1.0), vec2_splat(1.0), vec2(greaterThanEqual(_val.xy, vec2_splat(0.0) ) ) );
  736. }
  737. vec2 encodeNormalOctahedron(vec3 _normal)
  738. {
  739. _normal /= abs(_normal.x) + abs(_normal.y) + abs(_normal.z);
  740. _normal.xy = _normal.z >= 0.0 ? _normal.xy : octahedronWrap(_normal.xy);
  741. _normal.xy = _normal.xy * 0.5 + 0.5;
  742. return _normal.xy;
  743. }
  744. vec3 decodeNormalOctahedron(vec2 _encodedNormal)
  745. {
  746. _encodedNormal = _encodedNormal * 2.0 - 1.0;
  747. vec3 normal;
  748. normal.z = 1.0 - abs(_encodedNormal.x) - abs(_encodedNormal.y);
  749. normal.xy = normal.z >= 0.0 ? _encodedNormal.xy : octahedronWrap(_encodedNormal.xy);
  750. return normalize(normal);
  751. }
  752. vec3 convertRGB2XYZ(vec3 _rgb)
  753. {
  754. // Reference(s):
  755. // - RGB/XYZ Matrices
  756. // https://web.archive.org/web/20191027010220/http://www.brucelindbloom.com/index.html?Eqn_RGB_XYZ_Matrix.html
  757. vec3 xyz;
  758. xyz.x = dot(vec3(0.4124564, 0.3575761, 0.1804375), _rgb);
  759. xyz.y = dot(vec3(0.2126729, 0.7151522, 0.0721750), _rgb);
  760. xyz.z = dot(vec3(0.0193339, 0.1191920, 0.9503041), _rgb);
  761. return xyz;
  762. }
  763. vec3 convertXYZ2RGB(vec3 _xyz)
  764. {
  765. vec3 rgb;
  766. rgb.x = dot(vec3( 3.2404542, -1.5371385, -0.4985314), _xyz);
  767. rgb.y = dot(vec3(-0.9692660, 1.8760108, 0.0415560), _xyz);
  768. rgb.z = dot(vec3( 0.0556434, -0.2040259, 1.0572252), _xyz);
  769. return rgb;
  770. }
  771. vec3 convertXYZ2Yxy(vec3 _xyz)
  772. {
  773. // Reference(s):
  774. // - XYZ to xyY
  775. // https://web.archive.org/web/20191027010144/http://www.brucelindbloom.com/index.html?Eqn_XYZ_to_xyY.html
  776. float inv = 1.0/dot(_xyz, vec3(1.0, 1.0, 1.0) );
  777. return vec3(_xyz.y, _xyz.x*inv, _xyz.y*inv);
  778. }
  779. vec3 convertYxy2XYZ(vec3 _Yxy)
  780. {
  781. // Reference(s):
  782. // - xyY to XYZ
  783. // https://web.archive.org/web/20191027010036/http://www.brucelindbloom.com/index.html?Eqn_xyY_to_XYZ.html
  784. vec3 xyz;
  785. xyz.x = _Yxy.x*_Yxy.y/_Yxy.z;
  786. xyz.y = _Yxy.x;
  787. xyz.z = _Yxy.x*(1.0 - _Yxy.y - _Yxy.z)/_Yxy.z;
  788. return xyz;
  789. }
  790. vec3 convertRGB2Yxy(vec3 _rgb)
  791. {
  792. return convertXYZ2Yxy(convertRGB2XYZ(_rgb) );
  793. }
  794. vec3 convertYxy2RGB(vec3 _Yxy)
  795. {
  796. return convertXYZ2RGB(convertYxy2XYZ(_Yxy) );
  797. }
  798. vec3 convertRGB2Yuv(vec3 _rgb)
  799. {
  800. vec3 yuv;
  801. yuv.x = dot(_rgb, vec3(0.299, 0.587, 0.114) );
  802. yuv.y = (_rgb.x - yuv.x)*0.713 + 0.5;
  803. yuv.z = (_rgb.z - yuv.x)*0.564 + 0.5;
  804. return yuv;
  805. }
  806. vec3 convertYuv2RGB(vec3 _yuv)
  807. {
  808. vec3 rgb;
  809. rgb.x = _yuv.x + 1.403*(_yuv.y-0.5);
  810. rgb.y = _yuv.x - 0.344*(_yuv.y-0.5) - 0.714*(_yuv.z-0.5);
  811. rgb.z = _yuv.x + 1.773*(_yuv.z-0.5);
  812. return rgb;
  813. }
  814. vec3 convertRGB2YIQ(vec3 _rgb)
  815. {
  816. vec3 yiq;
  817. yiq.x = dot(vec3(0.299, 0.587, 0.114 ), _rgb);
  818. yiq.y = dot(vec3(0.595716, -0.274453, -0.321263), _rgb);
  819. yiq.z = dot(vec3(0.211456, -0.522591, 0.311135), _rgb);
  820. return yiq;
  821. }
  822. vec3 convertYIQ2RGB(vec3 _yiq)
  823. {
  824. vec3 rgb;
  825. rgb.x = dot(vec3(1.0, 0.9563, 0.6210), _yiq);
  826. rgb.y = dot(vec3(1.0, -0.2721, -0.6474), _yiq);
  827. rgb.z = dot(vec3(1.0, -1.1070, 1.7046), _yiq);
  828. return rgb;
  829. }
  830. vec3 toLinear(vec3 _rgb)
  831. {
  832. return pow(abs(_rgb), vec3_splat(2.2) );
  833. }
  834. vec4 toLinear(vec4 _rgba)
  835. {
  836. return vec4(toLinear(_rgba.xyz), _rgba.w);
  837. }
  838. vec3 toLinearAccurate(vec3 _rgb)
  839. {
  840. vec3 lo = _rgb / 12.92;
  841. vec3 hi = pow( (_rgb + 0.055) / 1.055, vec3_splat(2.4) );
  842. vec3 rgb = mix(hi, lo, vec3(lessThanEqual(_rgb, vec3_splat(0.04045) ) ) );
  843. return rgb;
  844. }
  845. vec4 toLinearAccurate(vec4 _rgba)
  846. {
  847. return vec4(toLinearAccurate(_rgba.xyz), _rgba.w);
  848. }
  849. float toGamma(float _r)
  850. {
  851. return pow(abs(_r), 1.0/2.2);
  852. }
  853. vec3 toGamma(vec3 _rgb)
  854. {
  855. return pow(abs(_rgb), vec3_splat(1.0/2.2) );
  856. }
  857. vec4 toGamma(vec4 _rgba)
  858. {
  859. return vec4(toGamma(_rgba.xyz), _rgba.w);
  860. }
  861. vec3 toGammaAccurate(vec3 _rgb)
  862. {
  863. vec3 lo = _rgb * 12.92;
  864. vec3 hi = pow(abs(_rgb), vec3_splat(1.0/2.4) ) * 1.055 - 0.055;
  865. vec3 rgb = mix(hi, lo, vec3(lessThanEqual(_rgb, vec3_splat(0.0031308) ) ) );
  866. return rgb;
  867. }
  868. vec4 toGammaAccurate(vec4 _rgba)
  869. {
  870. return vec4(toGammaAccurate(_rgba.xyz), _rgba.w);
  871. }
  872. vec3 toReinhard(vec3 _rgb)
  873. {
  874. return toGamma(_rgb/(_rgb+vec3_splat(1.0) ) );
  875. }
  876. vec4 toReinhard(vec4 _rgba)
  877. {
  878. return vec4(toReinhard(_rgba.xyz), _rgba.w);
  879. }
  880. vec3 toFilmic(vec3 _rgb)
  881. {
  882. _rgb = max(vec3_splat(0.0), _rgb - 0.004);
  883. _rgb = (_rgb*(6.2*_rgb + 0.5) ) / (_rgb*(6.2*_rgb + 1.7) + 0.06);
  884. return _rgb;
  885. }
  886. vec4 toFilmic(vec4 _rgba)
  887. {
  888. return vec4(toFilmic(_rgba.xyz), _rgba.w);
  889. }
  890. vec3 toAcesFilmic(vec3 _rgb)
  891. {
  892. // Reference(s):
  893. // - ACES Filmic Tone Mapping Curve
  894. // https://web.archive.org/web/20191027010704/https://knarkowicz.wordpress.com/2016/01/06/aces-filmic-tone-mapping-curve/
  895. float aa = 2.51f;
  896. float bb = 0.03f;
  897. float cc = 2.43f;
  898. float dd = 0.59f;
  899. float ee = 0.14f;
  900. return saturate( (_rgb*(aa*_rgb + bb) )/(_rgb*(cc*_rgb + dd) + ee) );
  901. }
  902. vec4 toAcesFilmic(vec4 _rgba)
  903. {
  904. return vec4(toAcesFilmic(_rgba.xyz), _rgba.w);
  905. }
  906. vec3 luma(vec3 _rgb)
  907. {
  908. float yy = dot(vec3(0.2126729, 0.7151522, 0.0721750), _rgb);
  909. return vec3_splat(yy);
  910. }
  911. vec4 luma(vec4 _rgba)
  912. {
  913. return vec4(luma(_rgba.xyz), _rgba.w);
  914. }
  915. vec3 conSatBri(vec3 _rgb, vec3 _csb)
  916. {
  917. vec3 rgb = _rgb * _csb.z;
  918. rgb = mix(luma(rgb), rgb, _csb.y);
  919. rgb = mix(vec3_splat(0.5), rgb, _csb.x);
  920. return rgb;
  921. }
  922. vec4 conSatBri(vec4 _rgba, vec3 _csb)
  923. {
  924. return vec4(conSatBri(_rgba.xyz, _csb), _rgba.w);
  925. }
  926. vec3 posterize(vec3 _rgb, float _numColors)
  927. {
  928. return floor(_rgb*_numColors) / _numColors;
  929. }
  930. vec4 posterize(vec4 _rgba, float _numColors)
  931. {
  932. return vec4(posterize(_rgba.xyz, _numColors), _rgba.w);
  933. }
  934. vec3 sepia(vec3 _rgb)
  935. {
  936. vec3 color;
  937. color.x = dot(_rgb, vec3(0.393, 0.769, 0.189) );
  938. color.y = dot(_rgb, vec3(0.349, 0.686, 0.168) );
  939. color.z = dot(_rgb, vec3(0.272, 0.534, 0.131) );
  940. return color;
  941. }
  942. vec4 sepia(vec4 _rgba)
  943. {
  944. return vec4(sepia(_rgba.xyz), _rgba.w);
  945. }
  946. vec3 blendOverlay(vec3 _base, vec3 _blend)
  947. {
  948. vec3 lt = 2.0 * _base * _blend;
  949. vec3 gte = 1.0 - 2.0 * (1.0 - _base) * (1.0 - _blend);
  950. return mix(lt, gte, step(vec3_splat(0.5), _base) );
  951. }
  952. vec4 blendOverlay(vec4 _base, vec4 _blend)
  953. {
  954. return vec4(blendOverlay(_base.xyz, _blend.xyz), _base.w);
  955. }
  956. vec3 adjustHue(vec3 _rgb, float _hue)
  957. {
  958. vec3 yiq = convertRGB2YIQ(_rgb);
  959. float angle = _hue + atan2(yiq.z, yiq.y);
  960. float len = length(yiq.yz);
  961. return convertYIQ2RGB(vec3(yiq.x, len*cos(angle), len*sin(angle) ) );
  962. }
  963. vec4 packFloatToRgba(float _value)
  964. {
  965. const vec4 shift = vec4(256 * 256 * 256, 256 * 256, 256, 1.0);
  966. const vec4 mask = vec4(0, 1.0 / 256.0, 1.0 / 256.0, 1.0 / 256.0);
  967. vec4 comp = fract(_value * shift);
  968. comp -= comp.xxyz * mask;
  969. return comp;
  970. }
  971. float unpackRgbaToFloat(vec4 _rgba)
  972. {
  973. const vec4 shift = vec4(1.0 / (256.0 * 256.0 * 256.0), 1.0 / (256.0 * 256.0), 1.0 / 256.0, 1.0);
  974. return dot(_rgba, shift);
  975. }
  976. vec2 packHalfFloat(float _value)
  977. {
  978. const vec2 shift = vec2(256, 1.0);
  979. const vec2 mask = vec2(0, 1.0 / 256.0);
  980. vec2 comp = fract(_value * shift);
  981. comp -= comp.xx * mask;
  982. return comp;
  983. }
  984. float unpackHalfFloat(vec2 _rg)
  985. {
  986. const vec2 shift = vec2(1.0 / 256.0, 1.0);
  987. return dot(_rg, shift);
  988. }
  989. float random(vec2 _uv)
  990. {
  991. return fract(sin(dot(_uv.xy, vec2(12.9898, 78.233) ) ) * 43758.5453);
  992. }
  993. vec3 fixCubeLookup(vec3 _v, float _lod, float _topLevelCubeSize)
  994. {
  995. // Reference(s):
  996. // - Seamless cube-map filtering
  997. // https://web.archive.org/web/20190411181934/http://the-witness.net/news/2012/02/seamless-cube-map-filtering/
  998. float ax = abs(_v.x);
  999. float ay = abs(_v.y);
  1000. float az = abs(_v.z);
  1001. float vmax = max(max(ax, ay), az);
  1002. float scale = 1.0 - exp2(_lod) / _topLevelCubeSize;
  1003. if (ax != vmax) { _v.x *= scale; }
  1004. if (ay != vmax) { _v.y *= scale; }
  1005. if (az != vmax) { _v.z *= scale; }
  1006. return _v;
  1007. }
  1008. vec2 texture2DBc5(sampler2D _sampler, vec2 _uv)
  1009. {
  1010. #if BGFX_SHADER_LANGUAGE_HLSL && BGFX_SHADER_LANGUAGE_HLSL <= 300
  1011. return texture2D(_sampler, _uv).yx;
  1012. #else
  1013. return texture2D(_sampler, _uv).xy;
  1014. #endif
  1015. }
  1016. mat3 cofactor(mat4 _m)
  1017. {
  1018. // Reference:
  1019. // Cofactor of matrix. Use to transform normals. The code assumes the last column of _m is [0,0,0,1].
  1020. // https://www.shadertoy.com/view/3s33zj
  1021. // https://github.com/graphitemaster/normals_revisited
  1022. return mat3(
  1023. _m[1][1]*_m[2][2]-_m[1][2]*_m[2][1],
  1024. _m[1][2]*_m[2][0]-_m[1][0]*_m[2][2],
  1025. _m[1][0]*_m[2][1]-_m[1][1]*_m[2][0],
  1026. _m[0][2]*_m[2][1]-_m[0][1]*_m[2][2],
  1027. _m[0][0]*_m[2][2]-_m[0][2]*_m[2][0],
  1028. _m[0][1]*_m[2][0]-_m[0][0]*_m[2][1],
  1029. _m[0][1]*_m[1][2]-_m[0][2]*_m[1][1],
  1030. _m[0][2]*_m[1][0]-_m[0][0]*_m[1][2],
  1031. _m[0][0]*_m[1][1]-_m[0][1]*_m[1][0]
  1032. );
  1033. }
  1034. float toClipSpaceDepth(float _depthTextureZ)
  1035. {
  1036. #if BGFX_SHADER_LANGUAGE_GLSL
  1037. return _depthTextureZ * 2.0 - 1.0;
  1038. #else
  1039. return _depthTextureZ;
  1040. #endif // BGFX_SHADER_LANGUAGE_GLSL
  1041. }
  1042. vec3 clipToWorld(mat4 _invViewProj, vec3 _clipPos)
  1043. {
  1044. vec4 wpos = mul(_invViewProj, vec4(_clipPos, 1.0) );
  1045. return wpos.xyz / wpos.w;
  1046. }
  1047. #endif // __SHADERLIB_SH__
  1048. """
  1049. }
  1050. }