default.effect 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. #include "color.effect"
  2. uniform float4x4 ViewProj;
  3. uniform texture2d image;
  4. uniform float multiplier;
  5. sampler_state def_sampler {
  6. Filter = Linear;
  7. AddressU = Clamp;
  8. AddressV = Clamp;
  9. };
  10. struct VertInOut {
  11. float4 pos : POSITION;
  12. float2 uv : TEXCOORD0;
  13. };
  14. VertInOut VSDefault(VertInOut vert_in)
  15. {
  16. VertInOut vert_out;
  17. vert_out.pos = mul(float4(vert_in.pos.xyz, 1.0), ViewProj);
  18. vert_out.uv = vert_in.uv;
  19. return vert_out;
  20. }
  21. float4 PSDrawBare(VertInOut vert_in) : TARGET
  22. {
  23. return image.Sample(def_sampler, vert_in.uv);
  24. }
  25. float4 PSDrawAlphaDivide(VertInOut vert_in) : TARGET
  26. {
  27. float4 rgba = image.Sample(def_sampler, vert_in.uv);
  28. rgba.rgb *= (rgba.a > 0.) ? (1. / rgba.a) : 0.;
  29. return rgba;
  30. }
  31. float4 PSDrawAlphaDivideTonemap(VertInOut vert_in) : TARGET
  32. {
  33. float4 rgba = image.Sample(def_sampler, vert_in.uv);
  34. rgba.rgb *= (rgba.a > 0.) ? (1. / rgba.a) : 0.;
  35. rgba.rgb = rec709_to_rec2020(rgba.rgb);
  36. rgba.rgb = reinhard(rgba.rgb);
  37. rgba.rgb = rec2020_to_rec709(rgba.rgb);
  38. return rgba;
  39. }
  40. float4 PSDrawAlphaDivideR10L(VertInOut vert_in) : TARGET
  41. {
  42. float4 rgba = image.Sample(def_sampler, vert_in.uv);
  43. rgba.rgb *= (rgba.a > 0.) ? (multiplier / rgba.a) : 0.;
  44. rgba.rgb = rec709_to_rec2020(rgba.rgb);
  45. rgba.rgb = linear_to_st2084(rgba.rgb);
  46. uint3 rgb1023 = uint3(mad(rgba.rgb, 876., 64.5));
  47. uint b = (rgb1023.b & 0x3Fu) << 2;
  48. uint g = ((rgb1023.b & 0x3C0u) >> 6) | ((rgb1023.g & 0xFu) << 4);
  49. uint r = ((rgb1023.g & 0x3F0u) >> 4) | ((rgb1023.r & 0x3u) << 6);
  50. uint a = ((rgb1023.r & 0x3FCu) >> 2);
  51. return float4(uint4(r, g, b, a)) / 255.;
  52. }
  53. float4 PSDrawNonlinearAlpha(VertInOut vert_in) : TARGET
  54. {
  55. float4 rgba = image.Sample(def_sampler, vert_in.uv);
  56. rgba.rgb = srgb_linear_to_nonlinear(rgba.rgb);
  57. rgba.rgb *= rgba.a;
  58. rgba.rgb = srgb_nonlinear_to_linear(rgba.rgb);
  59. return rgba;
  60. }
  61. float4 PSDrawNonlinearAlphaMultiply(VertInOut vert_in) : TARGET
  62. {
  63. float4 rgba = image.Sample(def_sampler, vert_in.uv);
  64. rgba.rgb = srgb_linear_to_nonlinear(rgba.rgb);
  65. rgba.rgb *= rgba.a;
  66. rgba.rgb = srgb_nonlinear_to_linear(rgba.rgb);
  67. rgba.rgb *= multiplier;
  68. return rgba;
  69. }
  70. float4 PSDrawSrgbDecompress(VertInOut vert_in) : TARGET
  71. {
  72. float4 rgba = image.Sample(def_sampler, vert_in.uv);
  73. rgba.rgb = srgb_nonlinear_to_linear(rgba.rgb);
  74. return rgba;
  75. }
  76. float4 PSDrawSrgbDecompressMultiply(VertInOut vert_in) : TARGET
  77. {
  78. float4 rgba = image.Sample(def_sampler, vert_in.uv);
  79. rgba.rgb = srgb_nonlinear_to_linear(rgba.rgb);
  80. rgba.rgb *= multiplier;
  81. return rgba;
  82. }
  83. float4 PSDrawMultiply(VertInOut vert_in) : TARGET
  84. {
  85. float4 rgba = image.Sample(def_sampler, vert_in.uv);
  86. rgba.rgb *= multiplier;
  87. return rgba;
  88. }
  89. float4 PSDrawTonemap(VertInOut vert_in) : TARGET
  90. {
  91. float4 rgba = image.Sample(def_sampler, vert_in.uv);
  92. rgba.rgb = rec709_to_rec2020(rgba.rgb);
  93. rgba.rgb = reinhard(rgba.rgb);
  94. rgba.rgb = rec2020_to_rec709(rgba.rgb);
  95. return rgba;
  96. }
  97. float4 PSDrawMultiplyTonemap(VertInOut vert_in) : TARGET
  98. {
  99. float4 rgba = image.Sample(def_sampler, vert_in.uv);
  100. rgba.rgb *= multiplier;
  101. rgba.rgb = rec709_to_rec2020(rgba.rgb);
  102. rgba.rgb = reinhard(rgba.rgb);
  103. rgba.rgb = rec2020_to_rec709(rgba.rgb);
  104. return rgba;
  105. }
  106. float4 PSDrawPQ(VertInOut vert_in) : TARGET
  107. {
  108. float4 rgba = image.Sample(def_sampler, vert_in.uv);
  109. rgba.rgb = st2084_to_linear(rgba.rgb) * multiplier;
  110. rgba.rgb = rec2020_to_rec709(rgba.rgb);
  111. return rgba;
  112. }
  113. float4 PSDrawTonemapPQ(VertInOut vert_in) : TARGET
  114. {
  115. float4 rgba = image.Sample(def_sampler, vert_in.uv);
  116. rgba.rgb = st2084_to_linear(rgba.rgb) * multiplier;
  117. rgba.rgb = reinhard(rgba.rgb);
  118. rgba.rgb = rec2020_to_rec709(rgba.rgb);
  119. return rgba;
  120. }
  121. float4 PSDrawD65P3(VertInOut vert_in) : TARGET
  122. {
  123. float4 rgba = image.Sample(def_sampler, vert_in.uv);
  124. rgba.rgb = srgb_nonlinear_to_linear(rgba.rgb);
  125. rgba.rgb = d65p3_to_rec709(rgba.rgb);
  126. return rgba;
  127. }
  128. technique Draw
  129. {
  130. pass
  131. {
  132. vertex_shader = VSDefault(vert_in);
  133. pixel_shader = PSDrawBare(vert_in);
  134. }
  135. }
  136. technique DrawAlphaDivide
  137. {
  138. pass
  139. {
  140. vertex_shader = VSDefault(vert_in);
  141. pixel_shader = PSDrawAlphaDivide(vert_in);
  142. }
  143. }
  144. technique DrawAlphaDivideTonemap
  145. {
  146. pass
  147. {
  148. vertex_shader = VSDefault(vert_in);
  149. pixel_shader = PSDrawAlphaDivideTonemap(vert_in);
  150. }
  151. }
  152. technique DrawAlphaDivideR10L
  153. {
  154. pass
  155. {
  156. vertex_shader = VSDefault(vert_in);
  157. pixel_shader = PSDrawAlphaDivideR10L(vert_in);
  158. }
  159. }
  160. technique DrawNonlinearAlpha
  161. {
  162. pass
  163. {
  164. vertex_shader = VSDefault(vert_in);
  165. pixel_shader = PSDrawNonlinearAlpha(vert_in);
  166. }
  167. }
  168. technique DrawNonlinearAlphaMultiply
  169. {
  170. pass
  171. {
  172. vertex_shader = VSDefault(vert_in);
  173. pixel_shader = PSDrawNonlinearAlphaMultiply(vert_in);
  174. }
  175. }
  176. technique DrawSrgbDecompress
  177. {
  178. pass
  179. {
  180. vertex_shader = VSDefault(vert_in);
  181. pixel_shader = PSDrawSrgbDecompress(vert_in);
  182. }
  183. }
  184. technique DrawSrgbDecompressMultiply
  185. {
  186. pass
  187. {
  188. vertex_shader = VSDefault(vert_in);
  189. pixel_shader = PSDrawSrgbDecompressMultiply(vert_in);
  190. }
  191. }
  192. technique DrawMultiply
  193. {
  194. pass
  195. {
  196. vertex_shader = VSDefault(vert_in);
  197. pixel_shader = PSDrawMultiply(vert_in);
  198. }
  199. }
  200. technique DrawTonemap
  201. {
  202. pass
  203. {
  204. vertex_shader = VSDefault(vert_in);
  205. pixel_shader = PSDrawTonemap(vert_in);
  206. }
  207. }
  208. technique DrawMultiplyTonemap
  209. {
  210. pass
  211. {
  212. vertex_shader = VSDefault(vert_in);
  213. pixel_shader = PSDrawMultiplyTonemap(vert_in);
  214. }
  215. }
  216. technique DrawPQ
  217. {
  218. pass
  219. {
  220. vertex_shader = VSDefault(vert_in);
  221. pixel_shader = PSDrawPQ(vert_in);
  222. }
  223. }
  224. technique DrawTonemapPQ
  225. {
  226. pass
  227. {
  228. vertex_shader = VSDefault(vert_in);
  229. pixel_shader = PSDrawTonemapPQ(vert_in);
  230. }
  231. }
  232. technique DrawD65P3
  233. {
  234. pass
  235. {
  236. vertex_shader = VSDefault(vert_in);
  237. pixel_shader = PSDrawD65P3(vert_in);
  238. }
  239. }