default.effect 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  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.) ? (rgba.rgb / rgba.a) : float3(0., 0., 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.) ? (rgba.rgb / rgba.a) : float3(0., 0., 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.) ? (rgba.rgb / rgba.a) : float3(0., 0., 0.);
  44. rgba.rgb *= multiplier;
  45. rgba.rgb = rec709_to_rec2020(rgba.rgb);
  46. rgba.rgb = linear_to_st2084(rgba.rgb);
  47. uint3 rgb1023 = uint3(mad(rgba.rgb, 1023., .5));
  48. uint b = (rgb1023.b & 0x3Fu) << 2;
  49. uint g = ((rgb1023.b & 0x3C0u) >> 6) | ((rgb1023.g & 0xFu) << 4);
  50. uint r = ((rgb1023.g & 0x3F0u) >> 4) | ((rgb1023.r & 0x3u) << 6);
  51. uint a = ((rgb1023.r & 0x3FCu) >> 2);
  52. return float4(uint4(r, g, b, a)) / 255.;
  53. }
  54. float4 PSDrawNonlinearAlpha(VertInOut vert_in) : TARGET
  55. {
  56. float4 rgba = image.Sample(def_sampler, vert_in.uv);
  57. rgba.rgb = srgb_linear_to_nonlinear(rgba.rgb);
  58. rgba.rgb *= rgba.a;
  59. rgba.rgb = srgb_nonlinear_to_linear(rgba.rgb);
  60. return rgba;
  61. }
  62. float4 PSDrawNonlinearAlphaMultiply(VertInOut vert_in) : TARGET
  63. {
  64. float4 rgba = image.Sample(def_sampler, vert_in.uv);
  65. rgba.rgb = srgb_linear_to_nonlinear(rgba.rgb);
  66. rgba.rgb *= rgba.a;
  67. rgba.rgb = srgb_nonlinear_to_linear(rgba.rgb);
  68. rgba.rgb *= multiplier;
  69. return rgba;
  70. }
  71. float4 PSDrawSrgbDecompress(VertInOut vert_in) : TARGET
  72. {
  73. float4 rgba = image.Sample(def_sampler, vert_in.uv);
  74. rgba.rgb = srgb_nonlinear_to_linear(rgba.rgb);
  75. return rgba;
  76. }
  77. float4 PSDrawSrgbDecompressMultiply(VertInOut vert_in) : TARGET
  78. {
  79. float4 rgba = image.Sample(def_sampler, vert_in.uv);
  80. rgba.rgb = srgb_nonlinear_to_linear(rgba.rgb);
  81. rgba.rgb *= multiplier;
  82. return rgba;
  83. }
  84. float4 PSDrawMultiply(VertInOut vert_in) : TARGET
  85. {
  86. float4 rgba = image.Sample(def_sampler, vert_in.uv);
  87. rgba.rgb *= multiplier;
  88. return rgba;
  89. }
  90. float4 PSDrawTonemap(VertInOut vert_in) : TARGET
  91. {
  92. float4 rgba = image.Sample(def_sampler, vert_in.uv);
  93. rgba.rgb = rec709_to_rec2020(rgba.rgb);
  94. rgba.rgb = reinhard(rgba.rgb);
  95. rgba.rgb = rec2020_to_rec709(rgba.rgb);
  96. return rgba;
  97. }
  98. float4 PSDrawMultiplyTonemap(VertInOut vert_in) : TARGET
  99. {
  100. float4 rgba = image.Sample(def_sampler, vert_in.uv);
  101. rgba.rgb *= multiplier;
  102. rgba.rgb = rec709_to_rec2020(rgba.rgb);
  103. rgba.rgb = reinhard(rgba.rgb);
  104. rgba.rgb = rec2020_to_rec709(rgba.rgb);
  105. return rgba;
  106. }
  107. float4 PSDrawPQ(VertInOut vert_in) : TARGET
  108. {
  109. float4 rgba = image.Sample(def_sampler, vert_in.uv);
  110. rgba.rgb = st2084_to_linear(rgba.rgb) * multiplier;
  111. rgba.rgb = rec2020_to_rec709(rgba.rgb);
  112. return rgba;
  113. }
  114. float4 PSDrawTonemapPQ(VertInOut vert_in) : TARGET
  115. {
  116. float4 rgba = image.Sample(def_sampler, vert_in.uv);
  117. rgba.rgb = st2084_to_linear(rgba.rgb) * multiplier;
  118. rgba.rgb = reinhard(rgba.rgb);
  119. rgba.rgb = rec2020_to_rec709(rgba.rgb);
  120. return rgba;
  121. }
  122. technique Draw
  123. {
  124. pass
  125. {
  126. vertex_shader = VSDefault(vert_in);
  127. pixel_shader = PSDrawBare(vert_in);
  128. }
  129. }
  130. technique DrawAlphaDivide
  131. {
  132. pass
  133. {
  134. vertex_shader = VSDefault(vert_in);
  135. pixel_shader = PSDrawAlphaDivide(vert_in);
  136. }
  137. }
  138. technique DrawAlphaDivideTonemap
  139. {
  140. pass
  141. {
  142. vertex_shader = VSDefault(vert_in);
  143. pixel_shader = PSDrawAlphaDivideTonemap(vert_in);
  144. }
  145. }
  146. technique DrawAlphaDivideR10L
  147. {
  148. pass
  149. {
  150. vertex_shader = VSDefault(vert_in);
  151. pixel_shader = PSDrawAlphaDivideR10L(vert_in);
  152. }
  153. }
  154. technique DrawNonlinearAlpha
  155. {
  156. pass
  157. {
  158. vertex_shader = VSDefault(vert_in);
  159. pixel_shader = PSDrawNonlinearAlpha(vert_in);
  160. }
  161. }
  162. technique DrawNonlinearAlphaMultiply
  163. {
  164. pass
  165. {
  166. vertex_shader = VSDefault(vert_in);
  167. pixel_shader = PSDrawNonlinearAlphaMultiply(vert_in);
  168. }
  169. }
  170. technique DrawSrgbDecompress
  171. {
  172. pass
  173. {
  174. vertex_shader = VSDefault(vert_in);
  175. pixel_shader = PSDrawSrgbDecompress(vert_in);
  176. }
  177. }
  178. technique DrawSrgbDecompressMultiply
  179. {
  180. pass
  181. {
  182. vertex_shader = VSDefault(vert_in);
  183. pixel_shader = PSDrawSrgbDecompressMultiply(vert_in);
  184. }
  185. }
  186. technique DrawMultiply
  187. {
  188. pass
  189. {
  190. vertex_shader = VSDefault(vert_in);
  191. pixel_shader = PSDrawMultiply(vert_in);
  192. }
  193. }
  194. technique DrawTonemap
  195. {
  196. pass
  197. {
  198. vertex_shader = VSDefault(vert_in);
  199. pixel_shader = PSDrawTonemap(vert_in);
  200. }
  201. }
  202. technique DrawMultiplyTonemap
  203. {
  204. pass
  205. {
  206. vertex_shader = VSDefault(vert_in);
  207. pixel_shader = PSDrawMultiplyTonemap(vert_in);
  208. }
  209. }
  210. technique DrawPQ
  211. {
  212. pass
  213. {
  214. vertex_shader = VSDefault(vert_in);
  215. pixel_shader = PSDrawPQ(vert_in);
  216. }
  217. }
  218. technique DrawTonemapPQ
  219. {
  220. pass
  221. {
  222. vertex_shader = VSDefault(vert_in);
  223. pixel_shader = PSDrawTonemapPQ(vert_in);
  224. }
  225. }