Advertisement
Guest User

Untitled

a guest
Jan 17th, 2018
322
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 149.67 KB | None | 0 0
  1. #version 450 core
  2. #define D_PLATFORM_PC
  3. #define D_FRAGMENT
  4.  
  5. // PIXEL SHADER: SHADERS/LENSFLARE.SHADER.BIN
  6. // CONTEXT: FEATURE
  7. // =================================================================================================
  8. #define D_LENSFLARE_FEATURE
  9. ////////////////////////////////////////////////////////////////////////////////
  10. ///
  11. /// @file LensFlareFragment.h
  12. /// @author User
  13. /// @date
  14. ///
  15. /// @brief LensFlareFragment
  16. ///
  17. /// Copyright (c) 2008 Hello Games Ltd. All Rights Reserved.
  18. ///
  19. ////////////////////////////////////////////////////////////////////////////////
  20.  
  21. //-----------------------------------------------------------------------------
  22. // Compilation defines
  23.  
  24.  
  25. //-----------------------------------------------------------------------------
  26. // Include files
  27.  
  28. // =================================================================================================
  29.  
  30. #ifndef D_DEFINES
  31. #define D_DEFINES
  32.  
  33.  
  34. // =================================================================================================
  35. // Platform defines
  36. // =================================================================================================
  37. #ifdef D_PLATFORM_PC
  38.  
  39. #define D_ENABLE_REVERSEZ_PROJECTION (1)
  40.  
  41. #pragma optionNV(strict on)
  42. #extension GL_ARB_gpu_shader5 : enable
  43. #extension GL_ARB_fragment_coord_conventions : enable
  44. #extension GL_ARB_derivative_control : enable
  45.  
  46.  
  47. #if defined( D_FRAGMENT ) && defined( _F64_ )
  48.  
  49. layout(early_fragment_tests) in;
  50.  
  51. #endif
  52.  
  53. #elif defined(D_PLATFORM_ORBIS)
  54.  
  55. #define D_ENABLE_REVERSEZ_PROJECTION (1)
  56.  
  57. // use this with sdk 2.0 compiler
  58. // #pragma argument (allow-scratch-buffer-spill)
  59.  
  60. //define these flags so they don't get ignored in build process and in the comb mask
  61. //this is because materials, vertex layouts and shaders need to be synced on 360 to avoid patching
  62. #ifdef _F27_
  63. #endif
  64. #ifdef _F28_
  65. #endif
  66. #ifdef _F29_
  67. #endif
  68. #ifdef _F21_
  69. #endif
  70. #ifdef _F02_
  71. #endif
  72. #ifdef _F03_
  73. #endif
  74. #if defined( _F01_ ) || defined( D_LOD0 ) || defined( D_LOD1 ) || defined( D_LOD2 ) || defined( D_LOD3) || defined( D_LOD4 )
  75. #endif
  76. #ifdef _F01_
  77. #endif
  78. #ifdef _F09_
  79. #endif
  80. #ifdef _F10_
  81. #endif
  82.  
  83.  
  84. // disable warnings for unused parameters. This happens a lot because of defining different things.
  85. #pragma warning (disable: 5203)
  86.  
  87. // temp thing to know what things are still required on ps4.
  88. #define D_PLATFORM_ORBIS_FIX
  89.  
  90. #ifdef __PSSL_CS__
  91. #define D_PLATFORM_ORBIS_COMPUTE
  92. #endif
  93.  
  94. #ifdef __PSSL_HS__
  95. #define D_HULL
  96. #endif
  97.  
  98. #ifdef __PSSL_DS__
  99. #define D_DOMAIN
  100. #endif
  101.  
  102. #ifdef __PSSL_VS__
  103. #define D_VERTEX
  104. #endif
  105.  
  106. #ifdef __PSSL_GS__
  107. #define D_GEOMETRY
  108. #endif
  109.  
  110. #endif
  111.  
  112. #if !D_ENABLE_REVERSEZ_PROJECTION
  113. #define D_USING_LOGDEPTH
  114. #endif
  115.  
  116.  
  117. // =================================================================================================
  118. // Basic Types
  119. // =================================================================================================
  120. #ifdef D_PLATFORM_PC
  121.  
  122. #define JOINT_TYPE vec4
  123.  
  124. //#define CONST const
  125. #define STATIC_CONST const
  126.  
  127. #elif defined(D_PLATFORM_ORBIS)
  128.  
  129. #define JOINT_TYPE int4
  130. #define float float
  131. #define vec2 float2
  132. #define vec3 float3
  133. #define vec4 float4
  134. #define ivec2 int2
  135. #define ivec3 int3
  136. #define ivec4 int4
  137. #define uvec2 uint2
  138. #define uvec3 uint3
  139. #define uvec4 uint4
  140. // NOTE:
  141. // operator[] accesses rows, not columns
  142. // matrix constructors interpret the passed vectors as row vectors, not column vectors
  143. #define mat2 row_major float2x2
  144. #define mat3 row_major float3x3
  145. #define mat4 row_major float4x4
  146.  
  147. //#define CONST
  148. #define STATIC_CONST static const
  149. // #define const ERROR, DON'T USE CONST FOR PS4. USE STATIC_CONST INSTEAD FOR A COMPILED IN CONSTANT. OTHERWISE IT TRIES TO PUT IT IN A CONSTANT BUFFER AND FOR SOME REASON IT DOESN'T WORK.
  150.  
  151.  
  152. #endif
  153.  
  154. // =================================================================================================
  155. // Functions
  156. // =================================================================================================
  157. #ifdef D_PLATFORM_PC
  158.  
  159. #define saturate( V ) min( max( V, 0.0) , 1.0)
  160. #define atan2( Y, X ) atan( Y, X )
  161. #define invsqrt( X ) inversesqrt( X )
  162.  
  163. #ifdef D_COMPUTE
  164.  
  165. #define groupID gl_WorkGroupID
  166. #define groupThreadID gl_LocalInvocationID
  167. #define dispatchThreadID gl_GlobalInvocationID
  168.  
  169. #endif
  170.  
  171. #elif defined(D_PLATFORM_ORBIS)
  172.  
  173. #if defined(D_PLATFORM_ORBIS_COMPUTE)
  174.  
  175. float dFdx( float var ) { float delta = var - LaneSwizzle( var, 0x1f, 0, 1 ); return __v_cndmask_b32(0, 1, 0xAAAAAAAAAAAAAAAA ) ? delta : -delta; }
  176. float dFdy( float var ) { float delta = var - LaneSwizzle( var, 0x1f, 0, 8 ); return __v_cndmask_b32(0, 1, 0xFF00FF00FF00FF00 ) ? delta : -delta; }
  177.  
  178. vec2 dFdx( vec2 var ) { vec2 delta = vec2( var.x - LaneSwizzle( var.x, 0x1f, 0, 1 ), var.y - LaneSwizzle( var.y, 0x1f, 0, 1 ) ); return __v_cndmask_b32(0, 1, 0xAAAAAAAAAAAAAAAA ) ? delta : -delta; }
  179. vec2 dFdy( vec2 var ) { vec2 delta = vec2( var.x - LaneSwizzle( var.x, 0x1f, 0, 8 ), var.y - LaneSwizzle( var.y, 0x1f, 0, 8 ) ); return __v_cndmask_b32(0, 1, 0xFF00FF00FF00FF00 ) ? delta : -delta; }
  180.  
  181. vec3 dFdx( vec3 var ) { vec3 delta = vec3( var.x - LaneSwizzle( var.x, 0x1f, 0, 1 ), var.y - LaneSwizzle( var.y, 0x1f, 0, 1 ), var.z - LaneSwizzle( var.z, 0x1f, 0, 1 ) ); return __v_cndmask_b32(0, 1, 0xAAAAAAAAAAAAAAAA ) ? delta : -delta; }
  182. vec3 dFdy( vec3 var ) { vec3 delta = vec3( var.x - LaneSwizzle( var.x, 0x1f, 0, 8 ), var.y - LaneSwizzle( var.y, 0x1f, 0, 8 ), var.z - LaneSwizzle( var.z, 0x1f, 0, 8 ) ); return __v_cndmask_b32(0, 1, 0xFF00FF00FF00FF00 ) ? delta : -delta; }
  183.  
  184. vec4 dFdx( vec4 var ) { vec4 delta = vec4( var.x - LaneSwizzle( var.x, 0x1f, 0, 1 ), var.y - LaneSwizzle( var.y, 0x1f, 0, 1 ), var.z - LaneSwizzle( var.z, 0x1f, 0, 1 ), var.z - LaneSwizzle( var.w, 0x1f, 0, 1 ) ); return __v_cndmask_b32(0, 1, 0xAAAAAAAAAAAAAAAA ) ? delta : -delta; }
  185. vec4 dFdy( vec4 var ) { vec4 delta = vec4( var.x - LaneSwizzle( var.x, 0x1f, 0, 8 ), var.y - LaneSwizzle( var.y, 0x1f, 0, 8 ), var.z - LaneSwizzle( var.z, 0x1f, 0, 8 ), var.z - LaneSwizzle( var.w, 0x1f, 0, 8 ) ); return __v_cndmask_b32(0, 1, 0xFF00FF00FF00FF00 ) ? delta : -delta; }
  186.  
  187.  
  188. #define dFdxFine dFdx
  189. #define dFdyFine dFdy
  190.  
  191. #else
  192.  
  193. #define dFdx ddx
  194. #define dFdy ddy
  195. #define dFdxFine ddx_fine
  196. #define dFdyFine ddy_fine
  197.  
  198. #endif
  199.  
  200. #define mix lerp
  201. #define fract frac
  202. #define mod fmod
  203. #define saturate( V ) ( min( max( V, 0.0) , 1.0) )
  204. #define invsqrt( X ) rsqrt( X )
  205.  
  206. #endif
  207.  
  208.  
  209. // =================================================================================================
  210. // Samplers and textures
  211. // =================================================================================================
  212. #ifdef D_PLATFORM_PC
  213.  
  214. #define shadow2D( S, UV ) texture( S, UV )
  215.  
  216. #define SAMPLER2DSHADOW( NAME, REG ) uniform sampler2DShadow NAME
  217.  
  218. #define SAMPLERCUBE( NAME ) samplerCube NAME
  219. #define SAMPLERCUBEARG( NAME ) in samplerCube NAME
  220. #define SAMPLERCUBEPARAM( NAME ) NAME
  221.  
  222. #define imageAtomicAddOut( T, C, V, O ) O = imageAtomicAdd( T, C, V )
  223.  
  224. #if defined( D_TEXTURE_FEEDBACK )
  225.  
  226. #define texture2D( T, C ) Tex2dFeedback( T, T##FB, C )
  227.  
  228. #define texture2DLod( T, C, N ) Tex2dLodFeedback( T, T##FB, C, N )
  229. #define texture2DArray( T, C ) Tex2dArrayFeedback( T, T##FB, C )
  230.  
  231. #define texture3D( S, UV ) Tex3dFeedback( S, S##FB, UV )
  232. #define texture3DLod( S, UV, LOD ) Tex3dLodFeedback( S, S##FB, UV, LOD )
  233.  
  234. #define SAMPLER2DARG( NAME ) in sampler2D NAME, in int NAME##FB
  235. #define SAMPLER2DPARAM( NAME ) NAME, NAME##FB
  236.  
  237. #define SAMPLER2DARRAYARG( NAME ) in sampler2DArray NAME, in int NAME##FB
  238. #define SAMPLER2DARRAYPARAM( NAME ) NAME, NAME##FB
  239.  
  240. #define SAMPLER2D( NAME ) sampler2D NAME; int NAME##FB
  241. #define SAMPLER2DARRAY( NAME ) sampler2DArray NAME; int NAME##FB
  242. #define SAMPLER3D( NAME ) sampler3D NAME; int NAME##FB
  243. #define SAMPLER2DSHADOW_SRT( NAME ) sampler2DShadow NAME; int NAME##FB
  244.  
  245. #else
  246.  
  247. #define texture2DLod( S, UV, LOD ) textureLod( S, UV, LOD )
  248. #define texture3DLod( S, UV, LOD ) textureLod( S, UV, LOD )
  249.  
  250. #define SAMPLER2DARG( NAME ) in sampler2D NAME
  251. #define SAMPLER2DPARAM( NAME ) NAME
  252.  
  253. #define SAMPLER2DARRAYARG( NAME ) in sampler2DArray NAME
  254. #define SAMPLER2DARRAYPARAM( NAME ) NAME
  255.  
  256. #define SAMPLER2D( NAME ) sampler2D NAME
  257. #define SAMPLER2DARRAY( NAME ) sampler2DArray NAME
  258. #define SAMPLER3D( NAME ) sampler3D NAME
  259. #define SAMPLER2DSHADOW_SRT( NAME ) sampler2DShadow NAME
  260. #endif
  261.  
  262. #define textureGatherRed( lTex, lSamp ) textureGather( lTex, lSamp, 0 )
  263. #define textureGatherGreen( lTex, lSamp ) textureGather( lTex, lSamp, 1 )
  264. #define textureGatherBlue( lTex, lSamp ) textureGather( lTex, lSamp, 2 )
  265. #define textureGatherAlpha( lTex, lSamp ) textureGather( lTex, lSamp, 3 )
  266.  
  267. #define texture2DComputeGrad( T, C ) texture2D( T, C )
  268.  
  269. #elif defined(D_PLATFORM_ORBIS)
  270.  
  271. #define SAMPLERCUBE( NAME, REG ) SamplerState NAME##SS : register( s##REG ); TextureCube NAME##TU : register( t##REG )
  272.  
  273. #define SAMPLER2D( NAME ) Texture2D NAME; SamplerState NAME##SS
  274. #define SAMPLER2DSHADOW_SRT( NAME ) Texture2D NAME; SamplerComparisonState NAME##SS //SAMPLER2D( NAME )
  275. #define SAMPLER3D( NAME ) Texture3D NAME; SamplerState NAME##SS
  276.  
  277.  
  278. #define SAMPLER2DARRAY( NAME ) Texture2D_Array NAME; SamplerState NAME##SS
  279. #define SAMPLER2DARRAYARG( NAME ) Texture2D_Array NAME, SamplerState NAME##SS
  280. #define SAMPLER2DARRAYPARAM( NAME ) NAME, NAME##SS
  281.  
  282. #define SAMPLER2DPARAM( NAME ) NAME, NAME##SS
  283. #define SAMPLER2DARG( NAME ) Texture2D NAME, SamplerState NAME##SS
  284.  
  285. #define texture2D( T, C ) T.Sample( T##SS, C )
  286.  
  287. #if defined(D_PLATFORM_ORBIS_COMPUTE)
  288. #define texture2DComputeGrad( T, C ) T.SampleGradient( T##SS, C, vec2( dFdx( C ) ), vec2( dFdy( C ) ) )
  289. #define shadow2D( T, C ) T.SampleCmpLOD0( T##SS, C.xy, C.z )
  290. #else
  291. #define texture2DComputeGrad( T, C ) T.Sample( T##SS, C )
  292. #define shadow2D( T, C ) T.SampleCmp( T##SS, C.xy, C.z )
  293. #endif
  294.  
  295. #define texture2DLod( T, C, N ) T.SampleLOD( T##SS, C, N )
  296. #define texture2DArray( T, C ) T.Sample( T##SS, C )
  297. #define texture3DLod( T, C, N ) T.SampleLOD( T##SS, C, N )
  298.  
  299. //#define shadow2D( T, C ) vec3( C.z > T.Sample( T##SS, C.xy ).x ? 1.0 : 0.0 )
  300. //#define shadow2D( T, C ) T.GatherCmp( T##SS, C.xy, C.z )
  301. //#define shadow2D( T, C ) T.SampleCmpLOD0( T##SS, C.xy, C.z )
  302. #define textureCube( T, C ) T##TU.Sample( T##SS, C )
  303. #define textureCubeLod( T, C, N ) T##TU.Sample( T##SS, C, N )
  304. #define textureGrad( T, C, DDX, DDY ) T.SampleGradient( T##SS, C, DDX, DDY )
  305.  
  306. #define imageAtomicAdd( T, C, V ) AtomicAdd( T[ C ], V )
  307. #define imageAtomicAddOut( T, C, V, O ) AtomicAdd( T[ C ], V, O )
  308.  
  309. #define imageStore( T, C, V ) ( T[C] = V )
  310.  
  311. #define textureGatherRed( lTex, lSamp ) lTex.GatherRed ( lTex##SS, lSamp )
  312. #define textureGatherGreen( lTex, lSamp ) lTex.GatherGreen( lTex##SS, lSamp )
  313. #define textureGatherBlue( lTex, lSamp ) lTex.GatherBlue ( lTex##SS, lSamp )
  314. #define textureGatherAlpha( lTex, lSamp ) lTex.GatherAlpha( lTex##SS, lSamp )
  315.  
  316. #define texelFetch( lTex, lSamp, lLod ) lTex.MipMaps((lLod), (lSamp))
  317.  
  318. #endif
  319.  
  320.  
  321. #if defined(D_PLATFORM_ORBIS_COMPUTE)
  322.  
  323. #define THREADGROUP_LOCAL thread_group_memory
  324. #define THREADGROUP_BARRIER ThreadGroupMemoryBarrier()
  325.  
  326. #elif defined(D_PLATFORM_PC_COMPUTE)
  327.  
  328. #define THREADGROUP_LOCAL layout( shared )
  329. #define THREADGROUP_BARRIER groupMemoryBarrier()
  330.  
  331. #endif
  332.  
  333. // =================================================================================================
  334. // Matrices
  335. // =================================================================================================
  336. #ifdef D_PLATFORM_PC
  337.  
  338. #define MUL( INPUT_A, INPUT_B ) (INPUT_A * INPUT_B)
  339. #define PLATFORM_TRANSPOSE
  340. #define MAT4_SET_POS( M, P ) M[ 3 ] = P
  341. #define MAT4_SET_TRANSLATION( M, T ) M[ 3 ].xyz = T
  342. #define MAT4_GET_COLUMN( M, C ) M[ C ].xyz
  343. #define MAT3_GET_COLUMN( M, C ) M[ C ]
  344. #define MAT4_GET_COLUMN_VEC4( M, C ) M[ C ]
  345.  
  346. #define MAT3_SET_COLUMN( M, C, V ) M[ C ] = V;
  347. #define MAT4_SET_COLUMN( M, C, V ) M[ C ] = V;
  348.  
  349. #elif defined(D_PLATFORM_ORBIS)
  350.  
  351. #define MUL( INPUT_A, INPUT_B ) mul( INPUT_B, INPUT_A )
  352. #define PLATFORM_TRANSPOSE
  353. #define MAT4_SET_POS( M, P ) M[ 3 ] = P
  354. #define MAT4_SET_TRANSLATION( M, T ) M[ 3 ].xyz = T
  355. #define MAT4_GET_COLUMN( M, C ) M[ C ].xyz
  356. #define MAT3_GET_COLUMN( M, C ) M[ C ]
  357. #define MAT4_GET_COLUMN_VEC4( M, C ) M[ C ]
  358.  
  359. #define MAT3_SET_COLUMN( M, C, V ) M[ C ] = V;
  360. #define MAT4_SET_COLUMN( M, C, V ) M[ C ] = V;
  361.  
  362. #endif
  363.  
  364. // =================================================================================================
  365. // Arrays (workaround AMD shader compiler issues by making arrays have global scope)
  366. // =================================================================================================
  367.  
  368. #if defined(D_PLATFORM_ORBIS)
  369.  
  370. #define ARRAY_LOOKUP_FS( _UNIFORMS, _ELEMENT, _INDEX) _UNIFORMS._ELEMENT[_INDEX]
  371. #define ARRAY_LOOKUP_FP( _UNIFORMS, _ELEMENT, _INDEX) _UNIFORMS._ELEMENT[_INDEX]
  372.  
  373. #else
  374.  
  375. #define ARRAY_LOOKUP_FS( _UNIFORMS, _ELEMENT, _INDEX) _ELEMENT[_INDEX]
  376. #define ARRAY_LOOKUP_FP( _UNIFORMS, _ELEMENT, _INDEX) _ELEMENT[_INDEX]
  377.  
  378. #endif
  379.  
  380.  
  381. // =================================================================================================
  382. // Input and Output
  383. // =================================================================================================
  384. #ifdef D_PLATFORM_PC
  385.  
  386. #define UNIFORM( TYPE, NAME ) uniform TYPE NAME
  387. #define UNIFORM_SRT( TYPE, NAME ) uniform TYPE NAME
  388.  
  389. #define DECLARE_INPUT
  390. #define DECLARE_OUTPUT
  391. #define DECLARE_END
  392. #define DECLARE_PTR( TYPE, NAME ) TYPE NAME;
  393.  
  394. #define DECLARE_PATCH_INPUT_TRI
  395. #define DECLARE_PATCH_OUTPUT_TRI
  396. #define IN_PATCH_TRI_TESS_CONSTANTS
  397. #define OUT_PATCH_TRI_TESS_CONSTANTS
  398.  
  399. #define DECLARE_PATCH_INPUT_QUAD
  400. #define DECLARE_PATCH_OUTPUT_QUAD
  401. #define IN_PATCH_QUAD_TESS_CONSTANTS
  402. #define OUT_PATCH_QUAD_TESS_CONSTANTS
  403.  
  404. #if defined( D_HULL )
  405.  
  406. #define INPUT( TYPE, NAME, REG ) in TYPE NAME [];
  407. #define INPUT_NOINTERP( TYPE, NAME, REG ) flat in TYPE NAME [];
  408. #define INPUT_NOPERSP( TYPE, NAME, REG ) in TYPE NAME [];
  409.  
  410. #define PATCH_OUTPUT( TYPE, NAME, REG ) patch out TYPE NAME;
  411. #define OUTPUT( TYPE, NAME, REG ) out TYPE NAME [];
  412. #define OUTPUT_NOINTERP( TYPE, NAME, REG ) flat out TYPE NAME [];
  413. #define OUTPUT_NOPERSP( TYPE, NAME, REG ) out TYPE NAME [];
  414.  
  415. #elif defined( D_DOMAIN )
  416.  
  417. #define PATCH_INPUT( TYPE, NAME, REG ) patch in TYPE NAME;
  418. #define INPUT( TYPE, NAME, REG ) in TYPE NAME [];
  419. #define INPUT_NOINTERP( TYPE, NAME, REG ) flat in TYPE NAME [];
  420. #define INPUT_NOPERSP( TYPE, NAME, REG ) in TYPE NAME [];
  421.  
  422. #define OUTPUT( TYPE, NAME, REG ) out TYPE NAME;
  423. #define OUTPUT_NOINTERP( TYPE, NAME, REG ) flat out TYPE NAME;
  424. #define OUTPUT_NOPERSP( TYPE, NAME, REG ) out TYPE NAME;
  425.  
  426. #else
  427.  
  428. #define INPUT( TYPE, NAME, REG ) in TYPE NAME;
  429. #define INPUT_NOINTERP( TYPE, NAME, REG ) flat in TYPE NAME;
  430. #define INPUT_NOPERSP( TYPE, NAME, REG ) in TYPE NAME;
  431.  
  432. #define OUTPUT( TYPE, NAME, REG ) out TYPE NAME;
  433. #define OUTPUT_NOINTERP( TYPE, NAME, REG ) flat out TYPE NAME;
  434. #define OUTPUT_NOPERSP( TYPE, NAME, REG ) out TYPE NAME;
  435.  
  436. #endif
  437.  
  438. #define FRAGMENT_COLOUR_UVEC4_DEFINE layout(location = 0) out uvec4 outu_color0;
  439. #define FRAGMENT_COLOUR_UVEC4 outu_color0
  440.  
  441. #define FRAGMENT_COLOUR out_color0
  442. #define FRAGMENT_COLOUR0 out_color0
  443. #define FRAGMENT_COLOUR1 out_color1
  444. #define FRAGMENT_COLOUR2 out_color2
  445. #define FRAGMENT_COLOUR3 out_color3
  446. #define FRAGMENT_COLOUR4 out_color4
  447. #if defined( D_TAA_RENDER_TARGETS )
  448. #define FRAGMENT_COLOUR_VEC4_DEFINE layout(location = 0) out vec4 out_color0; layout(location = 1) out vec4 out_color1; layout(location = 2) out vec4 out_color2;
  449. #elif !defined(D_ATTRIBUTES)
  450. #define FRAGMENT_COLOUR_VEC4_DEFINE layout(location = 0) out vec4 out_color0;
  451. #else
  452. #define FRAGMENT_COLOUR_VEC4_DEFINE layout(location = 0) out vec4 out_color0; layout(location = 1) out vec4 out_color1; layout(location = 2) out vec4 out_color2; layout(location = 3) out vec4 out_color3; layout(location = 4) out vec4 out_color4;
  453. #endif
  454. #define FRAGMENT_COLOUR01_VEC4_DEFINE layout(location = 0) out vec4 out_color0; layout(location = 1) out vec4 out_color1;
  455.  
  456. #define FRAGMENT_DEPTH gl_FragDepth
  457. #define FRAGMENT_FRONTFACE gl_FrontFacing
  458. #define INPUT_FRONTFACING
  459.  
  460. #define DEREF_PTR( VAR ) VAR
  461.  
  462. #if defined( D_HULL )
  463.  
  464. #define IN( VAR ) VAR[ gl_InvocationID ]
  465. #define OUT( VAR ) VAR[ gl_InvocationID ]
  466. #define PATCH_OUT( VAR ) VAR
  467.  
  468. #define OUTPUT_VERTEX_SCREEN_POSITION gl_out[ gl_InvocationID ].gl_Position
  469. #define INPUT_VERTEX_SCREEN_POSITION gl_in [ gl_InvocationID ].gl_Position
  470.  
  471. #define TESS_LEVEL_EDGE( IND ) gl_TessLevelOuter[ IND ]
  472. #define TESS_LEVEL_INNER( IND ) gl_TessLevelInner[ IND ]
  473.  
  474. #elif defined( D_DOMAIN )
  475.  
  476. #define PATCH_IN( VAR, IND ) VAR[ IND ]
  477. #define IN( VAR, IND ) VAR[ IND ]
  478. #define OUT( VAR ) VAR
  479.  
  480. #define INPUT_VERTEX_SCREEN_POSITION( IND ) gl_in [ IND ].gl_Position
  481.  
  482. #define DOMAIN_COORDS gl_TessCoord
  483.  
  484. #elif defined( D_GEOMETRY )
  485.  
  486. #define OUTPUT_VERTEX_SCREEN_POSITION gl_Position
  487. #define INPUT_VERTEX_SCREEN_POSITION( IND ) gl_in [ IND ].gl_Position
  488. #define IN( VAR, IND ) VAR[ IND ]
  489. #define OUT( VAR ) VAR
  490.  
  491. #else
  492.  
  493. #define IN( VAR ) VAR
  494. #define OUT( VAR ) VAR
  495.  
  496. #endif
  497.  
  498. #define OUT_VERTEX_SCREEN_POSITION
  499. #define IN_SCREEN_POSITION
  500.  
  501. #define VERTEX_SCREEN_POSITION gl_Position
  502.  
  503. #elif defined(D_PLATFORM_ORBIS_COMPUTE)
  504.  
  505. #define DECLARE_INPUT struct cInput {
  506. #define DECLARE_END };
  507. #define DECLARE_PTR( TYPE, NAME ) TYPE* NAME;
  508.  
  509. #define INPUT( TYPE, NAME, REG ) TYPE NAME : REG;
  510. #define INPUT_NOINTERP( TYPE, NAME, REG ) TYPE NAME : REG;
  511.  
  512. #define IN_SCREEN_POSITION
  513.  
  514. #define FRAGMENT_COLOUR lUniforms.mpCmpOutPerMesh.gOutTexture0[dispatchThreadID.xy]
  515. #define FRAGMENT_COLOUR0 lUniforms.mpCmpOutPerMesh.gOutTexture0[dispatchThreadID.xy]
  516. #define FRAGMENT_COLOUR1 lUniforms.mpCmpOutPerMesh.gOutTexture1[dispatchThreadID.xy]
  517. #define FRAGMENT_COLOUR2 lUniforms.mpCmpOutPerMesh.gOutTexture2[dispatchThreadID.xy]
  518. #define FRAGMENT_COLOUR3 lUniforms.mpCmpOutPerMesh.gOutTexture3[dispatchThreadID.xy]
  519. #define FRAGMENT_COLOUR4 lUniforms.mpCmpOutPerMesh.gOutTexture4[dispatchThreadID.xy]
  520. #define FRAGMENT_DEPTH lUniforms.mpCmpOutPerMesh.gOutTextureDepth[dispatchThreadID.xy]
  521.  
  522. #define DEREF_PTR( VAR ) *VAR
  523.  
  524. #elif defined(D_PLATFORM_ORBIS)
  525.  
  526. #define UNIFORM( TYPE, NAME ) ConstantBuffer NAME##CB{ TYPE NAME; };
  527. #define UNIFORM_SRT( TYPE, NAME ) ConstantBuffer NAME##CB{ TYPE NAME : S_SRT_DATA; };
  528.  
  529. #define DECLARE_OUTPUT struct cOutput {
  530. #define DECLARE_INPUT struct cInput {
  531. #define DECLARE_END };
  532. #define DECLARE_PTR( TYPE, NAME ) TYPE* NAME;
  533.  
  534. #define INPUT( TYPE, NAME, REG ) TYPE NAME : REG;
  535. #define INPUT_NOINTERP( TYPE, NAME, REG ) nointerp TYPE NAME : REG;
  536. #define INPUT_NOPERSP( TYPE, NAME, REG ) nopersp TYPE NAME : REG;
  537.  
  538. #define OUTPUT( TYPE, NAME, REG ) TYPE NAME : REG;
  539. #define OUTPUT_NOINTERP( TYPE, NAME, REG ) nointerp TYPE NAME : REG;
  540. #define OUTPUT_NOPERSP( TYPE, NAME, REG ) nopersp TYPE NAME : REG;
  541.  
  542. #define FRAGMENT_COLOUR_UVEC4_DEFINE
  543. #define FRAGMENT_COLOUR_UVEC4 Out.mColour
  544. #define FRAGMENT_COLOUR Out.mColour
  545. #define FRAGMENT_COLOUR0 Out.mColour0
  546. #define FRAGMENT_COLOUR1 Out.mColour1
  547. #define FRAGMENT_COLOUR2 Out.mColour2
  548. #define FRAGMENT_COLOUR3 Out.mColour3
  549. #define FRAGMENT_COLOUR4 Out.mColour4
  550. #define FRAGMENT_DEPTH Out.mDepth
  551.  
  552. #define FRAGMENT_FRONTFACE In.mbFrontFacing
  553. #define INPUT_FRONTFACING bool mbFrontFacing : S_FRONT_FACE;
  554.  
  555. #if defined( D_HULL )
  556.  
  557. #define IN( VAR ) In[ uCPID ].VAR
  558. #define OUT( VAR ) Out.VAR
  559. #define PATCH_OUT( VAR ) Out.VAR
  560.  
  561. #define OUTPUT_VERTEX_SCREEN_POSITION OUT( mScreenPositionVec4 )
  562. #define INPUT_VERTEX_SCREEN_POSITION IN( mScreenPositionVec4 )
  563.  
  564. #define TESS_LEVEL_EDGE( IND ) Out.edge_ts[ IND ]
  565. #define TESS_LEVEL_INNER( IND ) Out.insi_ts[ IND ]
  566.  
  567. #define DECLARE_PATCH_OUTPUT_TRI [DOMAIN_PATCH_TYPE("tri")] struct HSConstantOutputData {
  568. #define OUT_PATCH_TRI_TESS_CONSTANTS float edge_ts[3] : S_EDGE_TESS_FACTOR; \
  569. float insi_ts[1] : S_INSIDE_TESS_FACTOR;
  570.  
  571. #define DECLARE_PATCH_OUTPUT_QUAD [DOMAIN_PATCH_TYPE("quad")] struct HSConstantOutputData (
  572. #define OUT_PATCH_QUAD_TESS_CONSTANTS float edge_ts[4] : S_EDGE_TESS_FACTOR; \
  573. float insi_ts[2] : S_INSIDE_TESS_FACTOR;
  574.  
  575. #define PATCH_OUTPUT( TYPE, NAME, REG ) TYPE NAME : REG;
  576.  
  577. #elif defined( D_DOMAIN )
  578.  
  579. #define PATCH_IN( VAR, IND ) patchIn.VAR
  580. #define IN( VAR, IND ) In[ IND ].VAR
  581. #define OUT( VAR ) Out.VAR
  582.  
  583. #define OUTPUT_VERTEX_SCREEN_POSITION OUT( mScreenPositionVec4 )
  584. #define INPUT_VERTEX_SCREEN_POSITION( IND ) IN( mScreenPositionVec4, IND )
  585.  
  586. #define DOMAIN_COORDS domainCoordinates
  587.  
  588. #define DECLARE_PATCH_INPUT_TRI [DOMAIN_PATCH_TYPE("tri")] struct HSConstantOutputData {
  589. #define IN_PATCH_TRI_TESS_CONSTANTS float edge_ts[3] : S_EDGE_TESS_FACTOR; \
  590. float insi_ts[1] : S_INSIDE_TESS_FACTOR;
  591.  
  592. #define DECLARE_PATCH_INPUT_QUAD [DOMAIN_PATCH_TYPE("quad")] struct HSConstantOutputData {
  593. #define IN_PATCH_QUAD_TESS_CONSTANTS float edge_ts[4] : S_EDGE_TESS_FACTOR; \
  594. float insi_ts[2] : S_INSIDE_TESS_FACTOR;
  595.  
  596. #define PATCH_INPUT( TYPE, NAME, REG ) TYPE NAME : REG;
  597.  
  598. #elif defined( D_GEOMETRY )
  599.  
  600. #define IN( VAR, IND ) In[ IND ].VAR
  601. #define OUT( VAR ) Out.VAR
  602.  
  603. #define OUTPUT_VERTEX_SCREEN_POSITION OUT( mScreenPositionVec4 )
  604. #define INPUT_VERTEX_SCREEN_POSITION( IND ) IN( mScreenPositionVec4, IND )
  605.  
  606. #define EMIT_VERTEX TriStream.Append( Out )
  607. #define END_PRIMITIVE TriStream.RestartStrip()
  608.  
  609. #else
  610.  
  611. #define IN( VAR ) In.VAR
  612. #define OUT( VAR ) Out.VAR
  613.  
  614. #endif
  615.  
  616.  
  617. // TODO get rid of this - don't pass struct through functinos, pass members.
  618. #define DEREF_PTR( VAR ) *VAR
  619.  
  620.  
  621. #define OUT_VERTEX_SCREEN_POSITION OUTPUT( vec4, mScreenPositionVec4, S_POSITION )
  622. #define IN_SCREEN_POSITION INPUT ( vec4, mScreenPositionVec4, S_POSITION )
  623. #define VERTEX_SCREEN_POSITION OUT( mScreenPositionVec4 )
  624.  
  625. #endif
  626.  
  627. // =================================================================================================
  628. // Main
  629. // =================================================================================================
  630. #ifdef D_PLATFORM_PC
  631.  
  632. #define VERTEX_MAIN void main( void )
  633. #define VERTEX_MAIN_SRT uniform UniformBuffer lUniforms; void main( void )
  634.  
  635. #define HULL_TRI_MAIN_SRT layout( vertices = 3 ) out; uniform UniformBuffer lUniforms; void main( void )
  636. #define HULL_QUAD_MAIN_SRT layout( vertices = 4 ) out; uniform UniformBuffer lUniforms; void main( void )
  637.  
  638. #define DOMAIN_TRI_MAIN_SRT layout( triangles, fractional_even_spacing ) in; uniform UniformBuffer lUniforms; void main( void )
  639. #define DOMAIN_QUAD_MAIN_SRT layout( quads, fractional_even_spacing ) in; uniform UniformBuffer lUniforms; void main( void )
  640.  
  641. #define FRAGMENT_MAIN_COLOUR FRAGMENT_COLOUR_VEC4_DEFINE void main( void )
  642. #define VOID_MAIN_COLOUR FRAGMENT_COLOUR_VEC4_DEFINE void main( void )
  643. #define FRAGMENT_MAIN_COLOUR_DEPTH FRAGMENT_COLOUR_VEC4_DEFINE void main( void )
  644.  
  645. #define FRAGMENT_MAIN_COLOUR_DEPTH_SRT FRAGMENT_COLOUR_VEC4_DEFINE uniform UniformBuffer lUniforms; void main( void )
  646. #define FRAGMENT_MAIN_COLOUR_DEPTH_GE_SRT FRAGMENT_COLOUR_VEC4_DEFINE uniform UniformBuffer lUniforms; void main( void )
  647. #define FRAGMENT_MAIN_COLOUR_DEPTH_LE_SRT FRAGMENT_COLOUR_VEC4_DEFINE uniform UniformBuffer lUniforms; void main( void )
  648. #define FRAGMENT_MAIN_COLOUR_SRT FRAGMENT_COLOUR_VEC4_DEFINE uniform UniformBuffer lUniforms; void main( void )
  649. #define FRAGMENT_MAIN_COLOUR_EARLYZ_SRT FRAGMENT_COLOUR_VEC4_DEFINE uniform UniformBuffer lUniforms; void main( void )
  650. #define FRAGMENT_MAIN_UICOLOUR_SRT FRAGMENT_COLOUR_UVEC4_DEFINE uniform UniformBuffer lUniforms; void main( void )
  651.  
  652. #define VOID_MAIN_SRT FRAGMENT_COLOUR_VEC4_DEFINE uniform UniformBuffer lUniforms; void main( void )
  653. #define VOID_MAIN_DEPTH_SRT FRAGMENT_COLOUR_VEC4_DEFINE uniform UniformBuffer lUniforms; void main( void )
  654.  
  655. #define FRAGMENT_MAIN_COLOUR01_SRT FRAGMENT_COLOUR01_VEC4_DEFINE uniform UniformBuffer lUniforms; void main( void )
  656. #define FRAGMENT_MAIN_COLOUR01_DEPTH_SRT FRAGMENT_COLOUR01_VEC4_DEFINE uniform UniformBuffer lUniforms; void main( void )
  657.  
  658. #elif defined( D_PLATFORM_PC_COMPUTE )
  659.  
  660. #define COMPUTE_MAIN_SRT( X, Y, Z ) layout (local_size_x = X, local_size_y = Y, local_size_z = Z) in; void main( void )
  661.  
  662. #define FRAGMENT_MAIN_COLOUR_SRT COMPUTE_MAIN_SRT( 8,8,1 )
  663. #define FRAGMENT_MAIN_COLOUR01_SRT COMPUTE_MAIN_SRT( 8,8,1 )
  664. #define FRAGMENT_MAIN_COLOUR_DEPTH_SRT COMPUTE_MAIN_SRT( 8,8,1 )
  665.  
  666. #elif defined( D_PLATFORM_ORBIS_COMPUTE )
  667.  
  668. #define COMPUTE_MAIN_SRT( X, Y, Z ) [NUM_THREADS(X, Y, Z)] void main(uint3 groupID : S_GROUP_ID, uint3 groupThreadID : S_GROUP_THREAD_ID, uint3 dispatchThreadID : S_DISPATCH_THREAD_ID, UniformBuffer lUniforms : S_SRT_DATA)
  669.  
  670. #define FRAGMENT_MAIN_COLOUR_SRT COMPUTE_MAIN_SRT( 8,8,1 )
  671. #define FRAGMENT_MAIN_COLOUR01_SRT COMPUTE_MAIN_SRT( 8,8,1 )
  672. #define FRAGMENT_MAIN_COLOUR_DEPTH_SRT COMPUTE_MAIN_SRT( 8,8,1 )
  673.  
  674. #elif defined( D_PLATFORM_ORBIS )
  675.  
  676. #define VERTEX_MAIN void main( cInput In, out cOutput Out )
  677. #define VERTEX_MAIN_SRT void main( cInput In, out cOutput Out, UniformBuffer lUniforms : S_SRT_DATA )
  678.  
  679. #define HULL_TRI_MAIN_SRT [DOMAIN_PATCH_TYPE("tri")] \
  680. [PARTITIONING_TYPE("integer")] \
  681. [OUTPUT_TOPOLOGY_TYPE("triangle_cw")] \
  682. [OUTPUT_CONTROL_POINTS(3)] \
  683. [PATCH_CONSTANT_FUNC("ConstantsHS")] \
  684. [MAX_TESS_FACTOR(16.0)] \
  685. void main( \
  686. InputPatch<cInput, 3> In, \
  687. uint uCPID : S_OUTPUT_CONTROL_POINT_ID, \
  688. UniformBuffer lUniforms : S_SRT_DATA, \
  689. out cOutput Out )
  690.  
  691. #define HULL_QUAD_MAIN_SRT [DOMAIN_PATCH_TYPE("quad")] \
  692. [PARTITIONING_TYPE("integer")] \
  693. [OUTPUT_TOPOLOGY_TYPE("triangle_cw")] \
  694. [OUTPUT_CONTROL_POINTS(4)] \
  695. [PATCH_CONSTANT_FUNC("ConstantsHS")] \
  696. [MAX_TESS_FACTOR(16.0)] \
  697. void main( \
  698. InputPatch<cInput, 4> In, \
  699. uint uCPID : S_OUTPUT_CONTROL_POINT_ID, \
  700. UniformBuffer lUniforms : S_SRT_DATA, \
  701. out cOutput Out )
  702.  
  703.  
  704. #define DOMAIN_TRI_MAIN_SRT [DOMAIN_PATCH_TYPE("tri")] \
  705. void main( \
  706. HSConstantOutputData patchIn, \
  707. const OutputPatch<cInput, 3> In, \
  708. out cOutput Out, \
  709. UniformBuffer lUniforms : S_SRT_DATA, \
  710. float3 domainCoordinates : S_DOMAIN_LOCATION )
  711.  
  712. #define DOMAIN_QUAD_MAIN_SRT [DOMAIN_PATCH_TYPE("quad")] \
  713. void main( \
  714. HSConstantOutputData patchIn, \
  715. const OutputPatch<cInput, 4> In, \
  716. out cOutput Out, \
  717. UniformBuffer lUniforms : S_SRT_DATA, \
  718. float2 domainCoordinates : S_DOMAIN_LOCATION )
  719.  
  720. #define GEOMETRY_MAIN_SRT( MAX_VERTS ) cOutput Out; [MAX_VERTEX_COUNT(MAX_VERTS)] void main( inout TriangleBuffer<cOutput> TriStream, Triangle cInput In[3], UniformBuffer lUniforms : S_SRT_DATA )
  721.  
  722.  
  723. #define FRAGMENT_MAIN_COLOUR struct cOutput { vec4 mColour : S_TARGET_OUTPUT; }; [RE_Z] void main( cInput In, out cOutput Out )
  724. #define VOID_MAIN_COLOUR struct cOutput { vec4 mColour : S_TARGET_OUTPUT; }; void main( cInput In, out cOutput Out )
  725. #define FRAGMENT_MAIN_COLOUR_DEPTH struct cOutput { vec4 mColour : S_TARGET_OUTPUT; float mDepth : S_DEPTH_OUTPUT; }; [RE_Z] void main( cInput In, out cOutput Out )
  726. #define VOID_MAIN_SRT void main( cInput In, UniformBuffer lUniforms : S_SRT_DATA )
  727.  
  728. #if defined( D_TAA_RENDER_TARGETS )
  729.  
  730. #define FRAGMENT_MAIN_COLOUR_SRT struct cOutput { vec4 mColour0 : S_TARGET_OUTPUT0; \
  731. vec4 mColour1 : S_TARGET_OUTPUT1; \
  732. vec4 mColour2 : S_TARGET_OUTPUT2; }; \
  733. [RE_Z] void main( cInput In, out cOutput Out, UniformBuffer lUniforms : S_SRT_DATA )
  734.  
  735.  
  736. #elif !defined( D_ATTRIBUTES )
  737. #define FRAGMENT_MAIN_COLOUR_DEPTH_SRT struct cOutput { vec4 mColour : S_TARGET_OUTPUT; float mDepth : S_DEPTH_OUTPUT; }; [RE_Z] void main( cInput In, out cOutput Out, UniformBuffer lUniforms : S_SRT_DATA )
  738. #define FRAGMENT_MAIN_COLOUR_DEPTH_GE_SRT struct cOutput { vec4 mColour : S_TARGET_OUTPUT; float mDepth : S_DEPTH_GE_OUTPUT; }; [RE_Z] void main( cInput In, out cOutput Out, UniformBuffer lUniforms : S_SRT_DATA )
  739. #define FRAGMENT_MAIN_COLOUR_DEPTH_LE_SRT struct cOutput { vec4 mColour : S_TARGET_OUTPUT; float mDepth : S_DEPTH_LE_OUTPUT; }; [RE_Z] void main( cInput In, out cOutput Out, UniformBuffer lUniforms : S_SRT_DATA )
  740. #define FRAGMENT_MAIN_COLOUR_SRT struct cOutput { vec4 mColour : S_TARGET_OUTPUT; }; void main( cInput In, out cOutput Out, UniformBuffer lUniforms : S_SRT_DATA )
  741. #define VOID_MAIN_DEPTH_SRT struct cOutput { float mDepth : S_DEPTH_OUTPUT; }; [RE_Z] void main( cInput In, out cOutput Out, UniformBuffer lUniforms : S_SRT_DATA )
  742. #define VOID_MAIN_COLOUR_EARLYZ_SRT [FORCE_EARLY_DEPTH_STENCIL] void main( cInput In, UniformBuffer lUniforms : S_SRT_DATA )
  743.  
  744. #define FRAGMENT_MAIN_COLOUR01_SRT struct cOutput { vec4 mColour0 : S_TARGET_OUTPUT0; \
  745. vec4 mColour1 : S_TARGET_OUTPUT1; }; \
  746. [RE_Z] void main( cInput In, out cOutput Out, UniformBuffer lUniforms : S_SRT_DATA )
  747. #define FRAGMENT_MAIN_COLOUR01_DEPTH_SRT struct cOutput { vec4 mColour0 : S_TARGET_OUTPUT0; \
  748. vec4 mColour1 : S_TARGET_OUTPUT1; \
  749. float mDepth : S_DEPTH_OUTPUT; }; \
  750. [RE_Z] void main( cInput In, out cOutput Out, UniformBuffer lUniforms : S_SRT_DATA )
  751.  
  752. #else
  753.  
  754. // #pragma PSSL_target_output_format(target 1 FMT_32_AR)
  755.  
  756. #define FRAGMENT_MAIN_COLOUR_DEPTH_SRT struct cOutput { vec4 mColour0 : S_TARGET_OUTPUT0; \
  757. vec4 mColour1 : S_TARGET_OUTPUT1; \
  758. vec4 mColour2 : S_TARGET_OUTPUT2; \
  759. vec4 mColour3 : S_TARGET_OUTPUT3; \
  760. float mDepth : S_DEPTH_OUTPUT; }; \
  761. [RE_Z] void main( cInput In, out cOutput Out, UniformBuffer lUniforms : S_SRT_DATA )
  762.  
  763. #define FRAGMENT_MAIN_COLOUR_SRT struct cOutput { vec4 mColour0 : S_TARGET_OUTPUT0; \
  764. vec4 mColour1 : S_TARGET_OUTPUT1; \
  765. vec4 mColour2 : S_TARGET_OUTPUT2; \
  766. vec4 mColour3 : S_TARGET_OUTPUT3; }; \
  767. [RE_Z] void main( cInput In, out cOutput Out, UniformBuffer lUniforms : S_SRT_DATA )
  768.  
  769. #define FRAGMENT_MAIN_COLOUR_EARLYZ_SRT struct cOutput { vec4 mColour0 : S_TARGET_OUTPUT0; \
  770. vec4 mColour1 : S_TARGET_OUTPUT1; \
  771. vec4 mColour2 : S_TARGET_OUTPUT2; \
  772. vec4 mColour3 : S_TARGET_OUTPUT3; }; \
  773. [FORCE_EARLY_DEPTH_STENCIL] void main( cInput In, out cOutput Out, UniformBuffer lUniforms : S_SRT_DATA )
  774. #endif
  775.  
  776.  
  777. #endif
  778.  
  779. // =================================================================================================
  780. // Texture resolution
  781. // =================================================================================================
  782.  
  783. #ifdef D_PLATFORM_ORBIS
  784. uvec2 GetResolution( Texture2D lTexture )
  785. {
  786. uvec2 lResolution;
  787. lTexture.GetDimensionsFast(lResolution.x, lResolution.y);
  788. return lResolution;
  789. }
  790.  
  791. uvec2 GetResolution( RW_Texture2D<float4> lTexture )
  792. {
  793. uvec2 lResolution;
  794. lTexture.GetDimensionsFast(lResolution.x, lResolution.y);
  795. return lResolution;
  796. }
  797. #else
  798. uvec2 GetResolution( sampler2D lTexture )
  799. {
  800. return textureSize( lTexture, 0 );
  801. }
  802. #endif
  803.  
  804. // =================================================================================================
  805. // Viewport
  806. // =================================================================================================
  807. #ifdef D_PLATFORM_PC
  808.  
  809. #define SCREENSPACE_AS_RENDERTARGET_UVS( A ) A.xy
  810.  
  811. #elif defined(D_PLATFORM_ORBIS)
  812.  
  813. #define SCREENSPACE_AS_RENDERTARGET_UVS( A ) ( float2( A.x, 1.0 - A.y ) )
  814.  
  815. #endif
  816.  
  817. #ifdef D_USING_LOGDEPTH
  818.  
  819. #define D_DEPTH_CLEARVALUE (1.0)
  820.  
  821. #else
  822.  
  823. #define D_DEPTH_CLEARVALUE (0.0)
  824.  
  825. #endif
  826.  
  827. // =================================================================================================
  828. // Texture usage feedback
  829. // =================================================================================================
  830. #if defined( D_TEXTURE_FEEDBACK ) && defined( D_PLATFORM_PC )
  831.  
  832. layout(r32i) uniform iimage2D gTexFeedbackImg;
  833.  
  834. void WriteTexFeedback( in int liCounter, in float liMip )
  835. {
  836. if( liCounter != 0 )
  837. {
  838. #if defined( GL_ARB_shader_ballot ) && ( GL_ARB_shader_ballot == 1 )
  839. if( readFirstInvocationARB( gl_SubGroupInvocationARB ) == gl_SubGroupInvocationARB )
  840. #endif
  841. {
  842. int liIntMip = int(floor(liMip));
  843. //imageStore( gTexFeedbackImg, ivec2( liCounter, liIntMip ), ivec4(1,0,0,0) );
  844. imageAtomicAdd( gTexFeedbackImg, ivec2( liCounter, liIntMip ), int(1) );
  845. }
  846. }
  847. }
  848.  
  849. vec4 Tex2dFeedback( in sampler2D lSamp, in int liCounter, in vec2 lCoords )
  850. {
  851. float liLod = textureQueryLOD( lSamp, lCoords ).x;
  852. WriteTexFeedback( liCounter, liLod );
  853. return texture( lSamp, lCoords );
  854. }
  855.  
  856. vec4 Tex2dLodFeedback( in sampler2D lSamp, in int liCounter, in vec2 lCoords, in float liLod )
  857. {
  858. WriteTexFeedback( liCounter, liLod );
  859. return textureLod( lSamp, lCoords, liLod );
  860. }
  861.  
  862. vec4 Tex2dArrayFeedback( in sampler2DArray lSamp, in int liCounter, in vec3 lCoords )
  863. {
  864. float liLod = textureQueryLOD( lSamp, lCoords.xy ).x;
  865. WriteTexFeedback( liCounter, liLod );
  866. return texture( lSamp, lCoords );
  867. }
  868.  
  869. vec4 Tex3dFeedback( in sampler3D lSamp, in int liCounter, in vec3 lCoords )
  870. {
  871. float liLod = textureQueryLOD( lSamp, lCoords ).x;
  872. WriteTexFeedback( liCounter, liLod );
  873. return texture( lSamp, lCoords );
  874. }
  875.  
  876. vec4 Tex3dLodFeedback( in sampler3D lSamp, in int liCounter, in vec3 lCoords, in float liLod )
  877. {
  878. WriteTexFeedback( liCounter, liLod );
  879. return textureLod( lSamp, lCoords, liLod );
  880. }
  881.  
  882.  
  883. #endif
  884.  
  885. #endif
  886. ////////////////////////////////////////////////////////////////////////////////
  887. ///
  888. /// @file CommonUniforms.h
  889. /// @author User
  890. /// @date
  891. ///
  892. /// @brief CommonUniforms
  893. ///
  894. /// Copyright (c) 2008 Hello Games Ltd. All Rights Reserved.
  895. ///
  896. ////////////////////////////////////////////////////////////////////////////////
  897.  
  898.  
  899. #ifndef D_COMMONUNIFORMS2_H
  900. #define D_COMMONUNIFORMS2_H
  901.  
  902. // =================================================================================================
  903.  
  904. #ifndef D_DEFINES
  905. #define D_DEFINES
  906.  
  907.  
  908. // =================================================================================================
  909. // Platform defines
  910. // =================================================================================================
  911. #ifdef D_PLATFORM_PC
  912.  
  913. #define D_ENABLE_REVERSEZ_PROJECTION (1)
  914.  
  915. #pragma optionNV(strict on)
  916. #extension GL_ARB_gpu_shader5 : enable
  917. #extension GL_ARB_fragment_coord_conventions : enable
  918. #extension GL_ARB_derivative_control : enable
  919.  
  920.  
  921. #if defined( D_FRAGMENT ) && defined( _F64_ )
  922.  
  923. layout(early_fragment_tests) in;
  924.  
  925. #endif
  926.  
  927. #elif defined(D_PLATFORM_ORBIS)
  928.  
  929. #define D_ENABLE_REVERSEZ_PROJECTION (1)
  930.  
  931. // use this with sdk 2.0 compiler
  932. // #pragma argument (allow-scratch-buffer-spill)
  933.  
  934. //define these flags so they don't get ignored in build process and in the comb mask
  935. //this is because materials, vertex layouts and shaders need to be synced on 360 to avoid patching
  936. #ifdef _F27_
  937. #endif
  938. #ifdef _F28_
  939. #endif
  940. #ifdef _F29_
  941. #endif
  942. #ifdef _F21_
  943. #endif
  944. #ifdef _F02_
  945. #endif
  946. #ifdef _F03_
  947. #endif
  948. #if defined( _F01_ ) || defined( D_LOD0 ) || defined( D_LOD1 ) || defined( D_LOD2 ) || defined( D_LOD3) || defined( D_LOD4 )
  949. #endif
  950. #ifdef _F01_
  951. #endif
  952. #ifdef _F09_
  953. #endif
  954. #ifdef _F10_
  955. #endif
  956.  
  957.  
  958. // disable warnings for unused parameters. This happens a lot because of defining different things.
  959. #pragma warning (disable: 5203)
  960.  
  961. // temp thing to know what things are still required on ps4.
  962. #define D_PLATFORM_ORBIS_FIX
  963.  
  964. #ifdef __PSSL_CS__
  965. #define D_PLATFORM_ORBIS_COMPUTE
  966. #endif
  967.  
  968. #ifdef __PSSL_HS__
  969. #define D_HULL
  970. #endif
  971.  
  972. #ifdef __PSSL_DS__
  973. #define D_DOMAIN
  974. #endif
  975.  
  976. #ifdef __PSSL_VS__
  977. #define D_VERTEX
  978. #endif
  979.  
  980. #ifdef __PSSL_GS__
  981. #define D_GEOMETRY
  982. #endif
  983.  
  984. #endif
  985.  
  986. #if !D_ENABLE_REVERSEZ_PROJECTION
  987. #define D_USING_LOGDEPTH
  988. #endif
  989.  
  990.  
  991. // =================================================================================================
  992. // Basic Types
  993. // =================================================================================================
  994. #ifdef D_PLATFORM_PC
  995.  
  996. #define JOINT_TYPE vec4
  997.  
  998. //#define CONST const
  999. #define STATIC_CONST const
  1000.  
  1001. #elif defined(D_PLATFORM_ORBIS)
  1002.  
  1003. #define JOINT_TYPE int4
  1004. #define float float
  1005. #define vec2 float2
  1006. #define vec3 float3
  1007. #define vec4 float4
  1008. #define ivec2 int2
  1009. #define ivec3 int3
  1010. #define ivec4 int4
  1011. #define uvec2 uint2
  1012. #define uvec3 uint3
  1013. #define uvec4 uint4
  1014. // NOTE:
  1015. // operator[] accesses rows, not columns
  1016. // matrix constructors interpret the passed vectors as row vectors, not column vectors
  1017. #define mat2 row_major float2x2
  1018. #define mat3 row_major float3x3
  1019. #define mat4 row_major float4x4
  1020.  
  1021. //#define CONST
  1022. #define STATIC_CONST static const
  1023. // #define const ERROR, DON'T USE CONST FOR PS4. USE STATIC_CONST INSTEAD FOR A COMPILED IN CONSTANT. OTHERWISE IT TRIES TO PUT IT IN A CONSTANT BUFFER AND FOR SOME REASON IT DOESN'T WORK.
  1024.  
  1025.  
  1026. #endif
  1027.  
  1028. // =================================================================================================
  1029. // Functions
  1030. // =================================================================================================
  1031. #ifdef D_PLATFORM_PC
  1032.  
  1033. #define saturate( V ) min( max( V, 0.0) , 1.0)
  1034. #define atan2( Y, X ) atan( Y, X )
  1035. #define invsqrt( X ) inversesqrt( X )
  1036.  
  1037. #ifdef D_COMPUTE
  1038.  
  1039. #define groupID gl_WorkGroupID
  1040. #define groupThreadID gl_LocalInvocationID
  1041. #define dispatchThreadID gl_GlobalInvocationID
  1042.  
  1043. #endif
  1044.  
  1045. #elif defined(D_PLATFORM_ORBIS)
  1046.  
  1047. #if defined(D_PLATFORM_ORBIS_COMPUTE)
  1048.  
  1049. float dFdx( float var ) { float delta = var - LaneSwizzle( var, 0x1f, 0, 1 ); return __v_cndmask_b32(0, 1, 0xAAAAAAAAAAAAAAAA ) ? delta : -delta; }
  1050. float dFdy( float var ) { float delta = var - LaneSwizzle( var, 0x1f, 0, 8 ); return __v_cndmask_b32(0, 1, 0xFF00FF00FF00FF00 ) ? delta : -delta; }
  1051.  
  1052. vec2 dFdx( vec2 var ) { vec2 delta = vec2( var.x - LaneSwizzle( var.x, 0x1f, 0, 1 ), var.y - LaneSwizzle( var.y, 0x1f, 0, 1 ) ); return __v_cndmask_b32(0, 1, 0xAAAAAAAAAAAAAAAA ) ? delta : -delta; }
  1053. vec2 dFdy( vec2 var ) { vec2 delta = vec2( var.x - LaneSwizzle( var.x, 0x1f, 0, 8 ), var.y - LaneSwizzle( var.y, 0x1f, 0, 8 ) ); return __v_cndmask_b32(0, 1, 0xFF00FF00FF00FF00 ) ? delta : -delta; }
  1054.  
  1055. vec3 dFdx( vec3 var ) { vec3 delta = vec3( var.x - LaneSwizzle( var.x, 0x1f, 0, 1 ), var.y - LaneSwizzle( var.y, 0x1f, 0, 1 ), var.z - LaneSwizzle( var.z, 0x1f, 0, 1 ) ); return __v_cndmask_b32(0, 1, 0xAAAAAAAAAAAAAAAA ) ? delta : -delta; }
  1056. vec3 dFdy( vec3 var ) { vec3 delta = vec3( var.x - LaneSwizzle( var.x, 0x1f, 0, 8 ), var.y - LaneSwizzle( var.y, 0x1f, 0, 8 ), var.z - LaneSwizzle( var.z, 0x1f, 0, 8 ) ); return __v_cndmask_b32(0, 1, 0xFF00FF00FF00FF00 ) ? delta : -delta; }
  1057.  
  1058. vec4 dFdx( vec4 var ) { vec4 delta = vec4( var.x - LaneSwizzle( var.x, 0x1f, 0, 1 ), var.y - LaneSwizzle( var.y, 0x1f, 0, 1 ), var.z - LaneSwizzle( var.z, 0x1f, 0, 1 ), var.z - LaneSwizzle( var.w, 0x1f, 0, 1 ) ); return __v_cndmask_b32(0, 1, 0xAAAAAAAAAAAAAAAA ) ? delta : -delta; }
  1059. vec4 dFdy( vec4 var ) { vec4 delta = vec4( var.x - LaneSwizzle( var.x, 0x1f, 0, 8 ), var.y - LaneSwizzle( var.y, 0x1f, 0, 8 ), var.z - LaneSwizzle( var.z, 0x1f, 0, 8 ), var.z - LaneSwizzle( var.w, 0x1f, 0, 8 ) ); return __v_cndmask_b32(0, 1, 0xFF00FF00FF00FF00 ) ? delta : -delta; }
  1060.  
  1061.  
  1062. #define dFdxFine dFdx
  1063. #define dFdyFine dFdy
  1064.  
  1065. #else
  1066.  
  1067. #define dFdx ddx
  1068. #define dFdy ddy
  1069. #define dFdxFine ddx_fine
  1070. #define dFdyFine ddy_fine
  1071.  
  1072. #endif
  1073.  
  1074. #define mix lerp
  1075. #define fract frac
  1076. #define mod fmod
  1077. #define saturate( V ) ( min( max( V, 0.0) , 1.0) )
  1078. #define invsqrt( X ) rsqrt( X )
  1079.  
  1080. #endif
  1081.  
  1082.  
  1083. // =================================================================================================
  1084. // Samplers and textures
  1085. // =================================================================================================
  1086. #ifdef D_PLATFORM_PC
  1087.  
  1088. #define shadow2D( S, UV ) texture( S, UV )
  1089.  
  1090. #define SAMPLER2DSHADOW( NAME, REG ) uniform sampler2DShadow NAME
  1091.  
  1092. #define SAMPLERCUBE( NAME ) samplerCube NAME
  1093. #define SAMPLERCUBEARG( NAME ) in samplerCube NAME
  1094. #define SAMPLERCUBEPARAM( NAME ) NAME
  1095.  
  1096. #define imageAtomicAddOut( T, C, V, O ) O = imageAtomicAdd( T, C, V )
  1097.  
  1098. #if defined( D_TEXTURE_FEEDBACK )
  1099.  
  1100. #define texture2D( T, C ) Tex2dFeedback( T, T##FB, C )
  1101.  
  1102. #define texture2DLod( T, C, N ) Tex2dLodFeedback( T, T##FB, C, N )
  1103. #define texture2DArray( T, C ) Tex2dArrayFeedback( T, T##FB, C )
  1104.  
  1105. #define texture3D( S, UV ) Tex3dFeedback( S, S##FB, UV )
  1106. #define texture3DLod( S, UV, LOD ) Tex3dLodFeedback( S, S##FB, UV, LOD )
  1107.  
  1108. #define SAMPLER2DARG( NAME ) in sampler2D NAME, in int NAME##FB
  1109. #define SAMPLER2DPARAM( NAME ) NAME, NAME##FB
  1110.  
  1111. #define SAMPLER2DARRAYARG( NAME ) in sampler2DArray NAME, in int NAME##FB
  1112. #define SAMPLER2DARRAYPARAM( NAME ) NAME, NAME##FB
  1113.  
  1114. #define SAMPLER2D( NAME ) sampler2D NAME; int NAME##FB
  1115. #define SAMPLER2DARRAY( NAME ) sampler2DArray NAME; int NAME##FB
  1116. #define SAMPLER3D( NAME ) sampler3D NAME; int NAME##FB
  1117. #define SAMPLER2DSHADOW_SRT( NAME ) sampler2DShadow NAME; int NAME##FB
  1118.  
  1119. #else
  1120.  
  1121. #define texture2DLod( S, UV, LOD ) textureLod( S, UV, LOD )
  1122. #define texture3DLod( S, UV, LOD ) textureLod( S, UV, LOD )
  1123.  
  1124. #define SAMPLER2DARG( NAME ) in sampler2D NAME
  1125. #define SAMPLER2DPARAM( NAME ) NAME
  1126.  
  1127. #define SAMPLER2DARRAYARG( NAME ) in sampler2DArray NAME
  1128. #define SAMPLER2DARRAYPARAM( NAME ) NAME
  1129.  
  1130. #define SAMPLER2D( NAME ) sampler2D NAME
  1131. #define SAMPLER2DARRAY( NAME ) sampler2DArray NAME
  1132. #define SAMPLER3D( NAME ) sampler3D NAME
  1133. #define SAMPLER2DSHADOW_SRT( NAME ) sampler2DShadow NAME
  1134. #endif
  1135.  
  1136. #define textureGatherRed( lTex, lSamp ) textureGather( lTex, lSamp, 0 )
  1137. #define textureGatherGreen( lTex, lSamp ) textureGather( lTex, lSamp, 1 )
  1138. #define textureGatherBlue( lTex, lSamp ) textureGather( lTex, lSamp, 2 )
  1139. #define textureGatherAlpha( lTex, lSamp ) textureGather( lTex, lSamp, 3 )
  1140.  
  1141. #define texture2DComputeGrad( T, C ) texture2D( T, C )
  1142.  
  1143. #elif defined(D_PLATFORM_ORBIS)
  1144.  
  1145. #define SAMPLERCUBE( NAME, REG ) SamplerState NAME##SS : register( s##REG ); TextureCube NAME##TU : register( t##REG )
  1146.  
  1147. #define SAMPLER2D( NAME ) Texture2D NAME; SamplerState NAME##SS
  1148. #define SAMPLER2DSHADOW_SRT( NAME ) Texture2D NAME; SamplerComparisonState NAME##SS //SAMPLER2D( NAME )
  1149. #define SAMPLER3D( NAME ) Texture3D NAME; SamplerState NAME##SS
  1150.  
  1151.  
  1152. #define SAMPLER2DARRAY( NAME ) Texture2D_Array NAME; SamplerState NAME##SS
  1153. #define SAMPLER2DARRAYARG( NAME ) Texture2D_Array NAME, SamplerState NAME##SS
  1154. #define SAMPLER2DARRAYPARAM( NAME ) NAME, NAME##SS
  1155.  
  1156. #define SAMPLER2DPARAM( NAME ) NAME, NAME##SS
  1157. #define SAMPLER2DARG( NAME ) Texture2D NAME, SamplerState NAME##SS
  1158.  
  1159. #define texture2D( T, C ) T.Sample( T##SS, C )
  1160.  
  1161. #if defined(D_PLATFORM_ORBIS_COMPUTE)
  1162. #define texture2DComputeGrad( T, C ) T.SampleGradient( T##SS, C, vec2( dFdx( C ) ), vec2( dFdy( C ) ) )
  1163. #define shadow2D( T, C ) T.SampleCmpLOD0( T##SS, C.xy, C.z )
  1164. #else
  1165. #define texture2DComputeGrad( T, C ) T.Sample( T##SS, C )
  1166. #define shadow2D( T, C ) T.SampleCmp( T##SS, C.xy, C.z )
  1167. #endif
  1168.  
  1169. #define texture2DLod( T, C, N ) T.SampleLOD( T##SS, C, N )
  1170. #define texture2DArray( T, C ) T.Sample( T##SS, C )
  1171. #define texture3DLod( T, C, N ) T.SampleLOD( T##SS, C, N )
  1172.  
  1173. //#define shadow2D( T, C ) vec3( C.z > T.Sample( T##SS, C.xy ).x ? 1.0 : 0.0 )
  1174. //#define shadow2D( T, C ) T.GatherCmp( T##SS, C.xy, C.z )
  1175. //#define shadow2D( T, C ) T.SampleCmpLOD0( T##SS, C.xy, C.z )
  1176. #define textureCube( T, C ) T##TU.Sample( T##SS, C )
  1177. #define textureCubeLod( T, C, N ) T##TU.Sample( T##SS, C, N )
  1178. #define textureGrad( T, C, DDX, DDY ) T.SampleGradient( T##SS, C, DDX, DDY )
  1179.  
  1180. #define imageAtomicAdd( T, C, V ) AtomicAdd( T[ C ], V )
  1181. #define imageAtomicAddOut( T, C, V, O ) AtomicAdd( T[ C ], V, O )
  1182.  
  1183. #define imageStore( T, C, V ) ( T[C] = V )
  1184.  
  1185. #define textureGatherRed( lTex, lSamp ) lTex.GatherRed ( lTex##SS, lSamp )
  1186. #define textureGatherGreen( lTex, lSamp ) lTex.GatherGreen( lTex##SS, lSamp )
  1187. #define textureGatherBlue( lTex, lSamp ) lTex.GatherBlue ( lTex##SS, lSamp )
  1188. #define textureGatherAlpha( lTex, lSamp ) lTex.GatherAlpha( lTex##SS, lSamp )
  1189.  
  1190. #define texelFetch( lTex, lSamp, lLod ) lTex.MipMaps((lLod), (lSamp))
  1191.  
  1192. #endif
  1193.  
  1194.  
  1195. #if defined(D_PLATFORM_ORBIS_COMPUTE)
  1196.  
  1197. #define THREADGROUP_LOCAL thread_group_memory
  1198. #define THREADGROUP_BARRIER ThreadGroupMemoryBarrier()
  1199.  
  1200. #elif defined(D_PLATFORM_PC_COMPUTE)
  1201.  
  1202. #define THREADGROUP_LOCAL layout( shared )
  1203. #define THREADGROUP_BARRIER groupMemoryBarrier()
  1204.  
  1205. #endif
  1206.  
  1207. // =================================================================================================
  1208. // Matrices
  1209. // =================================================================================================
  1210. #ifdef D_PLATFORM_PC
  1211.  
  1212. #define MUL( INPUT_A, INPUT_B ) (INPUT_A * INPUT_B)
  1213. #define PLATFORM_TRANSPOSE
  1214. #define MAT4_SET_POS( M, P ) M[ 3 ] = P
  1215. #define MAT4_SET_TRANSLATION( M, T ) M[ 3 ].xyz = T
  1216. #define MAT4_GET_COLUMN( M, C ) M[ C ].xyz
  1217. #define MAT3_GET_COLUMN( M, C ) M[ C ]
  1218. #define MAT4_GET_COLUMN_VEC4( M, C ) M[ C ]
  1219.  
  1220. #define MAT3_SET_COLUMN( M, C, V ) M[ C ] = V;
  1221. #define MAT4_SET_COLUMN( M, C, V ) M[ C ] = V;
  1222.  
  1223. #elif defined(D_PLATFORM_ORBIS)
  1224.  
  1225. #define MUL( INPUT_A, INPUT_B ) mul( INPUT_B, INPUT_A )
  1226. #define PLATFORM_TRANSPOSE
  1227. #define MAT4_SET_POS( M, P ) M[ 3 ] = P
  1228. #define MAT4_SET_TRANSLATION( M, T ) M[ 3 ].xyz = T
  1229. #define MAT4_GET_COLUMN( M, C ) M[ C ].xyz
  1230. #define MAT3_GET_COLUMN( M, C ) M[ C ]
  1231. #define MAT4_GET_COLUMN_VEC4( M, C ) M[ C ]
  1232.  
  1233. #define MAT3_SET_COLUMN( M, C, V ) M[ C ] = V;
  1234. #define MAT4_SET_COLUMN( M, C, V ) M[ C ] = V;
  1235.  
  1236. #endif
  1237.  
  1238. // =================================================================================================
  1239. // Arrays (workaround AMD shader compiler issues by making arrays have global scope)
  1240. // =================================================================================================
  1241.  
  1242. #if defined(D_PLATFORM_ORBIS)
  1243.  
  1244. #define ARRAY_LOOKUP_FS( _UNIFORMS, _ELEMENT, _INDEX) _UNIFORMS._ELEMENT[_INDEX]
  1245. #define ARRAY_LOOKUP_FP( _UNIFORMS, _ELEMENT, _INDEX) _UNIFORMS._ELEMENT[_INDEX]
  1246.  
  1247. #else
  1248.  
  1249. #define ARRAY_LOOKUP_FS( _UNIFORMS, _ELEMENT, _INDEX) _ELEMENT[_INDEX]
  1250. #define ARRAY_LOOKUP_FP( _UNIFORMS, _ELEMENT, _INDEX) _ELEMENT[_INDEX]
  1251.  
  1252. #endif
  1253.  
  1254.  
  1255. // =================================================================================================
  1256. // Input and Output
  1257. // =================================================================================================
  1258. #ifdef D_PLATFORM_PC
  1259.  
  1260. #define UNIFORM( TYPE, NAME ) uniform TYPE NAME
  1261. #define UNIFORM_SRT( TYPE, NAME ) uniform TYPE NAME
  1262.  
  1263. #define DECLARE_INPUT
  1264. #define DECLARE_OUTPUT
  1265. #define DECLARE_END
  1266. #define DECLARE_PTR( TYPE, NAME ) TYPE NAME;
  1267.  
  1268. #define DECLARE_PATCH_INPUT_TRI
  1269. #define DECLARE_PATCH_OUTPUT_TRI
  1270. #define IN_PATCH_TRI_TESS_CONSTANTS
  1271. #define OUT_PATCH_TRI_TESS_CONSTANTS
  1272.  
  1273. #define DECLARE_PATCH_INPUT_QUAD
  1274. #define DECLARE_PATCH_OUTPUT_QUAD
  1275. #define IN_PATCH_QUAD_TESS_CONSTANTS
  1276. #define OUT_PATCH_QUAD_TESS_CONSTANTS
  1277.  
  1278. #if defined( D_HULL )
  1279.  
  1280. #define INPUT( TYPE, NAME, REG ) in TYPE NAME [];
  1281. #define INPUT_NOINTERP( TYPE, NAME, REG ) flat in TYPE NAME [];
  1282. #define INPUT_NOPERSP( TYPE, NAME, REG ) in TYPE NAME [];
  1283.  
  1284. #define PATCH_OUTPUT( TYPE, NAME, REG ) patch out TYPE NAME;
  1285. #define OUTPUT( TYPE, NAME, REG ) out TYPE NAME [];
  1286. #define OUTPUT_NOINTERP( TYPE, NAME, REG ) flat out TYPE NAME [];
  1287. #define OUTPUT_NOPERSP( TYPE, NAME, REG ) out TYPE NAME [];
  1288.  
  1289. #elif defined( D_DOMAIN )
  1290.  
  1291. #define PATCH_INPUT( TYPE, NAME, REG ) patch in TYPE NAME;
  1292. #define INPUT( TYPE, NAME, REG ) in TYPE NAME [];
  1293. #define INPUT_NOINTERP( TYPE, NAME, REG ) flat in TYPE NAME [];
  1294. #define INPUT_NOPERSP( TYPE, NAME, REG ) in TYPE NAME [];
  1295.  
  1296. #define OUTPUT( TYPE, NAME, REG ) out TYPE NAME;
  1297. #define OUTPUT_NOINTERP( TYPE, NAME, REG ) flat out TYPE NAME;
  1298. #define OUTPUT_NOPERSP( TYPE, NAME, REG ) out TYPE NAME;
  1299.  
  1300. #else
  1301.  
  1302. #define INPUT( TYPE, NAME, REG ) in TYPE NAME;
  1303. #define INPUT_NOINTERP( TYPE, NAME, REG ) flat in TYPE NAME;
  1304. #define INPUT_NOPERSP( TYPE, NAME, REG ) in TYPE NAME;
  1305.  
  1306. #define OUTPUT( TYPE, NAME, REG ) out TYPE NAME;
  1307. #define OUTPUT_NOINTERP( TYPE, NAME, REG ) flat out TYPE NAME;
  1308. #define OUTPUT_NOPERSP( TYPE, NAME, REG ) out TYPE NAME;
  1309.  
  1310. #endif
  1311.  
  1312. #define FRAGMENT_COLOUR_UVEC4_DEFINE layout(location = 0) out uvec4 outu_color0;
  1313. #define FRAGMENT_COLOUR_UVEC4 outu_color0
  1314.  
  1315. #define FRAGMENT_COLOUR out_color0
  1316. #define FRAGMENT_COLOUR0 out_color0
  1317. #define FRAGMENT_COLOUR1 out_color1
  1318. #define FRAGMENT_COLOUR2 out_color2
  1319. #define FRAGMENT_COLOUR3 out_color3
  1320. #define FRAGMENT_COLOUR4 out_color4
  1321. #if defined( D_TAA_RENDER_TARGETS )
  1322. #define FRAGMENT_COLOUR_VEC4_DEFINE layout(location = 0) out vec4 out_color0; layout(location = 1) out vec4 out_color1; layout(location = 2) out vec4 out_color2;
  1323. #elif !defined(D_ATTRIBUTES)
  1324. #define FRAGMENT_COLOUR_VEC4_DEFINE layout(location = 0) out vec4 out_color0;
  1325. #else
  1326. #define FRAGMENT_COLOUR_VEC4_DEFINE layout(location = 0) out vec4 out_color0; layout(location = 1) out vec4 out_color1; layout(location = 2) out vec4 out_color2; layout(location = 3) out vec4 out_color3; layout(location = 4) out vec4 out_color4;
  1327. #endif
  1328. #define FRAGMENT_COLOUR01_VEC4_DEFINE layout(location = 0) out vec4 out_color0; layout(location = 1) out vec4 out_color1;
  1329.  
  1330. #define FRAGMENT_DEPTH gl_FragDepth
  1331. #define FRAGMENT_FRONTFACE gl_FrontFacing
  1332. #define INPUT_FRONTFACING
  1333.  
  1334. #define DEREF_PTR( VAR ) VAR
  1335.  
  1336. #if defined( D_HULL )
  1337.  
  1338. #define IN( VAR ) VAR[ gl_InvocationID ]
  1339. #define OUT( VAR ) VAR[ gl_InvocationID ]
  1340. #define PATCH_OUT( VAR ) VAR
  1341.  
  1342. #define OUTPUT_VERTEX_SCREEN_POSITION gl_out[ gl_InvocationID ].gl_Position
  1343. #define INPUT_VERTEX_SCREEN_POSITION gl_in [ gl_InvocationID ].gl_Position
  1344.  
  1345. #define TESS_LEVEL_EDGE( IND ) gl_TessLevelOuter[ IND ]
  1346. #define TESS_LEVEL_INNER( IND ) gl_TessLevelInner[ IND ]
  1347.  
  1348. #elif defined( D_DOMAIN )
  1349.  
  1350. #define PATCH_IN( VAR, IND ) VAR[ IND ]
  1351. #define IN( VAR, IND ) VAR[ IND ]
  1352. #define OUT( VAR ) VAR
  1353.  
  1354. #define INPUT_VERTEX_SCREEN_POSITION( IND ) gl_in [ IND ].gl_Position
  1355.  
  1356. #define DOMAIN_COORDS gl_TessCoord
  1357.  
  1358. #elif defined( D_GEOMETRY )
  1359.  
  1360. #define OUTPUT_VERTEX_SCREEN_POSITION gl_Position
  1361. #define INPUT_VERTEX_SCREEN_POSITION( IND ) gl_in [ IND ].gl_Position
  1362. #define IN( VAR, IND ) VAR[ IND ]
  1363. #define OUT( VAR ) VAR
  1364.  
  1365. #else
  1366.  
  1367. #define IN( VAR ) VAR
  1368. #define OUT( VAR ) VAR
  1369.  
  1370. #endif
  1371.  
  1372. #define OUT_VERTEX_SCREEN_POSITION
  1373. #define IN_SCREEN_POSITION
  1374.  
  1375. #define VERTEX_SCREEN_POSITION gl_Position
  1376.  
  1377. #elif defined(D_PLATFORM_ORBIS_COMPUTE)
  1378.  
  1379. #define DECLARE_INPUT struct cInput {
  1380. #define DECLARE_END };
  1381. #define DECLARE_PTR( TYPE, NAME ) TYPE* NAME;
  1382.  
  1383. #define INPUT( TYPE, NAME, REG ) TYPE NAME : REG;
  1384. #define INPUT_NOINTERP( TYPE, NAME, REG ) TYPE NAME : REG;
  1385.  
  1386. #define IN_SCREEN_POSITION
  1387.  
  1388. #define FRAGMENT_COLOUR lUniforms.mpCmpOutPerMesh.gOutTexture0[dispatchThreadID.xy]
  1389. #define FRAGMENT_COLOUR0 lUniforms.mpCmpOutPerMesh.gOutTexture0[dispatchThreadID.xy]
  1390. #define FRAGMENT_COLOUR1 lUniforms.mpCmpOutPerMesh.gOutTexture1[dispatchThreadID.xy]
  1391. #define FRAGMENT_COLOUR2 lUniforms.mpCmpOutPerMesh.gOutTexture2[dispatchThreadID.xy]
  1392. #define FRAGMENT_COLOUR3 lUniforms.mpCmpOutPerMesh.gOutTexture3[dispatchThreadID.xy]
  1393. #define FRAGMENT_COLOUR4 lUniforms.mpCmpOutPerMesh.gOutTexture4[dispatchThreadID.xy]
  1394. #define FRAGMENT_DEPTH lUniforms.mpCmpOutPerMesh.gOutTextureDepth[dispatchThreadID.xy]
  1395.  
  1396. #define DEREF_PTR( VAR ) *VAR
  1397.  
  1398. #elif defined(D_PLATFORM_ORBIS)
  1399.  
  1400. #define UNIFORM( TYPE, NAME ) ConstantBuffer NAME##CB{ TYPE NAME; };
  1401. #define UNIFORM_SRT( TYPE, NAME ) ConstantBuffer NAME##CB{ TYPE NAME : S_SRT_DATA; };
  1402.  
  1403. #define DECLARE_OUTPUT struct cOutput {
  1404. #define DECLARE_INPUT struct cInput {
  1405. #define DECLARE_END };
  1406. #define DECLARE_PTR( TYPE, NAME ) TYPE* NAME;
  1407.  
  1408. #define INPUT( TYPE, NAME, REG ) TYPE NAME : REG;
  1409. #define INPUT_NOINTERP( TYPE, NAME, REG ) nointerp TYPE NAME : REG;
  1410. #define INPUT_NOPERSP( TYPE, NAME, REG ) nopersp TYPE NAME : REG;
  1411.  
  1412. #define OUTPUT( TYPE, NAME, REG ) TYPE NAME : REG;
  1413. #define OUTPUT_NOINTERP( TYPE, NAME, REG ) nointerp TYPE NAME : REG;
  1414. #define OUTPUT_NOPERSP( TYPE, NAME, REG ) nopersp TYPE NAME : REG;
  1415.  
  1416. #define FRAGMENT_COLOUR_UVEC4_DEFINE
  1417. #define FRAGMENT_COLOUR_UVEC4 Out.mColour
  1418. #define FRAGMENT_COLOUR Out.mColour
  1419. #define FRAGMENT_COLOUR0 Out.mColour0
  1420. #define FRAGMENT_COLOUR1 Out.mColour1
  1421. #define FRAGMENT_COLOUR2 Out.mColour2
  1422. #define FRAGMENT_COLOUR3 Out.mColour3
  1423. #define FRAGMENT_COLOUR4 Out.mColour4
  1424. #define FRAGMENT_DEPTH Out.mDepth
  1425.  
  1426. #define FRAGMENT_FRONTFACE In.mbFrontFacing
  1427. #define INPUT_FRONTFACING bool mbFrontFacing : S_FRONT_FACE;
  1428.  
  1429. #if defined( D_HULL )
  1430.  
  1431. #define IN( VAR ) In[ uCPID ].VAR
  1432. #define OUT( VAR ) Out.VAR
  1433. #define PATCH_OUT( VAR ) Out.VAR
  1434.  
  1435. #define OUTPUT_VERTEX_SCREEN_POSITION OUT( mScreenPositionVec4 )
  1436. #define INPUT_VERTEX_SCREEN_POSITION IN( mScreenPositionVec4 )
  1437.  
  1438. #define TESS_LEVEL_EDGE( IND ) Out.edge_ts[ IND ]
  1439. #define TESS_LEVEL_INNER( IND ) Out.insi_ts[ IND ]
  1440.  
  1441. #define DECLARE_PATCH_OUTPUT_TRI [DOMAIN_PATCH_TYPE("tri")] struct HSConstantOutputData {
  1442. #define OUT_PATCH_TRI_TESS_CONSTANTS float edge_ts[3] : S_EDGE_TESS_FACTOR; \
  1443. float insi_ts[1] : S_INSIDE_TESS_FACTOR;
  1444.  
  1445. #define DECLARE_PATCH_OUTPUT_QUAD [DOMAIN_PATCH_TYPE("quad")] struct HSConstantOutputData (
  1446. #define OUT_PATCH_QUAD_TESS_CONSTANTS float edge_ts[4] : S_EDGE_TESS_FACTOR; \
  1447. float insi_ts[2] : S_INSIDE_TESS_FACTOR;
  1448.  
  1449. #define PATCH_OUTPUT( TYPE, NAME, REG ) TYPE NAME : REG;
  1450.  
  1451. #elif defined( D_DOMAIN )
  1452.  
  1453. #define PATCH_IN( VAR, IND ) patchIn.VAR
  1454. #define IN( VAR, IND ) In[ IND ].VAR
  1455. #define OUT( VAR ) Out.VAR
  1456.  
  1457. #define OUTPUT_VERTEX_SCREEN_POSITION OUT( mScreenPositionVec4 )
  1458. #define INPUT_VERTEX_SCREEN_POSITION( IND ) IN( mScreenPositionVec4, IND )
  1459.  
  1460. #define DOMAIN_COORDS domainCoordinates
  1461.  
  1462. #define DECLARE_PATCH_INPUT_TRI [DOMAIN_PATCH_TYPE("tri")] struct HSConstantOutputData {
  1463. #define IN_PATCH_TRI_TESS_CONSTANTS float edge_ts[3] : S_EDGE_TESS_FACTOR; \
  1464. float insi_ts[1] : S_INSIDE_TESS_FACTOR;
  1465.  
  1466. #define DECLARE_PATCH_INPUT_QUAD [DOMAIN_PATCH_TYPE("quad")] struct HSConstantOutputData {
  1467. #define IN_PATCH_QUAD_TESS_CONSTANTS float edge_ts[4] : S_EDGE_TESS_FACTOR; \
  1468. float insi_ts[2] : S_INSIDE_TESS_FACTOR;
  1469.  
  1470. #define PATCH_INPUT( TYPE, NAME, REG ) TYPE NAME : REG;
  1471.  
  1472. #elif defined( D_GEOMETRY )
  1473.  
  1474. #define IN( VAR, IND ) In[ IND ].VAR
  1475. #define OUT( VAR ) Out.VAR
  1476.  
  1477. #define OUTPUT_VERTEX_SCREEN_POSITION OUT( mScreenPositionVec4 )
  1478. #define INPUT_VERTEX_SCREEN_POSITION( IND ) IN( mScreenPositionVec4, IND )
  1479.  
  1480. #define EMIT_VERTEX TriStream.Append( Out )
  1481. #define END_PRIMITIVE TriStream.RestartStrip()
  1482.  
  1483. #else
  1484.  
  1485. #define IN( VAR ) In.VAR
  1486. #define OUT( VAR ) Out.VAR
  1487.  
  1488. #endif
  1489.  
  1490.  
  1491. // TODO get rid of this - don't pass struct through functinos, pass members.
  1492. #define DEREF_PTR( VAR ) *VAR
  1493.  
  1494.  
  1495. #define OUT_VERTEX_SCREEN_POSITION OUTPUT( vec4, mScreenPositionVec4, S_POSITION )
  1496. #define IN_SCREEN_POSITION INPUT ( vec4, mScreenPositionVec4, S_POSITION )
  1497. #define VERTEX_SCREEN_POSITION OUT( mScreenPositionVec4 )
  1498.  
  1499. #endif
  1500.  
  1501. // =================================================================================================
  1502. // Main
  1503. // =================================================================================================
  1504. #ifdef D_PLATFORM_PC
  1505.  
  1506. #define VERTEX_MAIN void main( void )
  1507. #define VERTEX_MAIN_SRT uniform UniformBuffer lUniforms; void main( void )
  1508.  
  1509. #define HULL_TRI_MAIN_SRT layout( vertices = 3 ) out; uniform UniformBuffer lUniforms; void main( void )
  1510. #define HULL_QUAD_MAIN_SRT layout( vertices = 4 ) out; uniform UniformBuffer lUniforms; void main( void )
  1511.  
  1512. #define DOMAIN_TRI_MAIN_SRT layout( triangles, fractional_even_spacing ) in; uniform UniformBuffer lUniforms; void main( void )
  1513. #define DOMAIN_QUAD_MAIN_SRT layout( quads, fractional_even_spacing ) in; uniform UniformBuffer lUniforms; void main( void )
  1514.  
  1515. #define FRAGMENT_MAIN_COLOUR FRAGMENT_COLOUR_VEC4_DEFINE void main( void )
  1516. #define VOID_MAIN_COLOUR FRAGMENT_COLOUR_VEC4_DEFINE void main( void )
  1517. #define FRAGMENT_MAIN_COLOUR_DEPTH FRAGMENT_COLOUR_VEC4_DEFINE void main( void )
  1518.  
  1519. #define FRAGMENT_MAIN_COLOUR_DEPTH_SRT FRAGMENT_COLOUR_VEC4_DEFINE uniform UniformBuffer lUniforms; void main( void )
  1520. #define FRAGMENT_MAIN_COLOUR_DEPTH_GE_SRT FRAGMENT_COLOUR_VEC4_DEFINE uniform UniformBuffer lUniforms; void main( void )
  1521. #define FRAGMENT_MAIN_COLOUR_DEPTH_LE_SRT FRAGMENT_COLOUR_VEC4_DEFINE uniform UniformBuffer lUniforms; void main( void )
  1522. #define FRAGMENT_MAIN_COLOUR_SRT FRAGMENT_COLOUR_VEC4_DEFINE uniform UniformBuffer lUniforms; void main( void )
  1523. #define FRAGMENT_MAIN_COLOUR_EARLYZ_SRT FRAGMENT_COLOUR_VEC4_DEFINE uniform UniformBuffer lUniforms; void main( void )
  1524. #define FRAGMENT_MAIN_UICOLOUR_SRT FRAGMENT_COLOUR_UVEC4_DEFINE uniform UniformBuffer lUniforms; void main( void )
  1525.  
  1526. #define VOID_MAIN_SRT FRAGMENT_COLOUR_VEC4_DEFINE uniform UniformBuffer lUniforms; void main( void )
  1527. #define VOID_MAIN_DEPTH_SRT FRAGMENT_COLOUR_VEC4_DEFINE uniform UniformBuffer lUniforms; void main( void )
  1528.  
  1529. #define FRAGMENT_MAIN_COLOUR01_SRT FRAGMENT_COLOUR01_VEC4_DEFINE uniform UniformBuffer lUniforms; void main( void )
  1530. #define FRAGMENT_MAIN_COLOUR01_DEPTH_SRT FRAGMENT_COLOUR01_VEC4_DEFINE uniform UniformBuffer lUniforms; void main( void )
  1531.  
  1532. #elif defined( D_PLATFORM_PC_COMPUTE )
  1533.  
  1534. #define COMPUTE_MAIN_SRT( X, Y, Z ) layout (local_size_x = X, local_size_y = Y, local_size_z = Z) in; void main( void )
  1535.  
  1536. #define FRAGMENT_MAIN_COLOUR_SRT COMPUTE_MAIN_SRT( 8,8,1 )
  1537. #define FRAGMENT_MAIN_COLOUR01_SRT COMPUTE_MAIN_SRT( 8,8,1 )
  1538. #define FRAGMENT_MAIN_COLOUR_DEPTH_SRT COMPUTE_MAIN_SRT( 8,8,1 )
  1539.  
  1540. #elif defined( D_PLATFORM_ORBIS_COMPUTE )
  1541.  
  1542. #define COMPUTE_MAIN_SRT( X, Y, Z ) [NUM_THREADS(X, Y, Z)] void main(uint3 groupID : S_GROUP_ID, uint3 groupThreadID : S_GROUP_THREAD_ID, uint3 dispatchThreadID : S_DISPATCH_THREAD_ID, UniformBuffer lUniforms : S_SRT_DATA)
  1543.  
  1544. #define FRAGMENT_MAIN_COLOUR_SRT COMPUTE_MAIN_SRT( 8,8,1 )
  1545. #define FRAGMENT_MAIN_COLOUR01_SRT COMPUTE_MAIN_SRT( 8,8,1 )
  1546. #define FRAGMENT_MAIN_COLOUR_DEPTH_SRT COMPUTE_MAIN_SRT( 8,8,1 )
  1547.  
  1548. #elif defined( D_PLATFORM_ORBIS )
  1549.  
  1550. #define VERTEX_MAIN void main( cInput In, out cOutput Out )
  1551. #define VERTEX_MAIN_SRT void main( cInput In, out cOutput Out, UniformBuffer lUniforms : S_SRT_DATA )
  1552.  
  1553. #define HULL_TRI_MAIN_SRT [DOMAIN_PATCH_TYPE("tri")] \
  1554. [PARTITIONING_TYPE("integer")] \
  1555. [OUTPUT_TOPOLOGY_TYPE("triangle_cw")] \
  1556. [OUTPUT_CONTROL_POINTS(3)] \
  1557. [PATCH_CONSTANT_FUNC("ConstantsHS")] \
  1558. [MAX_TESS_FACTOR(16.0)] \
  1559. void main( \
  1560. InputPatch<cInput, 3> In, \
  1561. uint uCPID : S_OUTPUT_CONTROL_POINT_ID, \
  1562. UniformBuffer lUniforms : S_SRT_DATA, \
  1563. out cOutput Out )
  1564.  
  1565. #define HULL_QUAD_MAIN_SRT [DOMAIN_PATCH_TYPE("quad")] \
  1566. [PARTITIONING_TYPE("integer")] \
  1567. [OUTPUT_TOPOLOGY_TYPE("triangle_cw")] \
  1568. [OUTPUT_CONTROL_POINTS(4)] \
  1569. [PATCH_CONSTANT_FUNC("ConstantsHS")] \
  1570. [MAX_TESS_FACTOR(16.0)] \
  1571. void main( \
  1572. InputPatch<cInput, 4> In, \
  1573. uint uCPID : S_OUTPUT_CONTROL_POINT_ID, \
  1574. UniformBuffer lUniforms : S_SRT_DATA, \
  1575. out cOutput Out )
  1576.  
  1577.  
  1578. #define DOMAIN_TRI_MAIN_SRT [DOMAIN_PATCH_TYPE("tri")] \
  1579. void main( \
  1580. HSConstantOutputData patchIn, \
  1581. const OutputPatch<cInput, 3> In, \
  1582. out cOutput Out, \
  1583. UniformBuffer lUniforms : S_SRT_DATA, \
  1584. float3 domainCoordinates : S_DOMAIN_LOCATION )
  1585.  
  1586. #define DOMAIN_QUAD_MAIN_SRT [DOMAIN_PATCH_TYPE("quad")] \
  1587. void main( \
  1588. HSConstantOutputData patchIn, \
  1589. const OutputPatch<cInput, 4> In, \
  1590. out cOutput Out, \
  1591. UniformBuffer lUniforms : S_SRT_DATA, \
  1592. float2 domainCoordinates : S_DOMAIN_LOCATION )
  1593.  
  1594. #define GEOMETRY_MAIN_SRT( MAX_VERTS ) cOutput Out; [MAX_VERTEX_COUNT(MAX_VERTS)] void main( inout TriangleBuffer<cOutput> TriStream, Triangle cInput In[3], UniformBuffer lUniforms : S_SRT_DATA )
  1595.  
  1596.  
  1597. #define FRAGMENT_MAIN_COLOUR struct cOutput { vec4 mColour : S_TARGET_OUTPUT; }; [RE_Z] void main( cInput In, out cOutput Out )
  1598. #define VOID_MAIN_COLOUR struct cOutput { vec4 mColour : S_TARGET_OUTPUT; }; void main( cInput In, out cOutput Out )
  1599. #define FRAGMENT_MAIN_COLOUR_DEPTH struct cOutput { vec4 mColour : S_TARGET_OUTPUT; float mDepth : S_DEPTH_OUTPUT; }; [RE_Z] void main( cInput In, out cOutput Out )
  1600. #define VOID_MAIN_SRT void main( cInput In, UniformBuffer lUniforms : S_SRT_DATA )
  1601.  
  1602. #if defined( D_TAA_RENDER_TARGETS )
  1603.  
  1604. #define FRAGMENT_MAIN_COLOUR_SRT struct cOutput { vec4 mColour0 : S_TARGET_OUTPUT0; \
  1605. vec4 mColour1 : S_TARGET_OUTPUT1; \
  1606. vec4 mColour2 : S_TARGET_OUTPUT2; }; \
  1607. [RE_Z] void main( cInput In, out cOutput Out, UniformBuffer lUniforms : S_SRT_DATA )
  1608.  
  1609.  
  1610. #elif !defined( D_ATTRIBUTES )
  1611. #define FRAGMENT_MAIN_COLOUR_DEPTH_SRT struct cOutput { vec4 mColour : S_TARGET_OUTPUT; float mDepth : S_DEPTH_OUTPUT; }; [RE_Z] void main( cInput In, out cOutput Out, UniformBuffer lUniforms : S_SRT_DATA )
  1612. #define FRAGMENT_MAIN_COLOUR_DEPTH_GE_SRT struct cOutput { vec4 mColour : S_TARGET_OUTPUT; float mDepth : S_DEPTH_GE_OUTPUT; }; [RE_Z] void main( cInput In, out cOutput Out, UniformBuffer lUniforms : S_SRT_DATA )
  1613. #define FRAGMENT_MAIN_COLOUR_DEPTH_LE_SRT struct cOutput { vec4 mColour : S_TARGET_OUTPUT; float mDepth : S_DEPTH_LE_OUTPUT; }; [RE_Z] void main( cInput In, out cOutput Out, UniformBuffer lUniforms : S_SRT_DATA )
  1614. #define FRAGMENT_MAIN_COLOUR_SRT struct cOutput { vec4 mColour : S_TARGET_OUTPUT; }; void main( cInput In, out cOutput Out, UniformBuffer lUniforms : S_SRT_DATA )
  1615. #define VOID_MAIN_DEPTH_SRT struct cOutput { float mDepth : S_DEPTH_OUTPUT; }; [RE_Z] void main( cInput In, out cOutput Out, UniformBuffer lUniforms : S_SRT_DATA )
  1616. #define VOID_MAIN_COLOUR_EARLYZ_SRT [FORCE_EARLY_DEPTH_STENCIL] void main( cInput In, UniformBuffer lUniforms : S_SRT_DATA )
  1617.  
  1618. #define FRAGMENT_MAIN_COLOUR01_SRT struct cOutput { vec4 mColour0 : S_TARGET_OUTPUT0; \
  1619. vec4 mColour1 : S_TARGET_OUTPUT1; }; \
  1620. [RE_Z] void main( cInput In, out cOutput Out, UniformBuffer lUniforms : S_SRT_DATA )
  1621. #define FRAGMENT_MAIN_COLOUR01_DEPTH_SRT struct cOutput { vec4 mColour0 : S_TARGET_OUTPUT0; \
  1622. vec4 mColour1 : S_TARGET_OUTPUT1; \
  1623. float mDepth : S_DEPTH_OUTPUT; }; \
  1624. [RE_Z] void main( cInput In, out cOutput Out, UniformBuffer lUniforms : S_SRT_DATA )
  1625.  
  1626. #else
  1627.  
  1628. // #pragma PSSL_target_output_format(target 1 FMT_32_AR)
  1629.  
  1630. #define FRAGMENT_MAIN_COLOUR_DEPTH_SRT struct cOutput { vec4 mColour0 : S_TARGET_OUTPUT0; \
  1631. vec4 mColour1 : S_TARGET_OUTPUT1; \
  1632. vec4 mColour2 : S_TARGET_OUTPUT2; \
  1633. vec4 mColour3 : S_TARGET_OUTPUT3; \
  1634. float mDepth : S_DEPTH_OUTPUT; }; \
  1635. [RE_Z] void main( cInput In, out cOutput Out, UniformBuffer lUniforms : S_SRT_DATA )
  1636.  
  1637. #define FRAGMENT_MAIN_COLOUR_SRT struct cOutput { vec4 mColour0 : S_TARGET_OUTPUT0; \
  1638. vec4 mColour1 : S_TARGET_OUTPUT1; \
  1639. vec4 mColour2 : S_TARGET_OUTPUT2; \
  1640. vec4 mColour3 : S_TARGET_OUTPUT3; }; \
  1641. [RE_Z] void main( cInput In, out cOutput Out, UniformBuffer lUniforms : S_SRT_DATA )
  1642.  
  1643. #define FRAGMENT_MAIN_COLOUR_EARLYZ_SRT struct cOutput { vec4 mColour0 : S_TARGET_OUTPUT0; \
  1644. vec4 mColour1 : S_TARGET_OUTPUT1; \
  1645. vec4 mColour2 : S_TARGET_OUTPUT2; \
  1646. vec4 mColour3 : S_TARGET_OUTPUT3; }; \
  1647. [FORCE_EARLY_DEPTH_STENCIL] void main( cInput In, out cOutput Out, UniformBuffer lUniforms : S_SRT_DATA )
  1648. #endif
  1649.  
  1650.  
  1651. #endif
  1652.  
  1653. // =================================================================================================
  1654. // Texture resolution
  1655. // =================================================================================================
  1656.  
  1657. #ifdef D_PLATFORM_ORBIS
  1658. uvec2 GetResolution( Texture2D lTexture )
  1659. {
  1660. uvec2 lResolution;
  1661. lTexture.GetDimensionsFast(lResolution.x, lResolution.y);
  1662. return lResolution;
  1663. }
  1664.  
  1665. uvec2 GetResolution( RW_Texture2D<float4> lTexture )
  1666. {
  1667. uvec2 lResolution;
  1668. lTexture.GetDimensionsFast(lResolution.x, lResolution.y);
  1669. return lResolution;
  1670. }
  1671. #else
  1672. uvec2 GetResolution( sampler2D lTexture )
  1673. {
  1674. return textureSize( lTexture, 0 );
  1675. }
  1676. #endif
  1677.  
  1678. // =================================================================================================
  1679. // Viewport
  1680. // =================================================================================================
  1681. #ifdef D_PLATFORM_PC
  1682.  
  1683. #define SCREENSPACE_AS_RENDERTARGET_UVS( A ) A.xy
  1684.  
  1685. #elif defined(D_PLATFORM_ORBIS)
  1686.  
  1687. #define SCREENSPACE_AS_RENDERTARGET_UVS( A ) ( float2( A.x, 1.0 - A.y ) )
  1688.  
  1689. #endif
  1690.  
  1691. #ifdef D_USING_LOGDEPTH
  1692.  
  1693. #define D_DEPTH_CLEARVALUE (1.0)
  1694.  
  1695. #else
  1696.  
  1697. #define D_DEPTH_CLEARVALUE (0.0)
  1698.  
  1699. #endif
  1700.  
  1701. // =================================================================================================
  1702. // Texture usage feedback
  1703. // =================================================================================================
  1704. #if defined( D_TEXTURE_FEEDBACK ) && defined( D_PLATFORM_PC )
  1705.  
  1706. layout(r32i) uniform iimage2D gTexFeedbackImg;
  1707.  
  1708. void WriteTexFeedback( in int liCounter, in float liMip )
  1709. {
  1710. if( liCounter != 0 )
  1711. {
  1712. #if defined( GL_ARB_shader_ballot ) && ( GL_ARB_shader_ballot == 1 )
  1713. if( readFirstInvocationARB( gl_SubGroupInvocationARB ) == gl_SubGroupInvocationARB )
  1714. #endif
  1715. {
  1716. int liIntMip = int(floor(liMip));
  1717. //imageStore( gTexFeedbackImg, ivec2( liCounter, liIntMip ), ivec4(1,0,0,0) );
  1718. imageAtomicAdd( gTexFeedbackImg, ivec2( liCounter, liIntMip ), int(1) );
  1719. }
  1720. }
  1721. }
  1722.  
  1723. vec4 Tex2dFeedback( in sampler2D lSamp, in int liCounter, in vec2 lCoords )
  1724. {
  1725. float liLod = textureQueryLOD( lSamp, lCoords ).x;
  1726. WriteTexFeedback( liCounter, liLod );
  1727. return texture( lSamp, lCoords );
  1728. }
  1729.  
  1730. vec4 Tex2dLodFeedback( in sampler2D lSamp, in int liCounter, in vec2 lCoords, in float liLod )
  1731. {
  1732. WriteTexFeedback( liCounter, liLod );
  1733. return textureLod( lSamp, lCoords, liLod );
  1734. }
  1735.  
  1736. vec4 Tex2dArrayFeedback( in sampler2DArray lSamp, in int liCounter, in vec3 lCoords )
  1737. {
  1738. float liLod = textureQueryLOD( lSamp, lCoords.xy ).x;
  1739. WriteTexFeedback( liCounter, liLod );
  1740. return texture( lSamp, lCoords );
  1741. }
  1742.  
  1743. vec4 Tex3dFeedback( in sampler3D lSamp, in int liCounter, in vec3 lCoords )
  1744. {
  1745. float liLod = textureQueryLOD( lSamp, lCoords ).x;
  1746. WriteTexFeedback( liCounter, liLod );
  1747. return texture( lSamp, lCoords );
  1748. }
  1749.  
  1750. vec4 Tex3dLodFeedback( in sampler3D lSamp, in int liCounter, in vec3 lCoords, in float liLod )
  1751. {
  1752. WriteTexFeedback( liCounter, liLod );
  1753. return textureLod( lSamp, lCoords, liLod );
  1754. }
  1755.  
  1756.  
  1757. #endif
  1758.  
  1759. #endif
  1760.  
  1761.  
  1762.  
  1763.  
  1764. struct PerFrameUniforms
  1765. {
  1766. vec4 gLightPositionVec4; // EShaderConst_LightPositionVec4
  1767. vec4 gLightDirectionVec4; // EShaderConst_LightDirectionVec4
  1768. vec3 gViewPositionVec3; // EShaderConst_ViewPositionVec3
  1769. float gfTime; // EShaderConst_Time
  1770. float gfPrevTime; // EShaderConst_PrevTime
  1771. vec4 gClipPlanesVec4; // EShaderConst_ClipPlanesVec4
  1772. vec4 gClipPlanesRVec4; // EShaderConst_ClipPlanesRVec4
  1773.  
  1774. mat4 gCameraMat4; // EShaderConst_CameraMat4
  1775. mat4 gCameraDeltaMat4; // EShaderConst_CameraDeltaMat4
  1776. mat4 gPrevViewProjectionMat4; // EShaderConst_PrevViewProjectionMat4
  1777.  
  1778. vec4 gMBlurSettingsVec4; // EShaderConst_BlurSettingsVec4
  1779. vec4 gDeJitterVec4; // EShaderConst_DeJitterVec4
  1780. vec4 gTaaSettingsVec4; // EShaderConst_TaaSettingsVec4
  1781.  
  1782. vec4 gFrameBufferSizeVec4;
  1783. vec4 gFoVValuesVec4; // EShaderConst_FoVValuesVec4
  1784. vec4 gShadowSizeVec4;
  1785. vec4 gShadowFadeParamVec4;
  1786. vec4 gShadowProjScaleVec4[3]; // EShaderConst_ShadowProjScaleVec4
  1787. mat4 gViewMat4; // EShaderConst_ViewMat4
  1788.  
  1789. };
  1790.  
  1791.  
  1792.  
  1793. struct CommonPerMeshUniforms
  1794. {
  1795. // These are planet specific. Should they be here?
  1796. vec4 gPlanetPositionVec4;
  1797. vec4 gLightOriginVec4;
  1798.  
  1799. mat4 gWorldMat4; // EShaderConst_WorldMat4
  1800. mat4 gWorldMotionMat4; // EShaderConst_WorldMotionMat4
  1801. mat4 gWorldViewProjectionMat4; // EShaderConst_WorldViewProjectionMat4
  1802.  
  1803. mat4 gWorldNormalMat4; // EShaderConst_WorldNormalMat4
  1804.  
  1805.  
  1806. #if defined( D_FADE ) && !defined( D_INSTANCE )
  1807. float gfFadeValue; // EShaderConst_FadeTime
  1808. #else
  1809. float fdFadeValueDummy;
  1810. #endif
  1811.  
  1812. #if defined( D_SKINNING_UNIFORMS ) && defined( D_PLATFORM_ORBIS )
  1813. vec4 gaSkinMatrixRowsVec4[ 75 * 3 ];
  1814. vec4 gaPrevSkinMatrixRowsVec4[ 75 * 3 ];
  1815. #endif
  1816.  
  1817. //float gfShadowBias; // EShaderConst_ShadowBias
  1818.  
  1819. // have particle shader use a particlecommon instead of uber, and put these into it.
  1820. #if defined( D_PARTICLE_UNIFORMS ) && defined( D_PLATFORM_ORBIS )
  1821. vec4 gaParticleCornersVec4[ 4 ]; // EShaderConst_ParticleCornersVec4
  1822. vec4 gaParticlePositionsVec4[ 32 ]; // EShaderConst_ParticlePositionsVec4
  1823. vec4 gaParticleSizeAndRotationsVec4[ 32 ]; // EShaderConst_ParticleSizeAndRotationsVec4
  1824. vec4 gaParticleNormalsVec4[ 32 ]; // EShaderConst_ParticleNormalsVec4
  1825. vec4 gaParticleColoursVec4[ 32 ]; // EShaderConst_ParticleColoursVec4
  1826. #endif
  1827.  
  1828. // This stuff is here atm because of shadows. The shadow shader is one thing, but renders twice, with these needing to be set differently.
  1829. // ideally we don't want them set per mesh though, probably a SRT for 'percamera' or something
  1830. //
  1831. //
  1832. mat4 gProjectionMat4; // EShaderConst_ProjectionMat4
  1833. mat4 gViewProjectionMat4; // EShaderConst_ViewProjectionMat4
  1834. #if !defined( D_DEPTHONLY )
  1835. mat4 gInverseWorldUpMat4;
  1836. // Stop these being compiled in when recolouring as the recolour shader needs ALL tex units.
  1837. #if defined( D_DEFERRED_DECAL )
  1838. mat4 gInverseModelMat4; // EShaderConst_InverseModelMat4 = 0
  1839. #else
  1840. mat4 gInverseProjectionSCMat4; // EShaderConst_InverseProjectionSCMat4
  1841. #endif
  1842. mat4 gInverseViewMat4; // EShaderConst_InverseViewMat4
  1843. mat4 gInverseProjectionMat4; // EShaderConst_InverseProjectionMat4
  1844. //mat4 gInverseViewProjectionMat4; // EShaderConst_InverseViewProjectionMat4
  1845. mat4 gaShadowMat4[ 3 ]; // EShaderConst_ShadowMat4
  1846. vec4 gLightColourVec4; // EShaderConst_LightColourVec4
  1847. #ifdef D_IBL
  1848. vec4 gGenericParam0Vec4; // EShaderConst_GenericParam0Vec4
  1849. #else
  1850. vec4 gGenericParam0DummyVec4;
  1851. #endif
  1852.  
  1853. // These shouldn't be per mesh, the should be per rendertarget. BUT we need to add them to the enum
  1854. // in egShader and SetPErRenderTargetUniforms for that to work and we're trying to do a build for sony
  1855. // so that will have to wait. (also probably need a way of setting per RT uniforms from Game).
  1856. vec4 gScanParamsPosVec4;
  1857. vec4 gScanParamsCfg1Vec4;
  1858. vec4 gScanParamsCfg2Vec4;
  1859. vec4 gScanParamsCfg3Vec4;
  1860. vec4 gScanColourVec4;
  1861.  
  1862. vec4 gSpotlightPositionVec4;
  1863. vec4 gSpotlightDirectionVec4;
  1864.  
  1865. #endif
  1866. vec4 gUserDataVec4;
  1867.  
  1868.  
  1869. };
  1870.  
  1871. #if defined( D_PARTICLE_UNIFORMS ) && defined( D_PLATFORM_PC )
  1872. uniform vec4 gaParticleCornersVec4[4]; // EShaderConst_ParticleCornersVec4
  1873. uniform vec4 gaParticlePositionsVec4[32]; // EShaderConst_ParticlePositionsVec4
  1874. uniform vec4 gaParticleSizeAndRotationsVec4[32]; // EShaderConst_ParticleSizeAndRotationsVec4
  1875. uniform vec4 gaParticleNormalsVec4[32]; // EShaderConst_ParticleNormalsVec4
  1876. uniform vec4 gaParticleColoursVec4[32]; // EShaderConst_ParticleColoursVec4
  1877. #endif
  1878.  
  1879.  
  1880. #endif
  1881.  
  1882.  
  1883. ////////////////////////////////////////////////////////////////////////////////
  1884. ///
  1885. /// @file Common.h
  1886. /// @author User
  1887. /// @date
  1888. ///
  1889. /// @brief Common
  1890. ///
  1891. /// Copyright (c) 2008 Hello Games Ltd. All Rights Reserved.
  1892. ///
  1893. ////////////////////////////////////////////////////////////////////////////////
  1894.  
  1895. #ifndef D_COMMON_H
  1896. #define D_COMMON_H
  1897.  
  1898. #define D_TERRAINCOLOURARRAY_SIZE 23
  1899.  
  1900.  
  1901. STATIC_CONST vec3 kGammaOutVec3 = vec3( 1.0 / 2.2 );
  1902. STATIC_CONST vec3 kGammaInVec3 = vec3( 2.2 );
  1903. STATIC_CONST vec4 RGBToHSV_K = vec4( 0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0 );
  1904. STATIC_CONST vec4 HSVToRGB_K = vec4( 1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0 );
  1905. #ifdef D_PLATFORM_ORBIS
  1906. STATIC_CONST float3x3 BT709_TO_BT2020 = float3x3( //ref: ARIB STD-B62 and BT.2087
  1907. #else
  1908. STATIC_CONST mat3 BT709_TO_BT2020 = mat3( //ref: ARIB STD-B62 and BT.2087
  1909. #endif
  1910. 0.6274, 0.3293, 0.0433,
  1911. 0.0691, 0.9195, 0.0114,
  1912. 0.0164, 0.0880, 0.8956
  1913. );
  1914. #ifdef D_PLATFORM_ORBIS
  1915. STATIC_CONST float3x3 BT2020_TO_BT709 = float3x3(
  1916. #else
  1917. STATIC_CONST mat3 BT2020_TO_BT709 = mat3(
  1918. #endif
  1919. 1.6605, -0.5877, -0.0728,
  1920. -0.1246, 1.1330, -0.0084,
  1921. -0.0182, -0.1006, 1.1187
  1922. );
  1923.  
  1924. //-----------------------------------------------------------------------------
  1925. ///
  1926. /// GammaCorrect
  1927. ///
  1928. //-----------------------------------------------------------------------------
  1929. vec3
  1930. GammaCorrectInput(
  1931. in vec3 lColourVec3 )
  1932. {
  1933. vec3 lCorrectColourVec3;
  1934.  
  1935. lCorrectColourVec3 = lColourVec3 * ( lColourVec3 * ( lColourVec3 * vec3( 0.305306011 ) + vec3( 0.682171111 ) ) + vec3( 0.012522878 ) );
  1936.  
  1937. return lCorrectColourVec3;
  1938. }
  1939.  
  1940.  
  1941. //-----------------------------------------------------------------------------
  1942. ///
  1943. /// GammaCorrect
  1944. ///
  1945. //-----------------------------------------------------------------------------
  1946. vec3
  1947. GammaCorrectOutput(
  1948. in vec3 lColourVec3 )
  1949. {
  1950. vec3 lCorrectColourVec3;
  1951.  
  1952. lCorrectColourVec3 = pow( lColourVec3, kGammaOutVec3 );
  1953.  
  1954. return lCorrectColourVec3;
  1955. }
  1956.  
  1957.  
  1958. //-----------------------------------------------------------------------------
  1959. ///
  1960. /// RGBToHSV
  1961. ///
  1962. //-----------------------------------------------------------------------------
  1963. vec3
  1964. RGBToHSV(
  1965. vec3 lRGB )
  1966. {
  1967. //vec4 p = mix( vec4(lRGB.bg, RGBToHSV_K.wz), vec4(lRGB.gb, RGBToHSV_K.xy), step(lRGB.b, lRGB.g) );
  1968. //vec4 q = mix( vec4(p.xyw, lRGB.r), vec4(lRGB.r, p.yzx), step(p.x, lRGB.r) );
  1969. // This variant is faster, since it generates conditional moves
  1970. vec4 p = lRGB.g < lRGB.b ? vec4(lRGB.bg, RGBToHSV_K.wz) : vec4(lRGB.gb, RGBToHSV_K.xy);
  1971. vec4 q = lRGB.r < p.x ? vec4(p.xyw, lRGB.r) : vec4(lRGB.r, p.yzx);
  1972. float d = q.x - min(q.w, q.y);
  1973. float e = 1.0e-10;
  1974. return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);
  1975. }
  1976.  
  1977.  
  1978. //-----------------------------------------------------------------------------
  1979. ///
  1980. /// HSVToRGB
  1981. ///
  1982. /// @brief http://lolengine.net/blog/2013/07/27/rgb-to-hsv-in-glsl
  1983. ///
  1984. //-----------------------------------------------------------------------------
  1985. vec3
  1986. HSVToRGB(
  1987. vec3 lHSV )
  1988. {
  1989. vec3 p = abs(fract(lHSV.xxx + HSVToRGB_K.xyz) * 6.0 - HSVToRGB_K.www);
  1990. return lHSV.z * mix(HSVToRGB_K.xxx, saturate(p - HSVToRGB_K.xxx), lHSV.y);
  1991. }
  1992.  
  1993.  
  1994.  
  1995. //-----------------------------------------------------------------------------
  1996. ///
  1997. /// HDR ( Perceptual Quantizer(PQ), Rec. 2020 color space. ) helpers
  1998. ///
  1999. //------------------------------------------------------------------------------
  2000.  
  2001. #ifdef D_PLATFORM_PC
  2002. float CndMask(bool cnd, float src0, float src1)
  2003. {
  2004. return cnd ? src0 : src1;
  2005. }
  2006. #endif
  2007.  
  2008. STATIC_CONST float kRefWhiteLevel = 100.0;
  2009.  
  2010. vec4 SRGB_OETF(vec4 L)
  2011. {
  2012. vec3 dark = L.xyz * 12.92;
  2013. vec3 light = 1.055 * pow(L.xyz, vec3(1.0 / 2.4)) - 0.055;
  2014.  
  2015. vec4 r;
  2016. r.x = CndMask(L.x <= 0.0031308, dark.x, light.x);
  2017. r.y = CndMask(L.y <= 0.0031308, dark.y, light.y);
  2018. r.z = CndMask(L.z <= 0.0031308, dark.z, light.z);
  2019. r.w = L.w;
  2020. return r;
  2021. }
  2022.  
  2023. vec4 SRGB_EOTF(vec4 E)
  2024. {
  2025. vec3 dark = E.xyz / 12.92;
  2026. vec3 light = pow((E.xyz + 0.055) / (1 + 0.055), vec3(2.4));
  2027. vec4 r;
  2028. r.x = CndMask(E.x <= 0.04045, dark.x, light.x);
  2029. r.y = CndMask(E.y <= 0.04045, dark.y, light.y);
  2030. r.z = CndMask(E.z <= 0.04045, dark.z, light.z);
  2031. r.w = E.w;
  2032. return r;
  2033. }
  2034.  
  2035. //apply gamma adjustment to (minL, maxL).
  2036. vec4 GammaAdjOOTF(vec4 L, float minLNits, float maxLNits, float gamma, bool inverse)
  2037. {
  2038. vec3 nits = L.xyz * kRefWhiteLevel;
  2039.  
  2040. vec4 i = vec4((nits - minLNits) / (maxLNits - minLNits), 1.0);
  2041. vec3 j;
  2042. if (inverse){
  2043. j = SRGB_EOTF(pow(i, vec4(1 / gamma))).xyz;
  2044. }
  2045. else{
  2046. j = pow(SRGB_OETF(i).xyz,vec3(gamma));
  2047. }
  2048. vec3 adj = (minLNits + (maxLNits - minLNits) * j) / kRefWhiteLevel;
  2049. vec4 ret;
  2050. ret.x = CndMask(nits.x >= minLNits && nits.x < maxLNits, adj.x, L.x);
  2051. ret.y = CndMask(nits.y >= minLNits && nits.y < maxLNits, adj.y, L.y);
  2052. ret.z = CndMask(nits.z >= minLNits && nits.z < maxLNits, adj.z, L.z);
  2053. ret.w = L.w;
  2054. return ret;
  2055. }
  2056.  
  2057. //input: normalized L in units of RefWhite (1.0=100nits), output: normalized E
  2058. vec4 PQ_OETF(vec4 L, uint gamma_adj, float gamma)
  2059. {
  2060. if (gamma_adj != 0)
  2061. L = GammaAdjOOTF(L, 0.0, 300.0, gamma, false);
  2062. const float c1 = 0.8359375;//3424.f/4096.f;
  2063. const float c2 = 18.8515625;//2413.f/4096.f*32.f;
  2064. const float c3 = 18.6875; //2392.f/4096.f*32.f;
  2065. const float m1 = 0.159301758125; //2610.f / 4096.f / 4;
  2066. const float m2 = 78.84375;// 2523.f / 4096.f * 128.f;
  2067. L = L * kRefWhiteLevel / 10000.0;
  2068. vec3 Lm1 = pow(L.xyz, vec3(m1));
  2069. vec3 X = (c1 + c2 * Lm1) / (1 + c3 * Lm1);
  2070. vec4 res = vec4(pow(X, vec3(m2)), L.w);
  2071. return res;
  2072. }
  2073.  
  2074. //input: normalized E (0.0, 1.0), output: normalized L in units of RefWhite
  2075. vec4 PQ_EOTF(vec4 E, uint gamma_adj, float gamma)
  2076. {
  2077. const float c1 = 0.8359375;//3424.f/4096.f;
  2078. const float c2 = 18.8515625;//2413.f/4096.f*32.f;
  2079. const float c3 = 18.6875; //2392.f/4096.f*32.f;
  2080. const float m1 = 0.159301758125; //2610.f / 4096.f / 4;
  2081. const float m2 = 78.84375;// 2523.f / 4096.f * 128.f;
  2082. vec3 M = c2 - c3 * pow(E.xyz, vec3(1 / m2));
  2083. vec3 N = max(pow(E.xyz, vec3(1 / m2)) - c1, 0);
  2084. vec3 L = pow(N / M, vec3(1 / m1)); //normalized nits (1.0 = 10000nits)
  2085. L = L * 10000.0 / kRefWhiteLevel; //convert to normalized L in units of RefWhite
  2086. return (gamma_adj !=0) ? GammaAdjOOTF(vec4(L, E.w), 0.0, 300.0, gamma, true) : vec4(L, E.w);
  2087.  
  2088. }
  2089.  
  2090. // PQ OETF fast approximation
  2091. // http://www.glowybits.com/blog/2017/01/04/ifl_iss_hdr_2/
  2092.  
  2093. vec3 PQ_OETF_Fast(vec3 x)
  2094. {
  2095. x = (x * (x * (x * (x * (x * 533095.76 + 47438306.2) + 29063622.1) + 575216.76) + 383.09104) + 0.000487781) /
  2096. (x * (x * (x * (x * 66391357.4 + 81884528.2) + 4182885.1) + 10668.404) + 1.0);
  2097. return x;
  2098. }
  2099.  
  2100. //-----------------------------------------------------------------------------
  2101. ///
  2102. /// BrightnessVibranceContrast
  2103. ///
  2104. //-----------------------------------------------------------------------------
  2105. vec3 BrightnessVibranceContrast(
  2106. vec3 lInputColour,
  2107. float lfBrightness,
  2108. float lfVibrance,
  2109. float lfContrast)
  2110. {
  2111. vec3 lBrtResult = lInputColour * lfBrightness;
  2112.  
  2113. // get lum
  2114. vec3 lLuma = vec3( dot(lBrtResult, vec3( 0.2125, 0.7154, 0.0721 )) );
  2115.  
  2116. // get saturation
  2117. float lfMaxCol = max( lBrtResult.r, max(lBrtResult.g, lBrtResult.b) );
  2118. float lfMinCol = min( lBrtResult.r, min(lBrtResult.g, lBrtResult.b) );
  2119. float lfCurSatV = lfMaxCol - lfMinCol;
  2120.  
  2121. // lerp by 1 + (1 - vibrance) - current saturation
  2122. float lfVibranceMix = (1.0 + (lfVibrance * (1.0 - (sign(lfVibrance) * lfCurSatV))));
  2123. vec3 lVibResult = mix( lLuma, lBrtResult, lfVibranceMix );
  2124.  
  2125. // lerp from mid gray for contrast
  2126. vec3 lContrastBase = vec3( 0.5, 0.5, 0.5 );
  2127. vec3 lConResult = mix( lContrastBase , lVibResult, lfContrast );
  2128.  
  2129. return lConResult;
  2130. }
  2131.  
  2132.  
  2133. //-----------------------------------------------------------------------------
  2134. ///
  2135. /// Desaturate
  2136. ///
  2137. //-----------------------------------------------------------------------------
  2138. vec3 Desaturate( vec3 color, float lfAmount )
  2139. {
  2140. vec3 gray = vec3( dot( vec3( 0.299, 0.587, 0.114 ), color) );
  2141. return mix( color, gray, lfAmount );
  2142. }
  2143.  
  2144.  
  2145. // improved rgb lerp by @stormoid
  2146. // https://www.shadertoy.com/view/lsdGzN
  2147. //---------------Improved RGB--------------
  2148.  
  2149. /*
  2150. The idea behind this function is to avoid the low saturation area in the
  2151. rgb color space. This is done by getting the direction to that diagonal
  2152. and displacing the interpolated color by it's inverse while scaling it
  2153. by saturation error and desired lightness.
  2154.  
  2155. I find it behaves very well under most circumstances, the only instance
  2156. where it doesn't behave ideally is when the hues are very close to 180
  2157. degrees apart, since the method I am using to find the displacement vector
  2158. does not compensate for non-curving motion. I tried a few things to
  2159. circumvent this problem but none were cheap and effective enough..
  2160. */
  2161.  
  2162. //Changes the strength of the displacement
  2163. #define DSP_STR 1.5
  2164.  
  2165. //-----------------------------------------------------------------------------
  2166. float _getsat( vec3 lColour )
  2167. {
  2168. float mi = min(min(lColour.x, lColour.y), lColour.z);
  2169. float ma = max(max(lColour.x, lColour.y), lColour.z);
  2170. return (ma - mi) / (ma + 1e-7);
  2171. }
  2172.  
  2173. vec3 NmzRgbLerp( vec3 a, vec3 b, float x )
  2174. {
  2175. // interpolated base color (with singularity fix)
  2176. vec3 ic = mix( a, b, x ) + vec3( 1e-6, 0.0, 0.0 );
  2177.  
  2178. // saturation difference from ideal scenario
  2179. float sd = abs( _getsat( ic ) - mix( _getsat( a ), _getsat( b ), x ) );
  2180.  
  2181. // displacement direction
  2182. vec3 dir = normalize(
  2183. vec3( 2.0 * ic.x - ic.y - ic.z,
  2184. 2.0 * ic.y - ic.x - ic.z,
  2185. 2.0 * ic.z - ic.y - ic.x )
  2186. );
  2187.  
  2188. // simple Lighntess
  2189. float lgt = dot( vec3( 1.0 ), ic );
  2190.  
  2191. // extra scaling factor for the displacement
  2192. float ff = dot( dir, normalize( ic ) );
  2193.  
  2194. // displace the color
  2195. ic += DSP_STR * dir * sd * ff * lgt;
  2196. return clamp( ic, 0.0, 1.0 );
  2197. }
  2198.  
  2199.  
  2200.  
  2201.  
  2202. //-----------------------------------------------------------------------------
  2203. ///
  2204. /// Inverse
  2205. ///
  2206. //-----------------------------------------------------------------------------
  2207. mat4
  2208. Inverse(
  2209. const mat4 lInMat4 )
  2210. {
  2211. #ifdef D_PLATFORM_PC
  2212. return inverse( lInMat4 );
  2213. #else
  2214. float det = determinant( lInMat4 );
  2215. det = 1.0f / det;
  2216.  
  2217. mat4 M = lInMat4;
  2218. mat4 IM;
  2219. IM[0][0] = det * ( M[1][2]*M[2][3]*M[3][1] - M[1][3]*M[2][2]*M[3][1] + M[1][3]*M[2][1]*M[3][2] - M[1][1]*M[2][3]*M[3][2] - M[1][2]*M[2][1]*M[3][3] + M[1][1]*M[2][2]*M[3][3] );
  2220. IM[0][1] = det * ( M[0][3]*M[2][2]*M[3][1] - M[0][2]*M[2][3]*M[3][1] - M[0][3]*M[2][1]*M[3][2] + M[0][1]*M[2][3]*M[3][2] + M[0][2]*M[2][1]*M[3][3] - M[0][1]*M[2][2]*M[3][3] );
  2221. IM[0][2] = det * ( M[0][2]*M[1][3]*M[3][1] - M[0][3]*M[1][2]*M[3][1] + M[0][3]*M[1][1]*M[3][2] - M[0][1]*M[1][3]*M[3][2] - M[0][2]*M[1][1]*M[3][3] + M[0][1]*M[1][2]*M[3][3] );
  2222. IM[0][3] = det * ( M[0][3]*M[1][2]*M[2][1] - M[0][2]*M[1][3]*M[2][1] - M[0][3]*M[1][1]*M[2][2] + M[0][1]*M[1][3]*M[2][2] + M[0][2]*M[1][1]*M[2][3] - M[0][1]*M[1][2]*M[2][3] );
  2223. IM[1][0] = det * ( M[1][3]*M[2][2]*M[3][0] - M[1][2]*M[2][3]*M[3][0] - M[1][3]*M[2][0]*M[3][2] + M[1][0]*M[2][3]*M[3][2] + M[1][2]*M[2][0]*M[3][3] - M[1][0]*M[2][2]*M[3][3] );
  2224. IM[1][1] = det * ( M[0][2]*M[2][3]*M[3][0] - M[0][3]*M[2][2]*M[3][0] + M[0][3]*M[2][0]*M[3][2] - M[0][0]*M[2][3]*M[3][2] - M[0][2]*M[2][0]*M[3][3] + M[0][0]*M[2][2]*M[3][3] );
  2225. IM[1][2] = det * ( M[0][3]*M[1][2]*M[3][0] - M[0][2]*M[1][3]*M[3][0] - M[0][3]*M[1][0]*M[3][2] + M[0][0]*M[1][3]*M[3][2] + M[0][2]*M[1][0]*M[3][3] - M[0][0]*M[1][2]*M[3][3] );
  2226. IM[1][3] = det * ( M[0][2]*M[1][3]*M[2][0] - M[0][3]*M[1][2]*M[2][0] + M[0][3]*M[1][0]*M[2][2] - M[0][0]*M[1][3]*M[2][2] - M[0][2]*M[1][0]*M[2][3] + M[0][0]*M[1][2]*M[2][3] );
  2227. IM[2][0] = det * ( M[1][1]*M[2][3]*M[3][0] - M[1][3]*M[2][1]*M[3][0] + M[1][3]*M[2][0]*M[3][1] - M[1][0]*M[2][3]*M[3][1] - M[1][1]*M[2][0]*M[3][3] + M[1][0]*M[2][1]*M[3][3] );
  2228. IM[2][1] = det * ( M[0][3]*M[2][1]*M[3][0] - M[0][1]*M[2][3]*M[3][0] - M[0][3]*M[2][0]*M[3][1] + M[0][0]*M[2][3]*M[3][1] + M[0][1]*M[2][0]*M[3][3] - M[0][0]*M[2][1]*M[3][3] );
  2229. IM[2][2] = det * ( M[0][1]*M[1][3]*M[3][0] - M[0][3]*M[1][1]*M[3][0] + M[0][3]*M[1][0]*M[3][1] - M[0][0]*M[1][3]*M[3][1] - M[0][1]*M[1][0]*M[3][3] + M[0][0]*M[1][1]*M[3][3] );
  2230. IM[2][3] = det * ( M[0][3]*M[1][1]*M[2][0] - M[0][1]*M[1][3]*M[2][0] - M[0][3]*M[1][0]*M[2][1] + M[0][0]*M[1][3]*M[2][1] + M[0][1]*M[1][0]*M[2][3] - M[0][0]*M[1][1]*M[2][3] );
  2231. IM[3][0] = det * ( M[1][2]*M[2][1]*M[3][0] - M[1][1]*M[2][2]*M[3][0] - M[1][2]*M[2][0]*M[3][1] + M[1][0]*M[2][2]*M[3][1] + M[1][1]*M[2][0]*M[3][2] - M[1][0]*M[2][1]*M[3][2] );
  2232. IM[3][1] = det * ( M[0][1]*M[2][2]*M[3][0] - M[0][2]*M[2][1]*M[3][0] + M[0][2]*M[2][0]*M[3][1] - M[0][0]*M[2][2]*M[3][1] - M[0][1]*M[2][0]*M[3][2] + M[0][0]*M[2][1]*M[3][2] );
  2233. IM[3][2] = det * ( M[0][2]*M[1][1]*M[3][0] - M[0][1]*M[1][2]*M[3][0] - M[0][2]*M[1][0]*M[3][1] + M[0][0]*M[1][2]*M[3][1] + M[0][1]*M[1][0]*M[3][2] - M[0][0]*M[1][1]*M[3][2] );
  2234. IM[3][3] = det * ( M[0][1]*M[1][2]*M[2][0] - M[0][2]*M[1][1]*M[2][0] + M[0][2]*M[1][0]*M[2][1] - M[0][0]*M[1][2]*M[2][1] - M[0][1]*M[1][0]*M[2][2] + M[0][0]*M[1][1]*M[2][2] );
  2235.  
  2236. return IM;
  2237. #endif
  2238. }
  2239.  
  2240. float
  2241. lengthSquared( vec3 lInVec3 )
  2242. {
  2243. return dot( lInVec3, lInVec3 );
  2244. }
  2245.  
  2246. #endif
  2247.  
  2248. ////////////////////////////////////////////////////////////////////////////////
  2249. ///
  2250. /// @file PostCommon.h
  2251. /// @author User
  2252. /// @date
  2253. ///
  2254. /// @brief PostCommon
  2255. ///
  2256. /// Copyright (c) 2008 Hello Games Ltd. All Rights Reserved.
  2257. ///
  2258. ////////////////////////////////////////////////////////////////////////////////
  2259.  
  2260. //-----------------------------------------------------------------------------
  2261. // Compilation defines
  2262.  
  2263.  
  2264. //-----------------------------------------------------------------------------
  2265. // Include files
  2266.  
  2267. // =================================================================================================
  2268.  
  2269. #ifndef D_DEFINES
  2270. #define D_DEFINES
  2271.  
  2272.  
  2273. // =================================================================================================
  2274. // Platform defines
  2275. // =================================================================================================
  2276. #ifdef D_PLATFORM_PC
  2277.  
  2278. #define D_ENABLE_REVERSEZ_PROJECTION (1)
  2279.  
  2280. #pragma optionNV(strict on)
  2281. #extension GL_ARB_gpu_shader5 : enable
  2282. #extension GL_ARB_fragment_coord_conventions : enable
  2283. #extension GL_ARB_derivative_control : enable
  2284.  
  2285.  
  2286. #if defined( D_FRAGMENT ) && defined( _F64_ )
  2287.  
  2288. layout(early_fragment_tests) in;
  2289.  
  2290. #endif
  2291.  
  2292. #elif defined(D_PLATFORM_ORBIS)
  2293.  
  2294. #define D_ENABLE_REVERSEZ_PROJECTION (1)
  2295.  
  2296. // use this with sdk 2.0 compiler
  2297. // #pragma argument (allow-scratch-buffer-spill)
  2298.  
  2299. //define these flags so they don't get ignored in build process and in the comb mask
  2300. //this is because materials, vertex layouts and shaders need to be synced on 360 to avoid patching
  2301. #ifdef _F27_
  2302. #endif
  2303. #ifdef _F28_
  2304. #endif
  2305. #ifdef _F29_
  2306. #endif
  2307. #ifdef _F21_
  2308. #endif
  2309. #ifdef _F02_
  2310. #endif
  2311. #ifdef _F03_
  2312. #endif
  2313. #if defined( _F01_ ) || defined( D_LOD0 ) || defined( D_LOD1 ) || defined( D_LOD2 ) || defined( D_LOD3) || defined( D_LOD4 )
  2314. #endif
  2315. #ifdef _F01_
  2316. #endif
  2317. #ifdef _F09_
  2318. #endif
  2319. #ifdef _F10_
  2320. #endif
  2321.  
  2322.  
  2323. // disable warnings for unused parameters. This happens a lot because of defining different things.
  2324. #pragma warning (disable: 5203)
  2325.  
  2326. // temp thing to know what things are still required on ps4.
  2327. #define D_PLATFORM_ORBIS_FIX
  2328.  
  2329. #ifdef __PSSL_CS__
  2330. #define D_PLATFORM_ORBIS_COMPUTE
  2331. #endif
  2332.  
  2333. #ifdef __PSSL_HS__
  2334. #define D_HULL
  2335. #endif
  2336.  
  2337. #ifdef __PSSL_DS__
  2338. #define D_DOMAIN
  2339. #endif
  2340.  
  2341. #ifdef __PSSL_VS__
  2342. #define D_VERTEX
  2343. #endif
  2344.  
  2345. #ifdef __PSSL_GS__
  2346. #define D_GEOMETRY
  2347. #endif
  2348.  
  2349. #endif
  2350.  
  2351. #if !D_ENABLE_REVERSEZ_PROJECTION
  2352. #define D_USING_LOGDEPTH
  2353. #endif
  2354.  
  2355.  
  2356. // =================================================================================================
  2357. // Basic Types
  2358. // =================================================================================================
  2359. #ifdef D_PLATFORM_PC
  2360.  
  2361. #define JOINT_TYPE vec4
  2362.  
  2363. //#define CONST const
  2364. #define STATIC_CONST const
  2365.  
  2366. #elif defined(D_PLATFORM_ORBIS)
  2367.  
  2368. #define JOINT_TYPE int4
  2369. #define float float
  2370. #define vec2 float2
  2371. #define vec3 float3
  2372. #define vec4 float4
  2373. #define ivec2 int2
  2374. #define ivec3 int3
  2375. #define ivec4 int4
  2376. #define uvec2 uint2
  2377. #define uvec3 uint3
  2378. #define uvec4 uint4
  2379. // NOTE:
  2380. // operator[] accesses rows, not columns
  2381. // matrix constructors interpret the passed vectors as row vectors, not column vectors
  2382. #define mat2 row_major float2x2
  2383. #define mat3 row_major float3x3
  2384. #define mat4 row_major float4x4
  2385.  
  2386. //#define CONST
  2387. #define STATIC_CONST static const
  2388. // #define const ERROR, DON'T USE CONST FOR PS4. USE STATIC_CONST INSTEAD FOR A COMPILED IN CONSTANT. OTHERWISE IT TRIES TO PUT IT IN A CONSTANT BUFFER AND FOR SOME REASON IT DOESN'T WORK.
  2389.  
  2390.  
  2391. #endif
  2392.  
  2393. // =================================================================================================
  2394. // Functions
  2395. // =================================================================================================
  2396. #ifdef D_PLATFORM_PC
  2397.  
  2398. #define saturate( V ) min( max( V, 0.0) , 1.0)
  2399. #define atan2( Y, X ) atan( Y, X )
  2400. #define invsqrt( X ) inversesqrt( X )
  2401.  
  2402. #ifdef D_COMPUTE
  2403.  
  2404. #define groupID gl_WorkGroupID
  2405. #define groupThreadID gl_LocalInvocationID
  2406. #define dispatchThreadID gl_GlobalInvocationID
  2407.  
  2408. #endif
  2409.  
  2410. #elif defined(D_PLATFORM_ORBIS)
  2411.  
  2412. #if defined(D_PLATFORM_ORBIS_COMPUTE)
  2413.  
  2414. float dFdx( float var ) { float delta = var - LaneSwizzle( var, 0x1f, 0, 1 ); return __v_cndmask_b32(0, 1, 0xAAAAAAAAAAAAAAAA ) ? delta : -delta; }
  2415. float dFdy( float var ) { float delta = var - LaneSwizzle( var, 0x1f, 0, 8 ); return __v_cndmask_b32(0, 1, 0xFF00FF00FF00FF00 ) ? delta : -delta; }
  2416.  
  2417. vec2 dFdx( vec2 var ) { vec2 delta = vec2( var.x - LaneSwizzle( var.x, 0x1f, 0, 1 ), var.y - LaneSwizzle( var.y, 0x1f, 0, 1 ) ); return __v_cndmask_b32(0, 1, 0xAAAAAAAAAAAAAAAA ) ? delta : -delta; }
  2418. vec2 dFdy( vec2 var ) { vec2 delta = vec2( var.x - LaneSwizzle( var.x, 0x1f, 0, 8 ), var.y - LaneSwizzle( var.y, 0x1f, 0, 8 ) ); return __v_cndmask_b32(0, 1, 0xFF00FF00FF00FF00 ) ? delta : -delta; }
  2419.  
  2420. vec3 dFdx( vec3 var ) { vec3 delta = vec3( var.x - LaneSwizzle( var.x, 0x1f, 0, 1 ), var.y - LaneSwizzle( var.y, 0x1f, 0, 1 ), var.z - LaneSwizzle( var.z, 0x1f, 0, 1 ) ); return __v_cndmask_b32(0, 1, 0xAAAAAAAAAAAAAAAA ) ? delta : -delta; }
  2421. vec3 dFdy( vec3 var ) { vec3 delta = vec3( var.x - LaneSwizzle( var.x, 0x1f, 0, 8 ), var.y - LaneSwizzle( var.y, 0x1f, 0, 8 ), var.z - LaneSwizzle( var.z, 0x1f, 0, 8 ) ); return __v_cndmask_b32(0, 1, 0xFF00FF00FF00FF00 ) ? delta : -delta; }
  2422.  
  2423. vec4 dFdx( vec4 var ) { vec4 delta = vec4( var.x - LaneSwizzle( var.x, 0x1f, 0, 1 ), var.y - LaneSwizzle( var.y, 0x1f, 0, 1 ), var.z - LaneSwizzle( var.z, 0x1f, 0, 1 ), var.z - LaneSwizzle( var.w, 0x1f, 0, 1 ) ); return __v_cndmask_b32(0, 1, 0xAAAAAAAAAAAAAAAA ) ? delta : -delta; }
  2424. vec4 dFdy( vec4 var ) { vec4 delta = vec4( var.x - LaneSwizzle( var.x, 0x1f, 0, 8 ), var.y - LaneSwizzle( var.y, 0x1f, 0, 8 ), var.z - LaneSwizzle( var.z, 0x1f, 0, 8 ), var.z - LaneSwizzle( var.w, 0x1f, 0, 8 ) ); return __v_cndmask_b32(0, 1, 0xFF00FF00FF00FF00 ) ? delta : -delta; }
  2425.  
  2426.  
  2427. #define dFdxFine dFdx
  2428. #define dFdyFine dFdy
  2429.  
  2430. #else
  2431.  
  2432. #define dFdx ddx
  2433. #define dFdy ddy
  2434. #define dFdxFine ddx_fine
  2435. #define dFdyFine ddy_fine
  2436.  
  2437. #endif
  2438.  
  2439. #define mix lerp
  2440. #define fract frac
  2441. #define mod fmod
  2442. #define saturate( V ) ( min( max( V, 0.0) , 1.0) )
  2443. #define invsqrt( X ) rsqrt( X )
  2444.  
  2445. #endif
  2446.  
  2447.  
  2448. // =================================================================================================
  2449. // Samplers and textures
  2450. // =================================================================================================
  2451. #ifdef D_PLATFORM_PC
  2452.  
  2453. #define shadow2D( S, UV ) texture( S, UV )
  2454.  
  2455. #define SAMPLER2DSHADOW( NAME, REG ) uniform sampler2DShadow NAME
  2456.  
  2457. #define SAMPLERCUBE( NAME ) samplerCube NAME
  2458. #define SAMPLERCUBEARG( NAME ) in samplerCube NAME
  2459. #define SAMPLERCUBEPARAM( NAME ) NAME
  2460.  
  2461. #define imageAtomicAddOut( T, C, V, O ) O = imageAtomicAdd( T, C, V )
  2462.  
  2463. #if defined( D_TEXTURE_FEEDBACK )
  2464.  
  2465. #define texture2D( T, C ) Tex2dFeedback( T, T##FB, C )
  2466.  
  2467. #define texture2DLod( T, C, N ) Tex2dLodFeedback( T, T##FB, C, N )
  2468. #define texture2DArray( T, C ) Tex2dArrayFeedback( T, T##FB, C )
  2469.  
  2470. #define texture3D( S, UV ) Tex3dFeedback( S, S##FB, UV )
  2471. #define texture3DLod( S, UV, LOD ) Tex3dLodFeedback( S, S##FB, UV, LOD )
  2472.  
  2473. #define SAMPLER2DARG( NAME ) in sampler2D NAME, in int NAME##FB
  2474. #define SAMPLER2DPARAM( NAME ) NAME, NAME##FB
  2475.  
  2476. #define SAMPLER2DARRAYARG( NAME ) in sampler2DArray NAME, in int NAME##FB
  2477. #define SAMPLER2DARRAYPARAM( NAME ) NAME, NAME##FB
  2478.  
  2479. #define SAMPLER2D( NAME ) sampler2D NAME; int NAME##FB
  2480. #define SAMPLER2DARRAY( NAME ) sampler2DArray NAME; int NAME##FB
  2481. #define SAMPLER3D( NAME ) sampler3D NAME; int NAME##FB
  2482. #define SAMPLER2DSHADOW_SRT( NAME ) sampler2DShadow NAME; int NAME##FB
  2483.  
  2484. #else
  2485.  
  2486. #define texture2DLod( S, UV, LOD ) textureLod( S, UV, LOD )
  2487. #define texture3DLod( S, UV, LOD ) textureLod( S, UV, LOD )
  2488.  
  2489. #define SAMPLER2DARG( NAME ) in sampler2D NAME
  2490. #define SAMPLER2DPARAM( NAME ) NAME
  2491.  
  2492. #define SAMPLER2DARRAYARG( NAME ) in sampler2DArray NAME
  2493. #define SAMPLER2DARRAYPARAM( NAME ) NAME
  2494.  
  2495. #define SAMPLER2D( NAME ) sampler2D NAME
  2496. #define SAMPLER2DARRAY( NAME ) sampler2DArray NAME
  2497. #define SAMPLER3D( NAME ) sampler3D NAME
  2498. #define SAMPLER2DSHADOW_SRT( NAME ) sampler2DShadow NAME
  2499. #endif
  2500.  
  2501. #define textureGatherRed( lTex, lSamp ) textureGather( lTex, lSamp, 0 )
  2502. #define textureGatherGreen( lTex, lSamp ) textureGather( lTex, lSamp, 1 )
  2503. #define textureGatherBlue( lTex, lSamp ) textureGather( lTex, lSamp, 2 )
  2504. #define textureGatherAlpha( lTex, lSamp ) textureGather( lTex, lSamp, 3 )
  2505.  
  2506. #define texture2DComputeGrad( T, C ) texture2D( T, C )
  2507.  
  2508. #elif defined(D_PLATFORM_ORBIS)
  2509.  
  2510. #define SAMPLERCUBE( NAME, REG ) SamplerState NAME##SS : register( s##REG ); TextureCube NAME##TU : register( t##REG )
  2511.  
  2512. #define SAMPLER2D( NAME ) Texture2D NAME; SamplerState NAME##SS
  2513. #define SAMPLER2DSHADOW_SRT( NAME ) Texture2D NAME; SamplerComparisonState NAME##SS //SAMPLER2D( NAME )
  2514. #define SAMPLER3D( NAME ) Texture3D NAME; SamplerState NAME##SS
  2515.  
  2516.  
  2517. #define SAMPLER2DARRAY( NAME ) Texture2D_Array NAME; SamplerState NAME##SS
  2518. #define SAMPLER2DARRAYARG( NAME ) Texture2D_Array NAME, SamplerState NAME##SS
  2519. #define SAMPLER2DARRAYPARAM( NAME ) NAME, NAME##SS
  2520.  
  2521. #define SAMPLER2DPARAM( NAME ) NAME, NAME##SS
  2522. #define SAMPLER2DARG( NAME ) Texture2D NAME, SamplerState NAME##SS
  2523.  
  2524. #define texture2D( T, C ) T.Sample( T##SS, C )
  2525.  
  2526. #if defined(D_PLATFORM_ORBIS_COMPUTE)
  2527. #define texture2DComputeGrad( T, C ) T.SampleGradient( T##SS, C, vec2( dFdx( C ) ), vec2( dFdy( C ) ) )
  2528. #define shadow2D( T, C ) T.SampleCmpLOD0( T##SS, C.xy, C.z )
  2529. #else
  2530. #define texture2DComputeGrad( T, C ) T.Sample( T##SS, C )
  2531. #define shadow2D( T, C ) T.SampleCmp( T##SS, C.xy, C.z )
  2532. #endif
  2533.  
  2534. #define texture2DLod( T, C, N ) T.SampleLOD( T##SS, C, N )
  2535. #define texture2DArray( T, C ) T.Sample( T##SS, C )
  2536. #define texture3DLod( T, C, N ) T.SampleLOD( T##SS, C, N )
  2537.  
  2538. //#define shadow2D( T, C ) vec3( C.z > T.Sample( T##SS, C.xy ).x ? 1.0 : 0.0 )
  2539. //#define shadow2D( T, C ) T.GatherCmp( T##SS, C.xy, C.z )
  2540. //#define shadow2D( T, C ) T.SampleCmpLOD0( T##SS, C.xy, C.z )
  2541. #define textureCube( T, C ) T##TU.Sample( T##SS, C )
  2542. #define textureCubeLod( T, C, N ) T##TU.Sample( T##SS, C, N )
  2543. #define textureGrad( T, C, DDX, DDY ) T.SampleGradient( T##SS, C, DDX, DDY )
  2544.  
  2545. #define imageAtomicAdd( T, C, V ) AtomicAdd( T[ C ], V )
  2546. #define imageAtomicAddOut( T, C, V, O ) AtomicAdd( T[ C ], V, O )
  2547.  
  2548. #define imageStore( T, C, V ) ( T[C] = V )
  2549.  
  2550. #define textureGatherRed( lTex, lSamp ) lTex.GatherRed ( lTex##SS, lSamp )
  2551. #define textureGatherGreen( lTex, lSamp ) lTex.GatherGreen( lTex##SS, lSamp )
  2552. #define textureGatherBlue( lTex, lSamp ) lTex.GatherBlue ( lTex##SS, lSamp )
  2553. #define textureGatherAlpha( lTex, lSamp ) lTex.GatherAlpha( lTex##SS, lSamp )
  2554.  
  2555. #define texelFetch( lTex, lSamp, lLod ) lTex.MipMaps((lLod), (lSamp))
  2556.  
  2557. #endif
  2558.  
  2559.  
  2560. #if defined(D_PLATFORM_ORBIS_COMPUTE)
  2561.  
  2562. #define THREADGROUP_LOCAL thread_group_memory
  2563. #define THREADGROUP_BARRIER ThreadGroupMemoryBarrier()
  2564.  
  2565. #elif defined(D_PLATFORM_PC_COMPUTE)
  2566.  
  2567. #define THREADGROUP_LOCAL layout( shared )
  2568. #define THREADGROUP_BARRIER groupMemoryBarrier()
  2569.  
  2570. #endif
  2571.  
  2572. // =================================================================================================
  2573. // Matrices
  2574. // =================================================================================================
  2575. #ifdef D_PLATFORM_PC
  2576.  
  2577. #define MUL( INPUT_A, INPUT_B ) (INPUT_A * INPUT_B)
  2578. #define PLATFORM_TRANSPOSE
  2579. #define MAT4_SET_POS( M, P ) M[ 3 ] = P
  2580. #define MAT4_SET_TRANSLATION( M, T ) M[ 3 ].xyz = T
  2581. #define MAT4_GET_COLUMN( M, C ) M[ C ].xyz
  2582. #define MAT3_GET_COLUMN( M, C ) M[ C ]
  2583. #define MAT4_GET_COLUMN_VEC4( M, C ) M[ C ]
  2584.  
  2585. #define MAT3_SET_COLUMN( M, C, V ) M[ C ] = V;
  2586. #define MAT4_SET_COLUMN( M, C, V ) M[ C ] = V;
  2587.  
  2588. #elif defined(D_PLATFORM_ORBIS)
  2589.  
  2590. #define MUL( INPUT_A, INPUT_B ) mul( INPUT_B, INPUT_A )
  2591. #define PLATFORM_TRANSPOSE
  2592. #define MAT4_SET_POS( M, P ) M[ 3 ] = P
  2593. #define MAT4_SET_TRANSLATION( M, T ) M[ 3 ].xyz = T
  2594. #define MAT4_GET_COLUMN( M, C ) M[ C ].xyz
  2595. #define MAT3_GET_COLUMN( M, C ) M[ C ]
  2596. #define MAT4_GET_COLUMN_VEC4( M, C ) M[ C ]
  2597.  
  2598. #define MAT3_SET_COLUMN( M, C, V ) M[ C ] = V;
  2599. #define MAT4_SET_COLUMN( M, C, V ) M[ C ] = V;
  2600.  
  2601. #endif
  2602.  
  2603. // =================================================================================================
  2604. // Arrays (workaround AMD shader compiler issues by making arrays have global scope)
  2605. // =================================================================================================
  2606.  
  2607. #if defined(D_PLATFORM_ORBIS)
  2608.  
  2609. #define ARRAY_LOOKUP_FS( _UNIFORMS, _ELEMENT, _INDEX) _UNIFORMS._ELEMENT[_INDEX]
  2610. #define ARRAY_LOOKUP_FP( _UNIFORMS, _ELEMENT, _INDEX) _UNIFORMS._ELEMENT[_INDEX]
  2611.  
  2612. #else
  2613.  
  2614. #define ARRAY_LOOKUP_FS( _UNIFORMS, _ELEMENT, _INDEX) _ELEMENT[_INDEX]
  2615. #define ARRAY_LOOKUP_FP( _UNIFORMS, _ELEMENT, _INDEX) _ELEMENT[_INDEX]
  2616.  
  2617. #endif
  2618.  
  2619.  
  2620. // =================================================================================================
  2621. // Input and Output
  2622. // =================================================================================================
  2623. #ifdef D_PLATFORM_PC
  2624.  
  2625. #define UNIFORM( TYPE, NAME ) uniform TYPE NAME
  2626. #define UNIFORM_SRT( TYPE, NAME ) uniform TYPE NAME
  2627.  
  2628. #define DECLARE_INPUT
  2629. #define DECLARE_OUTPUT
  2630. #define DECLARE_END
  2631. #define DECLARE_PTR( TYPE, NAME ) TYPE NAME;
  2632.  
  2633. #define DECLARE_PATCH_INPUT_TRI
  2634. #define DECLARE_PATCH_OUTPUT_TRI
  2635. #define IN_PATCH_TRI_TESS_CONSTANTS
  2636. #define OUT_PATCH_TRI_TESS_CONSTANTS
  2637.  
  2638. #define DECLARE_PATCH_INPUT_QUAD
  2639. #define DECLARE_PATCH_OUTPUT_QUAD
  2640. #define IN_PATCH_QUAD_TESS_CONSTANTS
  2641. #define OUT_PATCH_QUAD_TESS_CONSTANTS
  2642.  
  2643. #if defined( D_HULL )
  2644.  
  2645. #define INPUT( TYPE, NAME, REG ) in TYPE NAME [];
  2646. #define INPUT_NOINTERP( TYPE, NAME, REG ) flat in TYPE NAME [];
  2647. #define INPUT_NOPERSP( TYPE, NAME, REG ) in TYPE NAME [];
  2648.  
  2649. #define PATCH_OUTPUT( TYPE, NAME, REG ) patch out TYPE NAME;
  2650. #define OUTPUT( TYPE, NAME, REG ) out TYPE NAME [];
  2651. #define OUTPUT_NOINTERP( TYPE, NAME, REG ) flat out TYPE NAME [];
  2652. #define OUTPUT_NOPERSP( TYPE, NAME, REG ) out TYPE NAME [];
  2653.  
  2654. #elif defined( D_DOMAIN )
  2655.  
  2656. #define PATCH_INPUT( TYPE, NAME, REG ) patch in TYPE NAME;
  2657. #define INPUT( TYPE, NAME, REG ) in TYPE NAME [];
  2658. #define INPUT_NOINTERP( TYPE, NAME, REG ) flat in TYPE NAME [];
  2659. #define INPUT_NOPERSP( TYPE, NAME, REG ) in TYPE NAME [];
  2660.  
  2661. #define OUTPUT( TYPE, NAME, REG ) out TYPE NAME;
  2662. #define OUTPUT_NOINTERP( TYPE, NAME, REG ) flat out TYPE NAME;
  2663. #define OUTPUT_NOPERSP( TYPE, NAME, REG ) out TYPE NAME;
  2664.  
  2665. #else
  2666.  
  2667. #define INPUT( TYPE, NAME, REG ) in TYPE NAME;
  2668. #define INPUT_NOINTERP( TYPE, NAME, REG ) flat in TYPE NAME;
  2669. #define INPUT_NOPERSP( TYPE, NAME, REG ) in TYPE NAME;
  2670.  
  2671. #define OUTPUT( TYPE, NAME, REG ) out TYPE NAME;
  2672. #define OUTPUT_NOINTERP( TYPE, NAME, REG ) flat out TYPE NAME;
  2673. #define OUTPUT_NOPERSP( TYPE, NAME, REG ) out TYPE NAME;
  2674.  
  2675. #endif
  2676.  
  2677. #define FRAGMENT_COLOUR_UVEC4_DEFINE layout(location = 0) out uvec4 outu_color0;
  2678. #define FRAGMENT_COLOUR_UVEC4 outu_color0
  2679.  
  2680. #define FRAGMENT_COLOUR out_color0
  2681. #define FRAGMENT_COLOUR0 out_color0
  2682. #define FRAGMENT_COLOUR1 out_color1
  2683. #define FRAGMENT_COLOUR2 out_color2
  2684. #define FRAGMENT_COLOUR3 out_color3
  2685. #define FRAGMENT_COLOUR4 out_color4
  2686. #if defined( D_TAA_RENDER_TARGETS )
  2687. #define FRAGMENT_COLOUR_VEC4_DEFINE layout(location = 0) out vec4 out_color0; layout(location = 1) out vec4 out_color1; layout(location = 2) out vec4 out_color2;
  2688. #elif !defined(D_ATTRIBUTES)
  2689. #define FRAGMENT_COLOUR_VEC4_DEFINE layout(location = 0) out vec4 out_color0;
  2690. #else
  2691. #define FRAGMENT_COLOUR_VEC4_DEFINE layout(location = 0) out vec4 out_color0; layout(location = 1) out vec4 out_color1; layout(location = 2) out vec4 out_color2; layout(location = 3) out vec4 out_color3; layout(location = 4) out vec4 out_color4;
  2692. #endif
  2693. #define FRAGMENT_COLOUR01_VEC4_DEFINE layout(location = 0) out vec4 out_color0; layout(location = 1) out vec4 out_color1;
  2694.  
  2695. #define FRAGMENT_DEPTH gl_FragDepth
  2696. #define FRAGMENT_FRONTFACE gl_FrontFacing
  2697. #define INPUT_FRONTFACING
  2698.  
  2699. #define DEREF_PTR( VAR ) VAR
  2700.  
  2701. #if defined( D_HULL )
  2702.  
  2703. #define IN( VAR ) VAR[ gl_InvocationID ]
  2704. #define OUT( VAR ) VAR[ gl_InvocationID ]
  2705. #define PATCH_OUT( VAR ) VAR
  2706.  
  2707. #define OUTPUT_VERTEX_SCREEN_POSITION gl_out[ gl_InvocationID ].gl_Position
  2708. #define INPUT_VERTEX_SCREEN_POSITION gl_in [ gl_InvocationID ].gl_Position
  2709.  
  2710. #define TESS_LEVEL_EDGE( IND ) gl_TessLevelOuter[ IND ]
  2711. #define TESS_LEVEL_INNER( IND ) gl_TessLevelInner[ IND ]
  2712.  
  2713. #elif defined( D_DOMAIN )
  2714.  
  2715. #define PATCH_IN( VAR, IND ) VAR[ IND ]
  2716. #define IN( VAR, IND ) VAR[ IND ]
  2717. #define OUT( VAR ) VAR
  2718.  
  2719. #define INPUT_VERTEX_SCREEN_POSITION( IND ) gl_in [ IND ].gl_Position
  2720.  
  2721. #define DOMAIN_COORDS gl_TessCoord
  2722.  
  2723. #elif defined( D_GEOMETRY )
  2724.  
  2725. #define OUTPUT_VERTEX_SCREEN_POSITION gl_Position
  2726. #define INPUT_VERTEX_SCREEN_POSITION( IND ) gl_in [ IND ].gl_Position
  2727. #define IN( VAR, IND ) VAR[ IND ]
  2728. #define OUT( VAR ) VAR
  2729.  
  2730. #else
  2731.  
  2732. #define IN( VAR ) VAR
  2733. #define OUT( VAR ) VAR
  2734.  
  2735. #endif
  2736.  
  2737. #define OUT_VERTEX_SCREEN_POSITION
  2738. #define IN_SCREEN_POSITION
  2739.  
  2740. #define VERTEX_SCREEN_POSITION gl_Position
  2741.  
  2742. #elif defined(D_PLATFORM_ORBIS_COMPUTE)
  2743.  
  2744. #define DECLARE_INPUT struct cInput {
  2745. #define DECLARE_END };
  2746. #define DECLARE_PTR( TYPE, NAME ) TYPE* NAME;
  2747.  
  2748. #define INPUT( TYPE, NAME, REG ) TYPE NAME : REG;
  2749. #define INPUT_NOINTERP( TYPE, NAME, REG ) TYPE NAME : REG;
  2750.  
  2751. #define IN_SCREEN_POSITION
  2752.  
  2753. #define FRAGMENT_COLOUR lUniforms.mpCmpOutPerMesh.gOutTexture0[dispatchThreadID.xy]
  2754. #define FRAGMENT_COLOUR0 lUniforms.mpCmpOutPerMesh.gOutTexture0[dispatchThreadID.xy]
  2755. #define FRAGMENT_COLOUR1 lUniforms.mpCmpOutPerMesh.gOutTexture1[dispatchThreadID.xy]
  2756. #define FRAGMENT_COLOUR2 lUniforms.mpCmpOutPerMesh.gOutTexture2[dispatchThreadID.xy]
  2757. #define FRAGMENT_COLOUR3 lUniforms.mpCmpOutPerMesh.gOutTexture3[dispatchThreadID.xy]
  2758. #define FRAGMENT_COLOUR4 lUniforms.mpCmpOutPerMesh.gOutTexture4[dispatchThreadID.xy]
  2759. #define FRAGMENT_DEPTH lUniforms.mpCmpOutPerMesh.gOutTextureDepth[dispatchThreadID.xy]
  2760.  
  2761. #define DEREF_PTR( VAR ) *VAR
  2762.  
  2763. #elif defined(D_PLATFORM_ORBIS)
  2764.  
  2765. #define UNIFORM( TYPE, NAME ) ConstantBuffer NAME##CB{ TYPE NAME; };
  2766. #define UNIFORM_SRT( TYPE, NAME ) ConstantBuffer NAME##CB{ TYPE NAME : S_SRT_DATA; };
  2767.  
  2768. #define DECLARE_OUTPUT struct cOutput {
  2769. #define DECLARE_INPUT struct cInput {
  2770. #define DECLARE_END };
  2771. #define DECLARE_PTR( TYPE, NAME ) TYPE* NAME;
  2772.  
  2773. #define INPUT( TYPE, NAME, REG ) TYPE NAME : REG;
  2774. #define INPUT_NOINTERP( TYPE, NAME, REG ) nointerp TYPE NAME : REG;
  2775. #define INPUT_NOPERSP( TYPE, NAME, REG ) nopersp TYPE NAME : REG;
  2776.  
  2777. #define OUTPUT( TYPE, NAME, REG ) TYPE NAME : REG;
  2778. #define OUTPUT_NOINTERP( TYPE, NAME, REG ) nointerp TYPE NAME : REG;
  2779. #define OUTPUT_NOPERSP( TYPE, NAME, REG ) nopersp TYPE NAME : REG;
  2780.  
  2781. #define FRAGMENT_COLOUR_UVEC4_DEFINE
  2782. #define FRAGMENT_COLOUR_UVEC4 Out.mColour
  2783. #define FRAGMENT_COLOUR Out.mColour
  2784. #define FRAGMENT_COLOUR0 Out.mColour0
  2785. #define FRAGMENT_COLOUR1 Out.mColour1
  2786. #define FRAGMENT_COLOUR2 Out.mColour2
  2787. #define FRAGMENT_COLOUR3 Out.mColour3
  2788. #define FRAGMENT_COLOUR4 Out.mColour4
  2789. #define FRAGMENT_DEPTH Out.mDepth
  2790.  
  2791. #define FRAGMENT_FRONTFACE In.mbFrontFacing
  2792. #define INPUT_FRONTFACING bool mbFrontFacing : S_FRONT_FACE;
  2793.  
  2794. #if defined( D_HULL )
  2795.  
  2796. #define IN( VAR ) In[ uCPID ].VAR
  2797. #define OUT( VAR ) Out.VAR
  2798. #define PATCH_OUT( VAR ) Out.VAR
  2799.  
  2800. #define OUTPUT_VERTEX_SCREEN_POSITION OUT( mScreenPositionVec4 )
  2801. #define INPUT_VERTEX_SCREEN_POSITION IN( mScreenPositionVec4 )
  2802.  
  2803. #define TESS_LEVEL_EDGE( IND ) Out.edge_ts[ IND ]
  2804. #define TESS_LEVEL_INNER( IND ) Out.insi_ts[ IND ]
  2805.  
  2806. #define DECLARE_PATCH_OUTPUT_TRI [DOMAIN_PATCH_TYPE("tri")] struct HSConstantOutputData {
  2807. #define OUT_PATCH_TRI_TESS_CONSTANTS float edge_ts[3] : S_EDGE_TESS_FACTOR; \
  2808. float insi_ts[1] : S_INSIDE_TESS_FACTOR;
  2809.  
  2810. #define DECLARE_PATCH_OUTPUT_QUAD [DOMAIN_PATCH_TYPE("quad")] struct HSConstantOutputData (
  2811. #define OUT_PATCH_QUAD_TESS_CONSTANTS float edge_ts[4] : S_EDGE_TESS_FACTOR; \
  2812. float insi_ts[2] : S_INSIDE_TESS_FACTOR;
  2813.  
  2814. #define PATCH_OUTPUT( TYPE, NAME, REG ) TYPE NAME : REG;
  2815.  
  2816. #elif defined( D_DOMAIN )
  2817.  
  2818. #define PATCH_IN( VAR, IND ) patchIn.VAR
  2819. #define IN( VAR, IND ) In[ IND ].VAR
  2820. #define OUT( VAR ) Out.VAR
  2821.  
  2822. #define OUTPUT_VERTEX_SCREEN_POSITION OUT( mScreenPositionVec4 )
  2823. #define INPUT_VERTEX_SCREEN_POSITION( IND ) IN( mScreenPositionVec4, IND )
  2824.  
  2825. #define DOMAIN_COORDS domainCoordinates
  2826.  
  2827. #define DECLARE_PATCH_INPUT_TRI [DOMAIN_PATCH_TYPE("tri")] struct HSConstantOutputData {
  2828. #define IN_PATCH_TRI_TESS_CONSTANTS float edge_ts[3] : S_EDGE_TESS_FACTOR; \
  2829. float insi_ts[1] : S_INSIDE_TESS_FACTOR;
  2830.  
  2831. #define DECLARE_PATCH_INPUT_QUAD [DOMAIN_PATCH_TYPE("quad")] struct HSConstantOutputData {
  2832. #define IN_PATCH_QUAD_TESS_CONSTANTS float edge_ts[4] : S_EDGE_TESS_FACTOR; \
  2833. float insi_ts[2] : S_INSIDE_TESS_FACTOR;
  2834.  
  2835. #define PATCH_INPUT( TYPE, NAME, REG ) TYPE NAME : REG;
  2836.  
  2837. #elif defined( D_GEOMETRY )
  2838.  
  2839. #define IN( VAR, IND ) In[ IND ].VAR
  2840. #define OUT( VAR ) Out.VAR
  2841.  
  2842. #define OUTPUT_VERTEX_SCREEN_POSITION OUT( mScreenPositionVec4 )
  2843. #define INPUT_VERTEX_SCREEN_POSITION( IND ) IN( mScreenPositionVec4, IND )
  2844.  
  2845. #define EMIT_VERTEX TriStream.Append( Out )
  2846. #define END_PRIMITIVE TriStream.RestartStrip()
  2847.  
  2848. #else
  2849.  
  2850. #define IN( VAR ) In.VAR
  2851. #define OUT( VAR ) Out.VAR
  2852.  
  2853. #endif
  2854.  
  2855.  
  2856. // TODO get rid of this - don't pass struct through functinos, pass members.
  2857. #define DEREF_PTR( VAR ) *VAR
  2858.  
  2859.  
  2860. #define OUT_VERTEX_SCREEN_POSITION OUTPUT( vec4, mScreenPositionVec4, S_POSITION )
  2861. #define IN_SCREEN_POSITION INPUT ( vec4, mScreenPositionVec4, S_POSITION )
  2862. #define VERTEX_SCREEN_POSITION OUT( mScreenPositionVec4 )
  2863.  
  2864. #endif
  2865.  
  2866. // =================================================================================================
  2867. // Main
  2868. // =================================================================================================
  2869. #ifdef D_PLATFORM_PC
  2870.  
  2871. #define VERTEX_MAIN void main( void )
  2872. #define VERTEX_MAIN_SRT uniform UniformBuffer lUniforms; void main( void )
  2873.  
  2874. #define HULL_TRI_MAIN_SRT layout( vertices = 3 ) out; uniform UniformBuffer lUniforms; void main( void )
  2875. #define HULL_QUAD_MAIN_SRT layout( vertices = 4 ) out; uniform UniformBuffer lUniforms; void main( void )
  2876.  
  2877. #define DOMAIN_TRI_MAIN_SRT layout( triangles, fractional_even_spacing ) in; uniform UniformBuffer lUniforms; void main( void )
  2878. #define DOMAIN_QUAD_MAIN_SRT layout( quads, fractional_even_spacing ) in; uniform UniformBuffer lUniforms; void main( void )
  2879.  
  2880. #define FRAGMENT_MAIN_COLOUR FRAGMENT_COLOUR_VEC4_DEFINE void main( void )
  2881. #define VOID_MAIN_COLOUR FRAGMENT_COLOUR_VEC4_DEFINE void main( void )
  2882. #define FRAGMENT_MAIN_COLOUR_DEPTH FRAGMENT_COLOUR_VEC4_DEFINE void main( void )
  2883.  
  2884. #define FRAGMENT_MAIN_COLOUR_DEPTH_SRT FRAGMENT_COLOUR_VEC4_DEFINE uniform UniformBuffer lUniforms; void main( void )
  2885. #define FRAGMENT_MAIN_COLOUR_DEPTH_GE_SRT FRAGMENT_COLOUR_VEC4_DEFINE uniform UniformBuffer lUniforms; void main( void )
  2886. #define FRAGMENT_MAIN_COLOUR_DEPTH_LE_SRT FRAGMENT_COLOUR_VEC4_DEFINE uniform UniformBuffer lUniforms; void main( void )
  2887. #define FRAGMENT_MAIN_COLOUR_SRT FRAGMENT_COLOUR_VEC4_DEFINE uniform UniformBuffer lUniforms; void main( void )
  2888. #define FRAGMENT_MAIN_COLOUR_EARLYZ_SRT FRAGMENT_COLOUR_VEC4_DEFINE uniform UniformBuffer lUniforms; void main( void )
  2889. #define FRAGMENT_MAIN_UICOLOUR_SRT FRAGMENT_COLOUR_UVEC4_DEFINE uniform UniformBuffer lUniforms; void main( void )
  2890.  
  2891. #define VOID_MAIN_SRT FRAGMENT_COLOUR_VEC4_DEFINE uniform UniformBuffer lUniforms; void main( void )
  2892. #define VOID_MAIN_DEPTH_SRT FRAGMENT_COLOUR_VEC4_DEFINE uniform UniformBuffer lUniforms; void main( void )
  2893.  
  2894. #define FRAGMENT_MAIN_COLOUR01_SRT FRAGMENT_COLOUR01_VEC4_DEFINE uniform UniformBuffer lUniforms; void main( void )
  2895. #define FRAGMENT_MAIN_COLOUR01_DEPTH_SRT FRAGMENT_COLOUR01_VEC4_DEFINE uniform UniformBuffer lUniforms; void main( void )
  2896.  
  2897. #elif defined( D_PLATFORM_PC_COMPUTE )
  2898.  
  2899. #define COMPUTE_MAIN_SRT( X, Y, Z ) layout (local_size_x = X, local_size_y = Y, local_size_z = Z) in; void main( void )
  2900.  
  2901. #define FRAGMENT_MAIN_COLOUR_SRT COMPUTE_MAIN_SRT( 8,8,1 )
  2902. #define FRAGMENT_MAIN_COLOUR01_SRT COMPUTE_MAIN_SRT( 8,8,1 )
  2903. #define FRAGMENT_MAIN_COLOUR_DEPTH_SRT COMPUTE_MAIN_SRT( 8,8,1 )
  2904.  
  2905. #elif defined( D_PLATFORM_ORBIS_COMPUTE )
  2906.  
  2907. #define COMPUTE_MAIN_SRT( X, Y, Z ) [NUM_THREADS(X, Y, Z)] void main(uint3 groupID : S_GROUP_ID, uint3 groupThreadID : S_GROUP_THREAD_ID, uint3 dispatchThreadID : S_DISPATCH_THREAD_ID, UniformBuffer lUniforms : S_SRT_DATA)
  2908.  
  2909. #define FRAGMENT_MAIN_COLOUR_SRT COMPUTE_MAIN_SRT( 8,8,1 )
  2910. #define FRAGMENT_MAIN_COLOUR01_SRT COMPUTE_MAIN_SRT( 8,8,1 )
  2911. #define FRAGMENT_MAIN_COLOUR_DEPTH_SRT COMPUTE_MAIN_SRT( 8,8,1 )
  2912.  
  2913. #elif defined( D_PLATFORM_ORBIS )
  2914.  
  2915. #define VERTEX_MAIN void main( cInput In, out cOutput Out )
  2916. #define VERTEX_MAIN_SRT void main( cInput In, out cOutput Out, UniformBuffer lUniforms : S_SRT_DATA )
  2917.  
  2918. #define HULL_TRI_MAIN_SRT [DOMAIN_PATCH_TYPE("tri")] \
  2919. [PARTITIONING_TYPE("integer")] \
  2920. [OUTPUT_TOPOLOGY_TYPE("triangle_cw")] \
  2921. [OUTPUT_CONTROL_POINTS(3)] \
  2922. [PATCH_CONSTANT_FUNC("ConstantsHS")] \
  2923. [MAX_TESS_FACTOR(16.0)] \
  2924. void main( \
  2925. InputPatch<cInput, 3> In, \
  2926. uint uCPID : S_OUTPUT_CONTROL_POINT_ID, \
  2927. UniformBuffer lUniforms : S_SRT_DATA, \
  2928. out cOutput Out )
  2929.  
  2930. #define HULL_QUAD_MAIN_SRT [DOMAIN_PATCH_TYPE("quad")] \
  2931. [PARTITIONING_TYPE("integer")] \
  2932. [OUTPUT_TOPOLOGY_TYPE("triangle_cw")] \
  2933. [OUTPUT_CONTROL_POINTS(4)] \
  2934. [PATCH_CONSTANT_FUNC("ConstantsHS")] \
  2935. [MAX_TESS_FACTOR(16.0)] \
  2936. void main( \
  2937. InputPatch<cInput, 4> In, \
  2938. uint uCPID : S_OUTPUT_CONTROL_POINT_ID, \
  2939. UniformBuffer lUniforms : S_SRT_DATA, \
  2940. out cOutput Out )
  2941.  
  2942.  
  2943. #define DOMAIN_TRI_MAIN_SRT [DOMAIN_PATCH_TYPE("tri")] \
  2944. void main( \
  2945. HSConstantOutputData patchIn, \
  2946. const OutputPatch<cInput, 3> In, \
  2947. out cOutput Out, \
  2948. UniformBuffer lUniforms : S_SRT_DATA, \
  2949. float3 domainCoordinates : S_DOMAIN_LOCATION )
  2950.  
  2951. #define DOMAIN_QUAD_MAIN_SRT [DOMAIN_PATCH_TYPE("quad")] \
  2952. void main( \
  2953. HSConstantOutputData patchIn, \
  2954. const OutputPatch<cInput, 4> In, \
  2955. out cOutput Out, \
  2956. UniformBuffer lUniforms : S_SRT_DATA, \
  2957. float2 domainCoordinates : S_DOMAIN_LOCATION )
  2958.  
  2959. #define GEOMETRY_MAIN_SRT( MAX_VERTS ) cOutput Out; [MAX_VERTEX_COUNT(MAX_VERTS)] void main( inout TriangleBuffer<cOutput> TriStream, Triangle cInput In[3], UniformBuffer lUniforms : S_SRT_DATA )
  2960.  
  2961.  
  2962. #define FRAGMENT_MAIN_COLOUR struct cOutput { vec4 mColour : S_TARGET_OUTPUT; }; [RE_Z] void main( cInput In, out cOutput Out )
  2963. #define VOID_MAIN_COLOUR struct cOutput { vec4 mColour : S_TARGET_OUTPUT; }; void main( cInput In, out cOutput Out )
  2964. #define FRAGMENT_MAIN_COLOUR_DEPTH struct cOutput { vec4 mColour : S_TARGET_OUTPUT; float mDepth : S_DEPTH_OUTPUT; }; [RE_Z] void main( cInput In, out cOutput Out )
  2965. #define VOID_MAIN_SRT void main( cInput In, UniformBuffer lUniforms : S_SRT_DATA )
  2966.  
  2967. #if defined( D_TAA_RENDER_TARGETS )
  2968.  
  2969. #define FRAGMENT_MAIN_COLOUR_SRT struct cOutput { vec4 mColour0 : S_TARGET_OUTPUT0; \
  2970. vec4 mColour1 : S_TARGET_OUTPUT1; \
  2971. vec4 mColour2 : S_TARGET_OUTPUT2; }; \
  2972. [RE_Z] void main( cInput In, out cOutput Out, UniformBuffer lUniforms : S_SRT_DATA )
  2973.  
  2974.  
  2975. #elif !defined( D_ATTRIBUTES )
  2976. #define FRAGMENT_MAIN_COLOUR_DEPTH_SRT struct cOutput { vec4 mColour : S_TARGET_OUTPUT; float mDepth : S_DEPTH_OUTPUT; }; [RE_Z] void main( cInput In, out cOutput Out, UniformBuffer lUniforms : S_SRT_DATA )
  2977. #define FRAGMENT_MAIN_COLOUR_DEPTH_GE_SRT struct cOutput { vec4 mColour : S_TARGET_OUTPUT; float mDepth : S_DEPTH_GE_OUTPUT; }; [RE_Z] void main( cInput In, out cOutput Out, UniformBuffer lUniforms : S_SRT_DATA )
  2978. #define FRAGMENT_MAIN_COLOUR_DEPTH_LE_SRT struct cOutput { vec4 mColour : S_TARGET_OUTPUT; float mDepth : S_DEPTH_LE_OUTPUT; }; [RE_Z] void main( cInput In, out cOutput Out, UniformBuffer lUniforms : S_SRT_DATA )
  2979. #define FRAGMENT_MAIN_COLOUR_SRT struct cOutput { vec4 mColour : S_TARGET_OUTPUT; }; void main( cInput In, out cOutput Out, UniformBuffer lUniforms : S_SRT_DATA )
  2980. #define VOID_MAIN_DEPTH_SRT struct cOutput { float mDepth : S_DEPTH_OUTPUT; }; [RE_Z] void main( cInput In, out cOutput Out, UniformBuffer lUniforms : S_SRT_DATA )
  2981. #define VOID_MAIN_COLOUR_EARLYZ_SRT [FORCE_EARLY_DEPTH_STENCIL] void main( cInput In, UniformBuffer lUniforms : S_SRT_DATA )
  2982.  
  2983. #define FRAGMENT_MAIN_COLOUR01_SRT struct cOutput { vec4 mColour0 : S_TARGET_OUTPUT0; \
  2984. vec4 mColour1 : S_TARGET_OUTPUT1; }; \
  2985. [RE_Z] void main( cInput In, out cOutput Out, UniformBuffer lUniforms : S_SRT_DATA )
  2986. #define FRAGMENT_MAIN_COLOUR01_DEPTH_SRT struct cOutput { vec4 mColour0 : S_TARGET_OUTPUT0; \
  2987. vec4 mColour1 : S_TARGET_OUTPUT1; \
  2988. float mDepth : S_DEPTH_OUTPUT; }; \
  2989. [RE_Z] void main( cInput In, out cOutput Out, UniformBuffer lUniforms : S_SRT_DATA )
  2990.  
  2991. #else
  2992.  
  2993. // #pragma PSSL_target_output_format(target 1 FMT_32_AR)
  2994.  
  2995. #define FRAGMENT_MAIN_COLOUR_DEPTH_SRT struct cOutput { vec4 mColour0 : S_TARGET_OUTPUT0; \
  2996. vec4 mColour1 : S_TARGET_OUTPUT1; \
  2997. vec4 mColour2 : S_TARGET_OUTPUT2; \
  2998. vec4 mColour3 : S_TARGET_OUTPUT3; \
  2999. float mDepth : S_DEPTH_OUTPUT; }; \
  3000. [RE_Z] void main( cInput In, out cOutput Out, UniformBuffer lUniforms : S_SRT_DATA )
  3001.  
  3002. #define FRAGMENT_MAIN_COLOUR_SRT struct cOutput { vec4 mColour0 : S_TARGET_OUTPUT0; \
  3003. vec4 mColour1 : S_TARGET_OUTPUT1; \
  3004. vec4 mColour2 : S_TARGET_OUTPUT2; \
  3005. vec4 mColour3 : S_TARGET_OUTPUT3; }; \
  3006. [RE_Z] void main( cInput In, out cOutput Out, UniformBuffer lUniforms : S_SRT_DATA )
  3007.  
  3008. #define FRAGMENT_MAIN_COLOUR_EARLYZ_SRT struct cOutput { vec4 mColour0 : S_TARGET_OUTPUT0; \
  3009. vec4 mColour1 : S_TARGET_OUTPUT1; \
  3010. vec4 mColour2 : S_TARGET_OUTPUT2; \
  3011. vec4 mColour3 : S_TARGET_OUTPUT3; }; \
  3012. [FORCE_EARLY_DEPTH_STENCIL] void main( cInput In, out cOutput Out, UniformBuffer lUniforms : S_SRT_DATA )
  3013. #endif
  3014.  
  3015.  
  3016. #endif
  3017.  
  3018. // =================================================================================================
  3019. // Texture resolution
  3020. // =================================================================================================
  3021.  
  3022. #ifdef D_PLATFORM_ORBIS
  3023. uvec2 GetResolution( Texture2D lTexture )
  3024. {
  3025. uvec2 lResolution;
  3026. lTexture.GetDimensionsFast(lResolution.x, lResolution.y);
  3027. return lResolution;
  3028. }
  3029.  
  3030. uvec2 GetResolution( RW_Texture2D<float4> lTexture )
  3031. {
  3032. uvec2 lResolution;
  3033. lTexture.GetDimensionsFast(lResolution.x, lResolution.y);
  3034. return lResolution;
  3035. }
  3036. #else
  3037. uvec2 GetResolution( sampler2D lTexture )
  3038. {
  3039. return textureSize( lTexture, 0 );
  3040. }
  3041. #endif
  3042.  
  3043. // =================================================================================================
  3044. // Viewport
  3045. // =================================================================================================
  3046. #ifdef D_PLATFORM_PC
  3047.  
  3048. #define SCREENSPACE_AS_RENDERTARGET_UVS( A ) A.xy
  3049.  
  3050. #elif defined(D_PLATFORM_ORBIS)
  3051.  
  3052. #define SCREENSPACE_AS_RENDERTARGET_UVS( A ) ( float2( A.x, 1.0 - A.y ) )
  3053.  
  3054. #endif
  3055.  
  3056. #ifdef D_USING_LOGDEPTH
  3057.  
  3058. #define D_DEPTH_CLEARVALUE (1.0)
  3059.  
  3060. #else
  3061.  
  3062. #define D_DEPTH_CLEARVALUE (0.0)
  3063.  
  3064. #endif
  3065.  
  3066. // =================================================================================================
  3067. // Texture usage feedback
  3068. // =================================================================================================
  3069. #if defined( D_TEXTURE_FEEDBACK ) && defined( D_PLATFORM_PC )
  3070.  
  3071. layout(r32i) uniform iimage2D gTexFeedbackImg;
  3072.  
  3073. void WriteTexFeedback( in int liCounter, in float liMip )
  3074. {
  3075. if( liCounter != 0 )
  3076. {
  3077. #if defined( GL_ARB_shader_ballot ) && ( GL_ARB_shader_ballot == 1 )
  3078. if( readFirstInvocationARB( gl_SubGroupInvocationARB ) == gl_SubGroupInvocationARB )
  3079. #endif
  3080. {
  3081. int liIntMip = int(floor(liMip));
  3082. //imageStore( gTexFeedbackImg, ivec2( liCounter, liIntMip ), ivec4(1,0,0,0) );
  3083. imageAtomicAdd( gTexFeedbackImg, ivec2( liCounter, liIntMip ), int(1) );
  3084. }
  3085. }
  3086. }
  3087.  
  3088. vec4 Tex2dFeedback( in sampler2D lSamp, in int liCounter, in vec2 lCoords )
  3089. {
  3090. float liLod = textureQueryLOD( lSamp, lCoords ).x;
  3091. WriteTexFeedback( liCounter, liLod );
  3092. return texture( lSamp, lCoords );
  3093. }
  3094.  
  3095. vec4 Tex2dLodFeedback( in sampler2D lSamp, in int liCounter, in vec2 lCoords, in float liLod )
  3096. {
  3097. WriteTexFeedback( liCounter, liLod );
  3098. return textureLod( lSamp, lCoords, liLod );
  3099. }
  3100.  
  3101. vec4 Tex2dArrayFeedback( in sampler2DArray lSamp, in int liCounter, in vec3 lCoords )
  3102. {
  3103. float liLod = textureQueryLOD( lSamp, lCoords.xy ).x;
  3104. WriteTexFeedback( liCounter, liLod );
  3105. return texture( lSamp, lCoords );
  3106. }
  3107.  
  3108. vec4 Tex3dFeedback( in sampler3D lSamp, in int liCounter, in vec3 lCoords )
  3109. {
  3110. float liLod = textureQueryLOD( lSamp, lCoords ).x;
  3111. WriteTexFeedback( liCounter, liLod );
  3112. return texture( lSamp, lCoords );
  3113. }
  3114.  
  3115. vec4 Tex3dLodFeedback( in sampler3D lSamp, in int liCounter, in vec3 lCoords, in float liLod )
  3116. {
  3117. WriteTexFeedback( liCounter, liLod );
  3118. return textureLod( lSamp, lCoords, liLod );
  3119. }
  3120.  
  3121.  
  3122. #endif
  3123.  
  3124. #endif
  3125.  
  3126.  
  3127. //-----------------------------------------------------------------------------
  3128. ///
  3129. /// CustomPerMeshUniforms
  3130. ///
  3131. /// @brief CustomPerMeshUniforms
  3132. ///
  3133. /// Stuff that is only used for these types of meshes.
  3134. //-----------------------------------------------------------------------------
  3135.  
  3136. struct CustomPerMeshUniforms
  3137. {
  3138. vec4 gDoFParamsVec4;
  3139. vec4 gHDRParamsVec4;
  3140. vec4 gHBAOParamsVec4;
  3141. vec4 gThresholdParamsVec4;
  3142. vec4 gBlurParamsVec4;
  3143.  
  3144. SAMPLER2D( gBufferMap );
  3145. SAMPLER2D( gBuffer1Map );
  3146. SAMPLER2D( gBuffer2Map );
  3147. SAMPLER2D( gBuffer3Map );
  3148. SAMPLER2D( gBuffer4Map );
  3149. SAMPLER2D( gBuffer5Map );
  3150. #if defined( D_DEBUG_QUAD )
  3151. SAMPLER2D( gBuffer6Map );
  3152. SAMPLER2D( gBuffer7Map );
  3153. SAMPLER2D( gBuffer8Map );
  3154. SAMPLER2D( gBuffer9Map );
  3155. SAMPLER2D( gBuffer10Map );
  3156. SAMPLER2D( gBuffer11Map );
  3157. SAMPLER2D( gBuffer12Map );
  3158. SAMPLER2D( gBuffer13Map );
  3159. SAMPLER2D( gBuffer14Map );
  3160. #endif
  3161. #if defined ( D_IBL )
  3162. SAMPLER2D (gDualPMapFront );
  3163. SAMPLER2D (gDualPMapBack );
  3164. vec4 gIBLParamsVec4;
  3165. #else
  3166. SAMPLER2D( gBlurMask );
  3167. SAMPLER3D( gColourLUT );
  3168. vec4 gTextureSizeMipLevelVec4;
  3169. #endif
  3170. SAMPLER2D( gLensDirt );
  3171.  
  3172. #if defined ( D_UI )
  3173. // UI shader stuff
  3174. SAMPLER2D( gUIMap );
  3175. SAMPLER2D( gUIMask );
  3176. SAMPLER2D( gUIFullscreenEffect );
  3177. SAMPLER2D( gUIFullscreenNormal );
  3178. SAMPLER2D( gUIZoomEffect );
  3179. SAMPLER2D( gUINoiseEffect );
  3180. SAMPLER2D( gUIFullScreenRefraction );
  3181.  
  3182. vec4 gUIColourVec4;
  3183. vec4 gUIDeformVec4;
  3184. vec4 gVignetteVec4;
  3185. vec4 gUILowHealthVignetteVec4;
  3186. vec4 gWashParamsVec4;
  3187. vec4 gCriticalHitPointsVec4;
  3188. #else
  3189. vec4 gSkyUpperParamsVec4;
  3190. vec4 gLightShaftColourBottomVec4;
  3191. vec4 gLightShaftColourTopVec4;
  3192. #endif
  3193. };
  3194.  
  3195. #if defined( D_PLATFORM_ORBIS_COMPUTE )
  3196.  
  3197. //-----------------------------------------------------------------------------
  3198. ///
  3199. /// ComputeOutputUniforms
  3200. ///
  3201. /// @brief ComputeOutputUniforms
  3202. ///
  3203. /// Refs to output textures for compute quad shaders
  3204. //-----------------------------------------------------------------------------
  3205.  
  3206. struct ComputeOutputUniforms
  3207. {
  3208. RW_Texture2D<float4> gOutTexture0;
  3209. RW_Texture2D<float4> gOutTexture1;
  3210. RW_Texture2D<float4> gOutTexture2;
  3211. RW_Texture2D<float4> gOutTexture3;
  3212. RW_Texture2D<float4> gOutTexture4;
  3213. RW_Texture2D<float> gOutTextureDepth;
  3214. };
  3215.  
  3216. #endif
  3217.  
  3218. //
  3219. // This is the SRT buffer that everything gets uploaded to (on PS4). PC just functions as normal.
  3220. //
  3221. struct UniformBuffer
  3222. {
  3223. DECLARE_PTR( PerFrameUniforms, mpPerFrame ) /*: PER_MESH*/
  3224. DECLARE_PTR( CustomPerMeshUniforms, mpCustomPerMesh ) /*: PER_MESH*/
  3225. DECLARE_PTR( CommonPerMeshUniforms, mpCommonPerMesh ) /*: PER_MESH*/
  3226.  
  3227. #if defined( D_PLATFORM_ORBIS_COMPUTE )
  3228. DECLARE_PTR( ComputeOutputUniforms, mpCmpOutPerMesh ) /* hack - marked 'per mesh' so it'll be alloced in cmd buf */
  3229. #endif
  3230. };
  3231.  
  3232.  
  3233. #if defined( D_PLATFORM_ORBIS_COMPUTE )
  3234. #define TEX_COORDS ( ( vec2( dispatchThreadID.xy ) + vec2(0.5) ) / vec2( GetResolution( lUniforms.mpCmpOutPerMesh.gOutTexture0 ) ) )
  3235. #else
  3236. #define TEX_COORDS IN(mTexCoordsVec2)
  3237. #endif
  3238.  
  3239.  
  3240. // =================================================================================================
  3241. //
  3242. // D_LENSFLARE_BRIGHT
  3243. //
  3244. // =================================================================================================
  3245.  
  3246. #ifdef D_LENSFLARE_BRIGHT
  3247.  
  3248. //-----------------------------------------------------------------------------
  3249. // Global Data
  3250.  
  3251.  
  3252. //-----------------------------------------------------------------------------
  3253. // Typedefs and Classes
  3254.  
  3255. DECLARE_INPUT
  3256. IN_SCREEN_POSITION
  3257.  
  3258. INPUT( vec2, mTexCoordsVec2, TEXCOORD0 )
  3259. DECLARE_END
  3260.  
  3261.  
  3262. //-----------------------------------------------------------------------------
  3263. // Functions
  3264.  
  3265. STATIC_CONST vec3 kLumcoeff = vec3(0.000,0.000,0.000);
  3266.  
  3267. vec3
  3268. Threshold(
  3269. in vec3 lColour,
  3270. in float lfThreshold,
  3271. in float lfGain )
  3272. {
  3273. float lum = dot(lColour.rgb, kLumcoeff);
  3274. float thresh = max((lum-lfThreshold)*lfGain, 0.0);
  3275. return mix( vec3(0.0), lColour, thresh );
  3276. }
  3277.  
  3278.  
  3279.  
  3280. FRAGMENT_MAIN_COLOUR_SRT
  3281. {
  3282. vec4 lTexVec4;
  3283.  
  3284. lTexVec4 = texture2D( lUniforms.mpCustomPerMesh.gBufferMap, TEX_COORDS.xy );
  3285.  
  3286. lTexVec4.rgb = Threshold( lTexVec4.rgb,
  3287. lUniforms.mpCustomPerMesh.gThresholdParamsVec4.x, // Threshold
  3288. lUniforms.mpCustomPerMesh.gThresholdParamsVec4.y );// Offset
  3289.  
  3290. FRAGMENT_COLOUR = vec4( lTexVec4.xyz, 1.0);
  3291. }
  3292.  
  3293. #endif // D_LENSFLARE_BRIGHT
  3294.  
  3295. // =================================================================================================
  3296. //
  3297. // D_LENSFLARE_FEATURE
  3298. //
  3299. // =================================================================================================
  3300.  
  3301. #ifdef D_LENSFLARE_FEATURE
  3302.  
  3303. //-----------------------------------------------------------------------------
  3304. // Global Data
  3305.  
  3306.  
  3307. //-----------------------------------------------------------------------------
  3308. // Typedefs and Classes
  3309.  
  3310. DECLARE_INPUT
  3311. IN_SCREEN_POSITION
  3312.  
  3313. INPUT( vec2, mTexCoordsVec2, TEXCOORD0 )
  3314. DECLARE_END
  3315.  
  3316.  
  3317. //-----------------------------------------------------------------------------
  3318. // Functions
  3319.  
  3320. //UNIFORM( vec4, gLensParamsVec4 );
  3321.  
  3322.  
  3323. //------------------------------------------
  3324. //user variables
  3325. /*
  3326. int NSAMPLES = 0;
  3327. float FLARE_DISPERSAL = 0;
  3328. float FLARE_HALO_WIDTH = 0;
  3329. vec3 FLARE_CHROMA_DISTORTION = vec3(0.00, 0.00, 0.00);
  3330.  
  3331. float threshold = 0; //highlight threshold;
  3332. float gain = 0; //highlight gain;
  3333. */
  3334. //------------------------------------------
  3335.  
  3336. vec2
  3337. flipTexcoords(
  3338. in vec2 texcoords )
  3339. {
  3340. return -texcoords + 1.0;
  3341. }
  3342.  
  3343. float
  3344. vignette(
  3345. in vec2 coords )
  3346. {
  3347. float dist = distance(coords, vec2(0.0,0.0));
  3348. dist = smoothstep(0.00 0.00 dist);
  3349. return clamp(dist,0.0,0.0);
  3350. }
  3351.  
  3352.  
  3353. vec3
  3354. textureDistorted(
  3355. SAMPLER2DARG( tex ),
  3356. in vec2 sample_center,
  3357. in vec2 sample_vector,
  3358. in vec3 distortion )
  3359. {
  3360. vec3 col = vec3(0.0);
  3361.  
  3362. col.r = texture2D( tex, sample_center + sample_vector * distortion.r).r;
  3363. col.g = texture2D( tex, sample_center + sample_vector * distortion.g).g;
  3364. col.b = texture2D( tex, sample_center + sample_vector * distortion.b).b;
  3365.  
  3366. return col;
  3367. }
  3368.  
  3369. #ifdef D_PLATFORM_ORBIS
  3370. #pragma argument(unrollallloops)
  3371. #endif
  3372.  
  3373.  
  3374. FRAGMENT_MAIN_COLOUR_SRT
  3375. {
  3376.  
  3377. vec2 lTexCoord = TEX_COORDS.xy;
  3378. lTexCoord = clamp(lTexCoord,0.000,0.000);
  3379.  
  3380. vec2 image_center = vec2(0.5);
  3381. vec2 sample_vector = (image_center - lTexCoord) * 0.0;
  3382. vec2 halo_vector = normalize(sample_vector) * 0.0;
  3383.  
  3384. vec3 result = textureDistorted( SAMPLER2DPARAM( lUniforms.mpCustomPerMesh.gBufferMap ), lTexCoord + halo_vector, halo_vector, vec3(0.000, 0.000, 0.000)).rgb;
  3385. result *= vignette(lTexCoord);
  3386.  
  3387. for (int i = 0; i < 5; ++i)
  3388. {
  3389. vec2 offset = sample_vector * float(i);
  3390. result += textureDistorted( SAMPLER2DPARAM( lUniforms.mpCustomPerMesh.gBufferMap ), lTexCoord + offset, offset, vec3(0.000, 0.000, 0.000)).rgb;
  3391. }
  3392.  
  3393. vec3 anamorph = vec3(0.0);
  3394. float s;
  3395. for (int i = -32; i < 32; ++i)
  3396. {
  3397. s = clamp(1.0/abs(float(i)),0.0,1.0);
  3398. anamorph += texture2D( lUniforms.mpCustomPerMesh.gBufferMap, vec2(lTexCoord.x + float(i)*(1.0/64.0),lTexCoord.y)).rgb*s;
  3399.  
  3400. }
  3401.  
  3402. FRAGMENT_COLOUR = vec4( result+(anamorph*vec3(0.1,0.0,1.0)* lUniforms.mpCustomPerMesh.gThresholdParamsVec4.z), 1.0 );
  3403.  
  3404. }
  3405.  
  3406.  
  3407. #endif // D_LENSFLARE_FEATURE
  3408.  
  3409.  
  3410. // =================================================================================================
  3411. //
  3412. // D_LENSFLARE_COMBINE
  3413. //
  3414. // =================================================================================================
  3415.  
  3416. #ifdef D_LENSFLARE_COMBINE
  3417.  
  3418. //-----------------------------------------------------------------------------
  3419. // Global Data
  3420.  
  3421.  
  3422. //-----------------------------------------------------------------------------
  3423. // Typedefs and Classes
  3424.  
  3425. DECLARE_INPUT
  3426. IN_SCREEN_POSITION
  3427.  
  3428. INPUT( vec2, mTexCoordsVec2, TEXCOORD0 )
  3429. DECLARE_END
  3430.  
  3431.  
  3432. //-----------------------------------------------------------------------------
  3433. // Functions
  3434.  
  3435.  
  3436. //----------------------------------------------------------------------------
  3437. FRAGMENT_MAIN_COLOUR_SRT
  3438. {
  3439. vec3 lFragCol;
  3440. vec2 newCoords = TEX_COORDS.xy;
  3441. vec3 lLensDirt = texture2D( lUniforms.mpCustomPerMesh.gLensDirt, newCoords ).xyz;
  3442. vec3 lLensFlareCol = texture2D(lUniforms.mpCustomPerMesh.gBuffer4Map, newCoords).xyz;
  3443. lLensFlareCol *= (lLensDirt* (lUniforms.mpCustomPerMesh.gThresholdParamsVec4.w + 0.2)) + (1.0 - lUniforms.mpCustomPerMesh.gThresholdParamsVec4.w);
  3444.  
  3445. lFragCol = (texture2D(lUniforms.mpCustomPerMesh.gBuffer1Map, newCoords).xyz);
  3446. lFragCol += (texture2D(lUniforms.mpCustomPerMesh.gBuffer2Map, newCoords).xyz);
  3447. lFragCol += GammaCorrectInput(texture2D(lUniforms.mpCustomPerMesh.gBuffer3Map, newCoords).xyz);
  3448. lFragCol += GammaCorrectInput(lLensFlareCol);
  3449. lFragCol = GammaCorrectOutput(lFragCol);
  3450.  
  3451. FRAGMENT_COLOUR = vec4(lFragCol, 1.0);
  3452. }
  3453.  
  3454. #endif // D_LENSFLARE_COMBINE
  3455.  
  3456.  
  3457.  
  3458.  
  3459.  
  3460.  
  3461. ----------------------------------------
  3462. ERROR----------------------------------------
  3463. 0(3348) : error C0000: syntax error, unexpected floating point constant, expecting ')' at token "<float-const>"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement