Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #version 450 core
- #define D_PLATFORM_PC
- #define D_FRAGMENT
- // PIXEL SHADER: SHADERS/LENSFLARE.SHADER.BIN
- // CONTEXT: FEATURE
- // =================================================================================================
- #define D_LENSFLARE_FEATURE
- ////////////////////////////////////////////////////////////////////////////////
- ///
- /// @file LensFlareFragment.h
- /// @author User
- /// @date
- ///
- /// @brief LensFlareFragment
- ///
- /// Copyright (c) 2008 Hello Games Ltd. All Rights Reserved.
- ///
- ////////////////////////////////////////////////////////////////////////////////
- //-----------------------------------------------------------------------------
- // Compilation defines
- //-----------------------------------------------------------------------------
- // Include files
- // =================================================================================================
- #ifndef D_DEFINES
- #define D_DEFINES
- // =================================================================================================
- // Platform defines
- // =================================================================================================
- #ifdef D_PLATFORM_PC
- #define D_ENABLE_REVERSEZ_PROJECTION (1)
- #pragma optionNV(strict on)
- #extension GL_ARB_gpu_shader5 : enable
- #extension GL_ARB_fragment_coord_conventions : enable
- #extension GL_ARB_derivative_control : enable
- #if defined( D_FRAGMENT ) && defined( _F64_ )
- layout(early_fragment_tests) in;
- #endif
- #elif defined(D_PLATFORM_ORBIS)
- #define D_ENABLE_REVERSEZ_PROJECTION (1)
- // use this with sdk 2.0 compiler
- // #pragma argument (allow-scratch-buffer-spill)
- //define these flags so they don't get ignored in build process and in the comb mask
- //this is because materials, vertex layouts and shaders need to be synced on 360 to avoid patching
- #ifdef _F27_
- #endif
- #ifdef _F28_
- #endif
- #ifdef _F29_
- #endif
- #ifdef _F21_
- #endif
- #ifdef _F02_
- #endif
- #ifdef _F03_
- #endif
- #if defined( _F01_ ) || defined( D_LOD0 ) || defined( D_LOD1 ) || defined( D_LOD2 ) || defined( D_LOD3) || defined( D_LOD4 )
- #endif
- #ifdef _F01_
- #endif
- #ifdef _F09_
- #endif
- #ifdef _F10_
- #endif
- // disable warnings for unused parameters. This happens a lot because of defining different things.
- #pragma warning (disable: 5203)
- // temp thing to know what things are still required on ps4.
- #define D_PLATFORM_ORBIS_FIX
- #ifdef __PSSL_CS__
- #define D_PLATFORM_ORBIS_COMPUTE
- #endif
- #ifdef __PSSL_HS__
- #define D_HULL
- #endif
- #ifdef __PSSL_DS__
- #define D_DOMAIN
- #endif
- #ifdef __PSSL_VS__
- #define D_VERTEX
- #endif
- #ifdef __PSSL_GS__
- #define D_GEOMETRY
- #endif
- #endif
- #if !D_ENABLE_REVERSEZ_PROJECTION
- #define D_USING_LOGDEPTH
- #endif
- // =================================================================================================
- // Basic Types
- // =================================================================================================
- #ifdef D_PLATFORM_PC
- #define JOINT_TYPE vec4
- //#define CONST const
- #define STATIC_CONST const
- #elif defined(D_PLATFORM_ORBIS)
- #define JOINT_TYPE int4
- #define float float
- #define vec2 float2
- #define vec3 float3
- #define vec4 float4
- #define ivec2 int2
- #define ivec3 int3
- #define ivec4 int4
- #define uvec2 uint2
- #define uvec3 uint3
- #define uvec4 uint4
- // NOTE:
- // operator[] accesses rows, not columns
- // matrix constructors interpret the passed vectors as row vectors, not column vectors
- #define mat2 row_major float2x2
- #define mat3 row_major float3x3
- #define mat4 row_major float4x4
- //#define CONST
- #define STATIC_CONST static const
- // #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.
- #endif
- // =================================================================================================
- // Functions
- // =================================================================================================
- #ifdef D_PLATFORM_PC
- #define saturate( V ) min( max( V, 0.0) , 1.0)
- #define atan2( Y, X ) atan( Y, X )
- #define invsqrt( X ) inversesqrt( X )
- #ifdef D_COMPUTE
- #define groupID gl_WorkGroupID
- #define groupThreadID gl_LocalInvocationID
- #define dispatchThreadID gl_GlobalInvocationID
- #endif
- #elif defined(D_PLATFORM_ORBIS)
- #if defined(D_PLATFORM_ORBIS_COMPUTE)
- float dFdx( float var ) { float delta = var - LaneSwizzle( var, 0x1f, 0, 1 ); return __v_cndmask_b32(0, 1, 0xAAAAAAAAAAAAAAAA ) ? delta : -delta; }
- float dFdy( float var ) { float delta = var - LaneSwizzle( var, 0x1f, 0, 8 ); return __v_cndmask_b32(0, 1, 0xFF00FF00FF00FF00 ) ? delta : -delta; }
- 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; }
- 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; }
- 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; }
- 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; }
- 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; }
- 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; }
- #define dFdxFine dFdx
- #define dFdyFine dFdy
- #else
- #define dFdx ddx
- #define dFdy ddy
- #define dFdxFine ddx_fine
- #define dFdyFine ddy_fine
- #endif
- #define mix lerp
- #define fract frac
- #define mod fmod
- #define saturate( V ) ( min( max( V, 0.0) , 1.0) )
- #define invsqrt( X ) rsqrt( X )
- #endif
- // =================================================================================================
- // Samplers and textures
- // =================================================================================================
- #ifdef D_PLATFORM_PC
- #define shadow2D( S, UV ) texture( S, UV )
- #define SAMPLER2DSHADOW( NAME, REG ) uniform sampler2DShadow NAME
- #define SAMPLERCUBE( NAME ) samplerCube NAME
- #define SAMPLERCUBEARG( NAME ) in samplerCube NAME
- #define SAMPLERCUBEPARAM( NAME ) NAME
- #define imageAtomicAddOut( T, C, V, O ) O = imageAtomicAdd( T, C, V )
- #if defined( D_TEXTURE_FEEDBACK )
- #define texture2D( T, C ) Tex2dFeedback( T, T##FB, C )
- #define texture2DLod( T, C, N ) Tex2dLodFeedback( T, T##FB, C, N )
- #define texture2DArray( T, C ) Tex2dArrayFeedback( T, T##FB, C )
- #define texture3D( S, UV ) Tex3dFeedback( S, S##FB, UV )
- #define texture3DLod( S, UV, LOD ) Tex3dLodFeedback( S, S##FB, UV, LOD )
- #define SAMPLER2DARG( NAME ) in sampler2D NAME, in int NAME##FB
- #define SAMPLER2DPARAM( NAME ) NAME, NAME##FB
- #define SAMPLER2DARRAYARG( NAME ) in sampler2DArray NAME, in int NAME##FB
- #define SAMPLER2DARRAYPARAM( NAME ) NAME, NAME##FB
- #define SAMPLER2D( NAME ) sampler2D NAME; int NAME##FB
- #define SAMPLER2DARRAY( NAME ) sampler2DArray NAME; int NAME##FB
- #define SAMPLER3D( NAME ) sampler3D NAME; int NAME##FB
- #define SAMPLER2DSHADOW_SRT( NAME ) sampler2DShadow NAME; int NAME##FB
- #else
- #define texture2DLod( S, UV, LOD ) textureLod( S, UV, LOD )
- #define texture3DLod( S, UV, LOD ) textureLod( S, UV, LOD )
- #define SAMPLER2DARG( NAME ) in sampler2D NAME
- #define SAMPLER2DPARAM( NAME ) NAME
- #define SAMPLER2DARRAYARG( NAME ) in sampler2DArray NAME
- #define SAMPLER2DARRAYPARAM( NAME ) NAME
- #define SAMPLER2D( NAME ) sampler2D NAME
- #define SAMPLER2DARRAY( NAME ) sampler2DArray NAME
- #define SAMPLER3D( NAME ) sampler3D NAME
- #define SAMPLER2DSHADOW_SRT( NAME ) sampler2DShadow NAME
- #endif
- #define textureGatherRed( lTex, lSamp ) textureGather( lTex, lSamp, 0 )
- #define textureGatherGreen( lTex, lSamp ) textureGather( lTex, lSamp, 1 )
- #define textureGatherBlue( lTex, lSamp ) textureGather( lTex, lSamp, 2 )
- #define textureGatherAlpha( lTex, lSamp ) textureGather( lTex, lSamp, 3 )
- #define texture2DComputeGrad( T, C ) texture2D( T, C )
- #elif defined(D_PLATFORM_ORBIS)
- #define SAMPLERCUBE( NAME, REG ) SamplerState NAME##SS : register( s##REG ); TextureCube NAME##TU : register( t##REG )
- #define SAMPLER2D( NAME ) Texture2D NAME; SamplerState NAME##SS
- #define SAMPLER2DSHADOW_SRT( NAME ) Texture2D NAME; SamplerComparisonState NAME##SS //SAMPLER2D( NAME )
- #define SAMPLER3D( NAME ) Texture3D NAME; SamplerState NAME##SS
- #define SAMPLER2DARRAY( NAME ) Texture2D_Array NAME; SamplerState NAME##SS
- #define SAMPLER2DARRAYARG( NAME ) Texture2D_Array NAME, SamplerState NAME##SS
- #define SAMPLER2DARRAYPARAM( NAME ) NAME, NAME##SS
- #define SAMPLER2DPARAM( NAME ) NAME, NAME##SS
- #define SAMPLER2DARG( NAME ) Texture2D NAME, SamplerState NAME##SS
- #define texture2D( T, C ) T.Sample( T##SS, C )
- #if defined(D_PLATFORM_ORBIS_COMPUTE)
- #define texture2DComputeGrad( T, C ) T.SampleGradient( T##SS, C, vec2( dFdx( C ) ), vec2( dFdy( C ) ) )
- #define shadow2D( T, C ) T.SampleCmpLOD0( T##SS, C.xy, C.z )
- #else
- #define texture2DComputeGrad( T, C ) T.Sample( T##SS, C )
- #define shadow2D( T, C ) T.SampleCmp( T##SS, C.xy, C.z )
- #endif
- #define texture2DLod( T, C, N ) T.SampleLOD( T##SS, C, N )
- #define texture2DArray( T, C ) T.Sample( T##SS, C )
- #define texture3DLod( T, C, N ) T.SampleLOD( T##SS, C, N )
- //#define shadow2D( T, C ) vec3( C.z > T.Sample( T##SS, C.xy ).x ? 1.0 : 0.0 )
- //#define shadow2D( T, C ) T.GatherCmp( T##SS, C.xy, C.z )
- //#define shadow2D( T, C ) T.SampleCmpLOD0( T##SS, C.xy, C.z )
- #define textureCube( T, C ) T##TU.Sample( T##SS, C )
- #define textureCubeLod( T, C, N ) T##TU.Sample( T##SS, C, N )
- #define textureGrad( T, C, DDX, DDY ) T.SampleGradient( T##SS, C, DDX, DDY )
- #define imageAtomicAdd( T, C, V ) AtomicAdd( T[ C ], V )
- #define imageAtomicAddOut( T, C, V, O ) AtomicAdd( T[ C ], V, O )
- #define imageStore( T, C, V ) ( T[C] = V )
- #define textureGatherRed( lTex, lSamp ) lTex.GatherRed ( lTex##SS, lSamp )
- #define textureGatherGreen( lTex, lSamp ) lTex.GatherGreen( lTex##SS, lSamp )
- #define textureGatherBlue( lTex, lSamp ) lTex.GatherBlue ( lTex##SS, lSamp )
- #define textureGatherAlpha( lTex, lSamp ) lTex.GatherAlpha( lTex##SS, lSamp )
- #define texelFetch( lTex, lSamp, lLod ) lTex.MipMaps((lLod), (lSamp))
- #endif
- #if defined(D_PLATFORM_ORBIS_COMPUTE)
- #define THREADGROUP_LOCAL thread_group_memory
- #define THREADGROUP_BARRIER ThreadGroupMemoryBarrier()
- #elif defined(D_PLATFORM_PC_COMPUTE)
- #define THREADGROUP_LOCAL layout( shared )
- #define THREADGROUP_BARRIER groupMemoryBarrier()
- #endif
- // =================================================================================================
- // Matrices
- // =================================================================================================
- #ifdef D_PLATFORM_PC
- #define MUL( INPUT_A, INPUT_B ) (INPUT_A * INPUT_B)
- #define PLATFORM_TRANSPOSE
- #define MAT4_SET_POS( M, P ) M[ 3 ] = P
- #define MAT4_SET_TRANSLATION( M, T ) M[ 3 ].xyz = T
- #define MAT4_GET_COLUMN( M, C ) M[ C ].xyz
- #define MAT3_GET_COLUMN( M, C ) M[ C ]
- #define MAT4_GET_COLUMN_VEC4( M, C ) M[ C ]
- #define MAT3_SET_COLUMN( M, C, V ) M[ C ] = V;
- #define MAT4_SET_COLUMN( M, C, V ) M[ C ] = V;
- #elif defined(D_PLATFORM_ORBIS)
- #define MUL( INPUT_A, INPUT_B ) mul( INPUT_B, INPUT_A )
- #define PLATFORM_TRANSPOSE
- #define MAT4_SET_POS( M, P ) M[ 3 ] = P
- #define MAT4_SET_TRANSLATION( M, T ) M[ 3 ].xyz = T
- #define MAT4_GET_COLUMN( M, C ) M[ C ].xyz
- #define MAT3_GET_COLUMN( M, C ) M[ C ]
- #define MAT4_GET_COLUMN_VEC4( M, C ) M[ C ]
- #define MAT3_SET_COLUMN( M, C, V ) M[ C ] = V;
- #define MAT4_SET_COLUMN( M, C, V ) M[ C ] = V;
- #endif
- // =================================================================================================
- // Arrays (workaround AMD shader compiler issues by making arrays have global scope)
- // =================================================================================================
- #if defined(D_PLATFORM_ORBIS)
- #define ARRAY_LOOKUP_FS( _UNIFORMS, _ELEMENT, _INDEX) _UNIFORMS._ELEMENT[_INDEX]
- #define ARRAY_LOOKUP_FP( _UNIFORMS, _ELEMENT, _INDEX) _UNIFORMS._ELEMENT[_INDEX]
- #else
- #define ARRAY_LOOKUP_FS( _UNIFORMS, _ELEMENT, _INDEX) _ELEMENT[_INDEX]
- #define ARRAY_LOOKUP_FP( _UNIFORMS, _ELEMENT, _INDEX) _ELEMENT[_INDEX]
- #endif
- // =================================================================================================
- // Input and Output
- // =================================================================================================
- #ifdef D_PLATFORM_PC
- #define UNIFORM( TYPE, NAME ) uniform TYPE NAME
- #define UNIFORM_SRT( TYPE, NAME ) uniform TYPE NAME
- #define DECLARE_INPUT
- #define DECLARE_OUTPUT
- #define DECLARE_END
- #define DECLARE_PTR( TYPE, NAME ) TYPE NAME;
- #define DECLARE_PATCH_INPUT_TRI
- #define DECLARE_PATCH_OUTPUT_TRI
- #define IN_PATCH_TRI_TESS_CONSTANTS
- #define OUT_PATCH_TRI_TESS_CONSTANTS
- #define DECLARE_PATCH_INPUT_QUAD
- #define DECLARE_PATCH_OUTPUT_QUAD
- #define IN_PATCH_QUAD_TESS_CONSTANTS
- #define OUT_PATCH_QUAD_TESS_CONSTANTS
- #if defined( D_HULL )
- #define INPUT( TYPE, NAME, REG ) in TYPE NAME [];
- #define INPUT_NOINTERP( TYPE, NAME, REG ) flat in TYPE NAME [];
- #define INPUT_NOPERSP( TYPE, NAME, REG ) in TYPE NAME [];
- #define PATCH_OUTPUT( TYPE, NAME, REG ) patch out TYPE NAME;
- #define OUTPUT( TYPE, NAME, REG ) out TYPE NAME [];
- #define OUTPUT_NOINTERP( TYPE, NAME, REG ) flat out TYPE NAME [];
- #define OUTPUT_NOPERSP( TYPE, NAME, REG ) out TYPE NAME [];
- #elif defined( D_DOMAIN )
- #define PATCH_INPUT( TYPE, NAME, REG ) patch in TYPE NAME;
- #define INPUT( TYPE, NAME, REG ) in TYPE NAME [];
- #define INPUT_NOINTERP( TYPE, NAME, REG ) flat in TYPE NAME [];
- #define INPUT_NOPERSP( TYPE, NAME, REG ) in TYPE NAME [];
- #define OUTPUT( TYPE, NAME, REG ) out TYPE NAME;
- #define OUTPUT_NOINTERP( TYPE, NAME, REG ) flat out TYPE NAME;
- #define OUTPUT_NOPERSP( TYPE, NAME, REG ) out TYPE NAME;
- #else
- #define INPUT( TYPE, NAME, REG ) in TYPE NAME;
- #define INPUT_NOINTERP( TYPE, NAME, REG ) flat in TYPE NAME;
- #define INPUT_NOPERSP( TYPE, NAME, REG ) in TYPE NAME;
- #define OUTPUT( TYPE, NAME, REG ) out TYPE NAME;
- #define OUTPUT_NOINTERP( TYPE, NAME, REG ) flat out TYPE NAME;
- #define OUTPUT_NOPERSP( TYPE, NAME, REG ) out TYPE NAME;
- #endif
- #define FRAGMENT_COLOUR_UVEC4_DEFINE layout(location = 0) out uvec4 outu_color0;
- #define FRAGMENT_COLOUR_UVEC4 outu_color0
- #define FRAGMENT_COLOUR out_color0
- #define FRAGMENT_COLOUR0 out_color0
- #define FRAGMENT_COLOUR1 out_color1
- #define FRAGMENT_COLOUR2 out_color2
- #define FRAGMENT_COLOUR3 out_color3
- #define FRAGMENT_COLOUR4 out_color4
- #if defined( D_TAA_RENDER_TARGETS )
- #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;
- #elif !defined(D_ATTRIBUTES)
- #define FRAGMENT_COLOUR_VEC4_DEFINE layout(location = 0) out vec4 out_color0;
- #else
- #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;
- #endif
- #define FRAGMENT_COLOUR01_VEC4_DEFINE layout(location = 0) out vec4 out_color0; layout(location = 1) out vec4 out_color1;
- #define FRAGMENT_DEPTH gl_FragDepth
- #define FRAGMENT_FRONTFACE gl_FrontFacing
- #define INPUT_FRONTFACING
- #define DEREF_PTR( VAR ) VAR
- #if defined( D_HULL )
- #define IN( VAR ) VAR[ gl_InvocationID ]
- #define OUT( VAR ) VAR[ gl_InvocationID ]
- #define PATCH_OUT( VAR ) VAR
- #define OUTPUT_VERTEX_SCREEN_POSITION gl_out[ gl_InvocationID ].gl_Position
- #define INPUT_VERTEX_SCREEN_POSITION gl_in [ gl_InvocationID ].gl_Position
- #define TESS_LEVEL_EDGE( IND ) gl_TessLevelOuter[ IND ]
- #define TESS_LEVEL_INNER( IND ) gl_TessLevelInner[ IND ]
- #elif defined( D_DOMAIN )
- #define PATCH_IN( VAR, IND ) VAR[ IND ]
- #define IN( VAR, IND ) VAR[ IND ]
- #define OUT( VAR ) VAR
- #define INPUT_VERTEX_SCREEN_POSITION( IND ) gl_in [ IND ].gl_Position
- #define DOMAIN_COORDS gl_TessCoord
- #elif defined( D_GEOMETRY )
- #define OUTPUT_VERTEX_SCREEN_POSITION gl_Position
- #define INPUT_VERTEX_SCREEN_POSITION( IND ) gl_in [ IND ].gl_Position
- #define IN( VAR, IND ) VAR[ IND ]
- #define OUT( VAR ) VAR
- #else
- #define IN( VAR ) VAR
- #define OUT( VAR ) VAR
- #endif
- #define OUT_VERTEX_SCREEN_POSITION
- #define IN_SCREEN_POSITION
- #define VERTEX_SCREEN_POSITION gl_Position
- #elif defined(D_PLATFORM_ORBIS_COMPUTE)
- #define DECLARE_INPUT struct cInput {
- #define DECLARE_END };
- #define DECLARE_PTR( TYPE, NAME ) TYPE* NAME;
- #define INPUT( TYPE, NAME, REG ) TYPE NAME : REG;
- #define INPUT_NOINTERP( TYPE, NAME, REG ) TYPE NAME : REG;
- #define IN_SCREEN_POSITION
- #define FRAGMENT_COLOUR lUniforms.mpCmpOutPerMesh.gOutTexture0[dispatchThreadID.xy]
- #define FRAGMENT_COLOUR0 lUniforms.mpCmpOutPerMesh.gOutTexture0[dispatchThreadID.xy]
- #define FRAGMENT_COLOUR1 lUniforms.mpCmpOutPerMesh.gOutTexture1[dispatchThreadID.xy]
- #define FRAGMENT_COLOUR2 lUniforms.mpCmpOutPerMesh.gOutTexture2[dispatchThreadID.xy]
- #define FRAGMENT_COLOUR3 lUniforms.mpCmpOutPerMesh.gOutTexture3[dispatchThreadID.xy]
- #define FRAGMENT_COLOUR4 lUniforms.mpCmpOutPerMesh.gOutTexture4[dispatchThreadID.xy]
- #define FRAGMENT_DEPTH lUniforms.mpCmpOutPerMesh.gOutTextureDepth[dispatchThreadID.xy]
- #define DEREF_PTR( VAR ) *VAR
- #elif defined(D_PLATFORM_ORBIS)
- #define UNIFORM( TYPE, NAME ) ConstantBuffer NAME##CB{ TYPE NAME; };
- #define UNIFORM_SRT( TYPE, NAME ) ConstantBuffer NAME##CB{ TYPE NAME : S_SRT_DATA; };
- #define DECLARE_OUTPUT struct cOutput {
- #define DECLARE_INPUT struct cInput {
- #define DECLARE_END };
- #define DECLARE_PTR( TYPE, NAME ) TYPE* NAME;
- #define INPUT( TYPE, NAME, REG ) TYPE NAME : REG;
- #define INPUT_NOINTERP( TYPE, NAME, REG ) nointerp TYPE NAME : REG;
- #define INPUT_NOPERSP( TYPE, NAME, REG ) nopersp TYPE NAME : REG;
- #define OUTPUT( TYPE, NAME, REG ) TYPE NAME : REG;
- #define OUTPUT_NOINTERP( TYPE, NAME, REG ) nointerp TYPE NAME : REG;
- #define OUTPUT_NOPERSP( TYPE, NAME, REG ) nopersp TYPE NAME : REG;
- #define FRAGMENT_COLOUR_UVEC4_DEFINE
- #define FRAGMENT_COLOUR_UVEC4 Out.mColour
- #define FRAGMENT_COLOUR Out.mColour
- #define FRAGMENT_COLOUR0 Out.mColour0
- #define FRAGMENT_COLOUR1 Out.mColour1
- #define FRAGMENT_COLOUR2 Out.mColour2
- #define FRAGMENT_COLOUR3 Out.mColour3
- #define FRAGMENT_COLOUR4 Out.mColour4
- #define FRAGMENT_DEPTH Out.mDepth
- #define FRAGMENT_FRONTFACE In.mbFrontFacing
- #define INPUT_FRONTFACING bool mbFrontFacing : S_FRONT_FACE;
- #if defined( D_HULL )
- #define IN( VAR ) In[ uCPID ].VAR
- #define OUT( VAR ) Out.VAR
- #define PATCH_OUT( VAR ) Out.VAR
- #define OUTPUT_VERTEX_SCREEN_POSITION OUT( mScreenPositionVec4 )
- #define INPUT_VERTEX_SCREEN_POSITION IN( mScreenPositionVec4 )
- #define TESS_LEVEL_EDGE( IND ) Out.edge_ts[ IND ]
- #define TESS_LEVEL_INNER( IND ) Out.insi_ts[ IND ]
- #define DECLARE_PATCH_OUTPUT_TRI [DOMAIN_PATCH_TYPE("tri")] struct HSConstantOutputData {
- #define OUT_PATCH_TRI_TESS_CONSTANTS float edge_ts[3] : S_EDGE_TESS_FACTOR; \
- float insi_ts[1] : S_INSIDE_TESS_FACTOR;
- #define DECLARE_PATCH_OUTPUT_QUAD [DOMAIN_PATCH_TYPE("quad")] struct HSConstantOutputData (
- #define OUT_PATCH_QUAD_TESS_CONSTANTS float edge_ts[4] : S_EDGE_TESS_FACTOR; \
- float insi_ts[2] : S_INSIDE_TESS_FACTOR;
- #define PATCH_OUTPUT( TYPE, NAME, REG ) TYPE NAME : REG;
- #elif defined( D_DOMAIN )
- #define PATCH_IN( VAR, IND ) patchIn.VAR
- #define IN( VAR, IND ) In[ IND ].VAR
- #define OUT( VAR ) Out.VAR
- #define OUTPUT_VERTEX_SCREEN_POSITION OUT( mScreenPositionVec4 )
- #define INPUT_VERTEX_SCREEN_POSITION( IND ) IN( mScreenPositionVec4, IND )
- #define DOMAIN_COORDS domainCoordinates
- #define DECLARE_PATCH_INPUT_TRI [DOMAIN_PATCH_TYPE("tri")] struct HSConstantOutputData {
- #define IN_PATCH_TRI_TESS_CONSTANTS float edge_ts[3] : S_EDGE_TESS_FACTOR; \
- float insi_ts[1] : S_INSIDE_TESS_FACTOR;
- #define DECLARE_PATCH_INPUT_QUAD [DOMAIN_PATCH_TYPE("quad")] struct HSConstantOutputData {
- #define IN_PATCH_QUAD_TESS_CONSTANTS float edge_ts[4] : S_EDGE_TESS_FACTOR; \
- float insi_ts[2] : S_INSIDE_TESS_FACTOR;
- #define PATCH_INPUT( TYPE, NAME, REG ) TYPE NAME : REG;
- #elif defined( D_GEOMETRY )
- #define IN( VAR, IND ) In[ IND ].VAR
- #define OUT( VAR ) Out.VAR
- #define OUTPUT_VERTEX_SCREEN_POSITION OUT( mScreenPositionVec4 )
- #define INPUT_VERTEX_SCREEN_POSITION( IND ) IN( mScreenPositionVec4, IND )
- #define EMIT_VERTEX TriStream.Append( Out )
- #define END_PRIMITIVE TriStream.RestartStrip()
- #else
- #define IN( VAR ) In.VAR
- #define OUT( VAR ) Out.VAR
- #endif
- // TODO get rid of this - don't pass struct through functinos, pass members.
- #define DEREF_PTR( VAR ) *VAR
- #define OUT_VERTEX_SCREEN_POSITION OUTPUT( vec4, mScreenPositionVec4, S_POSITION )
- #define IN_SCREEN_POSITION INPUT ( vec4, mScreenPositionVec4, S_POSITION )
- #define VERTEX_SCREEN_POSITION OUT( mScreenPositionVec4 )
- #endif
- // =================================================================================================
- // Main
- // =================================================================================================
- #ifdef D_PLATFORM_PC
- #define VERTEX_MAIN void main( void )
- #define VERTEX_MAIN_SRT uniform UniformBuffer lUniforms; void main( void )
- #define HULL_TRI_MAIN_SRT layout( vertices = 3 ) out; uniform UniformBuffer lUniforms; void main( void )
- #define HULL_QUAD_MAIN_SRT layout( vertices = 4 ) out; uniform UniformBuffer lUniforms; void main( void )
- #define DOMAIN_TRI_MAIN_SRT layout( triangles, fractional_even_spacing ) in; uniform UniformBuffer lUniforms; void main( void )
- #define DOMAIN_QUAD_MAIN_SRT layout( quads, fractional_even_spacing ) in; uniform UniformBuffer lUniforms; void main( void )
- #define FRAGMENT_MAIN_COLOUR FRAGMENT_COLOUR_VEC4_DEFINE void main( void )
- #define VOID_MAIN_COLOUR FRAGMENT_COLOUR_VEC4_DEFINE void main( void )
- #define FRAGMENT_MAIN_COLOUR_DEPTH FRAGMENT_COLOUR_VEC4_DEFINE void main( void )
- #define FRAGMENT_MAIN_COLOUR_DEPTH_SRT FRAGMENT_COLOUR_VEC4_DEFINE uniform UniformBuffer lUniforms; void main( void )
- #define FRAGMENT_MAIN_COLOUR_DEPTH_GE_SRT FRAGMENT_COLOUR_VEC4_DEFINE uniform UniformBuffer lUniforms; void main( void )
- #define FRAGMENT_MAIN_COLOUR_DEPTH_LE_SRT FRAGMENT_COLOUR_VEC4_DEFINE uniform UniformBuffer lUniforms; void main( void )
- #define FRAGMENT_MAIN_COLOUR_SRT FRAGMENT_COLOUR_VEC4_DEFINE uniform UniformBuffer lUniforms; void main( void )
- #define FRAGMENT_MAIN_COLOUR_EARLYZ_SRT FRAGMENT_COLOUR_VEC4_DEFINE uniform UniformBuffer lUniforms; void main( void )
- #define FRAGMENT_MAIN_UICOLOUR_SRT FRAGMENT_COLOUR_UVEC4_DEFINE uniform UniformBuffer lUniforms; void main( void )
- #define VOID_MAIN_SRT FRAGMENT_COLOUR_VEC4_DEFINE uniform UniformBuffer lUniforms; void main( void )
- #define VOID_MAIN_DEPTH_SRT FRAGMENT_COLOUR_VEC4_DEFINE uniform UniformBuffer lUniforms; void main( void )
- #define FRAGMENT_MAIN_COLOUR01_SRT FRAGMENT_COLOUR01_VEC4_DEFINE uniform UniformBuffer lUniforms; void main( void )
- #define FRAGMENT_MAIN_COLOUR01_DEPTH_SRT FRAGMENT_COLOUR01_VEC4_DEFINE uniform UniformBuffer lUniforms; void main( void )
- #elif defined( D_PLATFORM_PC_COMPUTE )
- #define COMPUTE_MAIN_SRT( X, Y, Z ) layout (local_size_x = X, local_size_y = Y, local_size_z = Z) in; void main( void )
- #define FRAGMENT_MAIN_COLOUR_SRT COMPUTE_MAIN_SRT( 8,8,1 )
- #define FRAGMENT_MAIN_COLOUR01_SRT COMPUTE_MAIN_SRT( 8,8,1 )
- #define FRAGMENT_MAIN_COLOUR_DEPTH_SRT COMPUTE_MAIN_SRT( 8,8,1 )
- #elif defined( D_PLATFORM_ORBIS_COMPUTE )
- #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)
- #define FRAGMENT_MAIN_COLOUR_SRT COMPUTE_MAIN_SRT( 8,8,1 )
- #define FRAGMENT_MAIN_COLOUR01_SRT COMPUTE_MAIN_SRT( 8,8,1 )
- #define FRAGMENT_MAIN_COLOUR_DEPTH_SRT COMPUTE_MAIN_SRT( 8,8,1 )
- #elif defined( D_PLATFORM_ORBIS )
- #define VERTEX_MAIN void main( cInput In, out cOutput Out )
- #define VERTEX_MAIN_SRT void main( cInput In, out cOutput Out, UniformBuffer lUniforms : S_SRT_DATA )
- #define HULL_TRI_MAIN_SRT [DOMAIN_PATCH_TYPE("tri")] \
- [PARTITIONING_TYPE("integer")] \
- [OUTPUT_TOPOLOGY_TYPE("triangle_cw")] \
- [OUTPUT_CONTROL_POINTS(3)] \
- [PATCH_CONSTANT_FUNC("ConstantsHS")] \
- [MAX_TESS_FACTOR(16.0)] \
- void main( \
- InputPatch<cInput, 3> In, \
- uint uCPID : S_OUTPUT_CONTROL_POINT_ID, \
- UniformBuffer lUniforms : S_SRT_DATA, \
- out cOutput Out )
- #define HULL_QUAD_MAIN_SRT [DOMAIN_PATCH_TYPE("quad")] \
- [PARTITIONING_TYPE("integer")] \
- [OUTPUT_TOPOLOGY_TYPE("triangle_cw")] \
- [OUTPUT_CONTROL_POINTS(4)] \
- [PATCH_CONSTANT_FUNC("ConstantsHS")] \
- [MAX_TESS_FACTOR(16.0)] \
- void main( \
- InputPatch<cInput, 4> In, \
- uint uCPID : S_OUTPUT_CONTROL_POINT_ID, \
- UniformBuffer lUniforms : S_SRT_DATA, \
- out cOutput Out )
- #define DOMAIN_TRI_MAIN_SRT [DOMAIN_PATCH_TYPE("tri")] \
- void main( \
- HSConstantOutputData patchIn, \
- const OutputPatch<cInput, 3> In, \
- out cOutput Out, \
- UniformBuffer lUniforms : S_SRT_DATA, \
- float3 domainCoordinates : S_DOMAIN_LOCATION )
- #define DOMAIN_QUAD_MAIN_SRT [DOMAIN_PATCH_TYPE("quad")] \
- void main( \
- HSConstantOutputData patchIn, \
- const OutputPatch<cInput, 4> In, \
- out cOutput Out, \
- UniformBuffer lUniforms : S_SRT_DATA, \
- float2 domainCoordinates : S_DOMAIN_LOCATION )
- #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 )
- #define FRAGMENT_MAIN_COLOUR struct cOutput { vec4 mColour : S_TARGET_OUTPUT; }; [RE_Z] void main( cInput In, out cOutput Out )
- #define VOID_MAIN_COLOUR struct cOutput { vec4 mColour : S_TARGET_OUTPUT; }; void main( cInput In, out cOutput Out )
- #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 )
- #define VOID_MAIN_SRT void main( cInput In, UniformBuffer lUniforms : S_SRT_DATA )
- #if defined( D_TAA_RENDER_TARGETS )
- #define FRAGMENT_MAIN_COLOUR_SRT struct cOutput { vec4 mColour0 : S_TARGET_OUTPUT0; \
- vec4 mColour1 : S_TARGET_OUTPUT1; \
- vec4 mColour2 : S_TARGET_OUTPUT2; }; \
- [RE_Z] void main( cInput In, out cOutput Out, UniformBuffer lUniforms : S_SRT_DATA )
- #elif !defined( D_ATTRIBUTES )
- #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 )
- #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 )
- #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 )
- #define FRAGMENT_MAIN_COLOUR_SRT struct cOutput { vec4 mColour : S_TARGET_OUTPUT; }; void main( cInput In, out cOutput Out, UniformBuffer lUniforms : S_SRT_DATA )
- #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 )
- #define VOID_MAIN_COLOUR_EARLYZ_SRT [FORCE_EARLY_DEPTH_STENCIL] void main( cInput In, UniformBuffer lUniforms : S_SRT_DATA )
- #define FRAGMENT_MAIN_COLOUR01_SRT struct cOutput { vec4 mColour0 : S_TARGET_OUTPUT0; \
- vec4 mColour1 : S_TARGET_OUTPUT1; }; \
- [RE_Z] void main( cInput In, out cOutput Out, UniformBuffer lUniforms : S_SRT_DATA )
- #define FRAGMENT_MAIN_COLOUR01_DEPTH_SRT struct cOutput { vec4 mColour0 : S_TARGET_OUTPUT0; \
- vec4 mColour1 : S_TARGET_OUTPUT1; \
- float mDepth : S_DEPTH_OUTPUT; }; \
- [RE_Z] void main( cInput In, out cOutput Out, UniformBuffer lUniforms : S_SRT_DATA )
- #else
- // #pragma PSSL_target_output_format(target 1 FMT_32_AR)
- #define FRAGMENT_MAIN_COLOUR_DEPTH_SRT struct cOutput { vec4 mColour0 : S_TARGET_OUTPUT0; \
- vec4 mColour1 : S_TARGET_OUTPUT1; \
- vec4 mColour2 : S_TARGET_OUTPUT2; \
- vec4 mColour3 : S_TARGET_OUTPUT3; \
- float mDepth : S_DEPTH_OUTPUT; }; \
- [RE_Z] void main( cInput In, out cOutput Out, UniformBuffer lUniforms : S_SRT_DATA )
- #define FRAGMENT_MAIN_COLOUR_SRT struct cOutput { vec4 mColour0 : S_TARGET_OUTPUT0; \
- vec4 mColour1 : S_TARGET_OUTPUT1; \
- vec4 mColour2 : S_TARGET_OUTPUT2; \
- vec4 mColour3 : S_TARGET_OUTPUT3; }; \
- [RE_Z] void main( cInput In, out cOutput Out, UniformBuffer lUniforms : S_SRT_DATA )
- #define FRAGMENT_MAIN_COLOUR_EARLYZ_SRT struct cOutput { vec4 mColour0 : S_TARGET_OUTPUT0; \
- vec4 mColour1 : S_TARGET_OUTPUT1; \
- vec4 mColour2 : S_TARGET_OUTPUT2; \
- vec4 mColour3 : S_TARGET_OUTPUT3; }; \
- [FORCE_EARLY_DEPTH_STENCIL] void main( cInput In, out cOutput Out, UniformBuffer lUniforms : S_SRT_DATA )
- #endif
- #endif
- // =================================================================================================
- // Texture resolution
- // =================================================================================================
- #ifdef D_PLATFORM_ORBIS
- uvec2 GetResolution( Texture2D lTexture )
- {
- uvec2 lResolution;
- lTexture.GetDimensionsFast(lResolution.x, lResolution.y);
- return lResolution;
- }
- uvec2 GetResolution( RW_Texture2D<float4> lTexture )
- {
- uvec2 lResolution;
- lTexture.GetDimensionsFast(lResolution.x, lResolution.y);
- return lResolution;
- }
- #else
- uvec2 GetResolution( sampler2D lTexture )
- {
- return textureSize( lTexture, 0 );
- }
- #endif
- // =================================================================================================
- // Viewport
- // =================================================================================================
- #ifdef D_PLATFORM_PC
- #define SCREENSPACE_AS_RENDERTARGET_UVS( A ) A.xy
- #elif defined(D_PLATFORM_ORBIS)
- #define SCREENSPACE_AS_RENDERTARGET_UVS( A ) ( float2( A.x, 1.0 - A.y ) )
- #endif
- #ifdef D_USING_LOGDEPTH
- #define D_DEPTH_CLEARVALUE (1.0)
- #else
- #define D_DEPTH_CLEARVALUE (0.0)
- #endif
- // =================================================================================================
- // Texture usage feedback
- // =================================================================================================
- #if defined( D_TEXTURE_FEEDBACK ) && defined( D_PLATFORM_PC )
- layout(r32i) uniform iimage2D gTexFeedbackImg;
- void WriteTexFeedback( in int liCounter, in float liMip )
- {
- if( liCounter != 0 )
- {
- #if defined( GL_ARB_shader_ballot ) && ( GL_ARB_shader_ballot == 1 )
- if( readFirstInvocationARB( gl_SubGroupInvocationARB ) == gl_SubGroupInvocationARB )
- #endif
- {
- int liIntMip = int(floor(liMip));
- //imageStore( gTexFeedbackImg, ivec2( liCounter, liIntMip ), ivec4(1,0,0,0) );
- imageAtomicAdd( gTexFeedbackImg, ivec2( liCounter, liIntMip ), int(1) );
- }
- }
- }
- vec4 Tex2dFeedback( in sampler2D lSamp, in int liCounter, in vec2 lCoords )
- {
- float liLod = textureQueryLOD( lSamp, lCoords ).x;
- WriteTexFeedback( liCounter, liLod );
- return texture( lSamp, lCoords );
- }
- vec4 Tex2dLodFeedback( in sampler2D lSamp, in int liCounter, in vec2 lCoords, in float liLod )
- {
- WriteTexFeedback( liCounter, liLod );
- return textureLod( lSamp, lCoords, liLod );
- }
- vec4 Tex2dArrayFeedback( in sampler2DArray lSamp, in int liCounter, in vec3 lCoords )
- {
- float liLod = textureQueryLOD( lSamp, lCoords.xy ).x;
- WriteTexFeedback( liCounter, liLod );
- return texture( lSamp, lCoords );
- }
- vec4 Tex3dFeedback( in sampler3D lSamp, in int liCounter, in vec3 lCoords )
- {
- float liLod = textureQueryLOD( lSamp, lCoords ).x;
- WriteTexFeedback( liCounter, liLod );
- return texture( lSamp, lCoords );
- }
- vec4 Tex3dLodFeedback( in sampler3D lSamp, in int liCounter, in vec3 lCoords, in float liLod )
- {
- WriteTexFeedback( liCounter, liLod );
- return textureLod( lSamp, lCoords, liLod );
- }
- #endif
- #endif
- ////////////////////////////////////////////////////////////////////////////////
- ///
- /// @file CommonUniforms.h
- /// @author User
- /// @date
- ///
- /// @brief CommonUniforms
- ///
- /// Copyright (c) 2008 Hello Games Ltd. All Rights Reserved.
- ///
- ////////////////////////////////////////////////////////////////////////////////
- #ifndef D_COMMONUNIFORMS2_H
- #define D_COMMONUNIFORMS2_H
- // =================================================================================================
- #ifndef D_DEFINES
- #define D_DEFINES
- // =================================================================================================
- // Platform defines
- // =================================================================================================
- #ifdef D_PLATFORM_PC
- #define D_ENABLE_REVERSEZ_PROJECTION (1)
- #pragma optionNV(strict on)
- #extension GL_ARB_gpu_shader5 : enable
- #extension GL_ARB_fragment_coord_conventions : enable
- #extension GL_ARB_derivative_control : enable
- #if defined( D_FRAGMENT ) && defined( _F64_ )
- layout(early_fragment_tests) in;
- #endif
- #elif defined(D_PLATFORM_ORBIS)
- #define D_ENABLE_REVERSEZ_PROJECTION (1)
- // use this with sdk 2.0 compiler
- // #pragma argument (allow-scratch-buffer-spill)
- //define these flags so they don't get ignored in build process and in the comb mask
- //this is because materials, vertex layouts and shaders need to be synced on 360 to avoid patching
- #ifdef _F27_
- #endif
- #ifdef _F28_
- #endif
- #ifdef _F29_
- #endif
- #ifdef _F21_
- #endif
- #ifdef _F02_
- #endif
- #ifdef _F03_
- #endif
- #if defined( _F01_ ) || defined( D_LOD0 ) || defined( D_LOD1 ) || defined( D_LOD2 ) || defined( D_LOD3) || defined( D_LOD4 )
- #endif
- #ifdef _F01_
- #endif
- #ifdef _F09_
- #endif
- #ifdef _F10_
- #endif
- // disable warnings for unused parameters. This happens a lot because of defining different things.
- #pragma warning (disable: 5203)
- // temp thing to know what things are still required on ps4.
- #define D_PLATFORM_ORBIS_FIX
- #ifdef __PSSL_CS__
- #define D_PLATFORM_ORBIS_COMPUTE
- #endif
- #ifdef __PSSL_HS__
- #define D_HULL
- #endif
- #ifdef __PSSL_DS__
- #define D_DOMAIN
- #endif
- #ifdef __PSSL_VS__
- #define D_VERTEX
- #endif
- #ifdef __PSSL_GS__
- #define D_GEOMETRY
- #endif
- #endif
- #if !D_ENABLE_REVERSEZ_PROJECTION
- #define D_USING_LOGDEPTH
- #endif
- // =================================================================================================
- // Basic Types
- // =================================================================================================
- #ifdef D_PLATFORM_PC
- #define JOINT_TYPE vec4
- //#define CONST const
- #define STATIC_CONST const
- #elif defined(D_PLATFORM_ORBIS)
- #define JOINT_TYPE int4
- #define float float
- #define vec2 float2
- #define vec3 float3
- #define vec4 float4
- #define ivec2 int2
- #define ivec3 int3
- #define ivec4 int4
- #define uvec2 uint2
- #define uvec3 uint3
- #define uvec4 uint4
- // NOTE:
- // operator[] accesses rows, not columns
- // matrix constructors interpret the passed vectors as row vectors, not column vectors
- #define mat2 row_major float2x2
- #define mat3 row_major float3x3
- #define mat4 row_major float4x4
- //#define CONST
- #define STATIC_CONST static const
- // #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.
- #endif
- // =================================================================================================
- // Functions
- // =================================================================================================
- #ifdef D_PLATFORM_PC
- #define saturate( V ) min( max( V, 0.0) , 1.0)
- #define atan2( Y, X ) atan( Y, X )
- #define invsqrt( X ) inversesqrt( X )
- #ifdef D_COMPUTE
- #define groupID gl_WorkGroupID
- #define groupThreadID gl_LocalInvocationID
- #define dispatchThreadID gl_GlobalInvocationID
- #endif
- #elif defined(D_PLATFORM_ORBIS)
- #if defined(D_PLATFORM_ORBIS_COMPUTE)
- float dFdx( float var ) { float delta = var - LaneSwizzle( var, 0x1f, 0, 1 ); return __v_cndmask_b32(0, 1, 0xAAAAAAAAAAAAAAAA ) ? delta : -delta; }
- float dFdy( float var ) { float delta = var - LaneSwizzle( var, 0x1f, 0, 8 ); return __v_cndmask_b32(0, 1, 0xFF00FF00FF00FF00 ) ? delta : -delta; }
- 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; }
- 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; }
- 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; }
- 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; }
- 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; }
- 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; }
- #define dFdxFine dFdx
- #define dFdyFine dFdy
- #else
- #define dFdx ddx
- #define dFdy ddy
- #define dFdxFine ddx_fine
- #define dFdyFine ddy_fine
- #endif
- #define mix lerp
- #define fract frac
- #define mod fmod
- #define saturate( V ) ( min( max( V, 0.0) , 1.0) )
- #define invsqrt( X ) rsqrt( X )
- #endif
- // =================================================================================================
- // Samplers and textures
- // =================================================================================================
- #ifdef D_PLATFORM_PC
- #define shadow2D( S, UV ) texture( S, UV )
- #define SAMPLER2DSHADOW( NAME, REG ) uniform sampler2DShadow NAME
- #define SAMPLERCUBE( NAME ) samplerCube NAME
- #define SAMPLERCUBEARG( NAME ) in samplerCube NAME
- #define SAMPLERCUBEPARAM( NAME ) NAME
- #define imageAtomicAddOut( T, C, V, O ) O = imageAtomicAdd( T, C, V )
- #if defined( D_TEXTURE_FEEDBACK )
- #define texture2D( T, C ) Tex2dFeedback( T, T##FB, C )
- #define texture2DLod( T, C, N ) Tex2dLodFeedback( T, T##FB, C, N )
- #define texture2DArray( T, C ) Tex2dArrayFeedback( T, T##FB, C )
- #define texture3D( S, UV ) Tex3dFeedback( S, S##FB, UV )
- #define texture3DLod( S, UV, LOD ) Tex3dLodFeedback( S, S##FB, UV, LOD )
- #define SAMPLER2DARG( NAME ) in sampler2D NAME, in int NAME##FB
- #define SAMPLER2DPARAM( NAME ) NAME, NAME##FB
- #define SAMPLER2DARRAYARG( NAME ) in sampler2DArray NAME, in int NAME##FB
- #define SAMPLER2DARRAYPARAM( NAME ) NAME, NAME##FB
- #define SAMPLER2D( NAME ) sampler2D NAME; int NAME##FB
- #define SAMPLER2DARRAY( NAME ) sampler2DArray NAME; int NAME##FB
- #define SAMPLER3D( NAME ) sampler3D NAME; int NAME##FB
- #define SAMPLER2DSHADOW_SRT( NAME ) sampler2DShadow NAME; int NAME##FB
- #else
- #define texture2DLod( S, UV, LOD ) textureLod( S, UV, LOD )
- #define texture3DLod( S, UV, LOD ) textureLod( S, UV, LOD )
- #define SAMPLER2DARG( NAME ) in sampler2D NAME
- #define SAMPLER2DPARAM( NAME ) NAME
- #define SAMPLER2DARRAYARG( NAME ) in sampler2DArray NAME
- #define SAMPLER2DARRAYPARAM( NAME ) NAME
- #define SAMPLER2D( NAME ) sampler2D NAME
- #define SAMPLER2DARRAY( NAME ) sampler2DArray NAME
- #define SAMPLER3D( NAME ) sampler3D NAME
- #define SAMPLER2DSHADOW_SRT( NAME ) sampler2DShadow NAME
- #endif
- #define textureGatherRed( lTex, lSamp ) textureGather( lTex, lSamp, 0 )
- #define textureGatherGreen( lTex, lSamp ) textureGather( lTex, lSamp, 1 )
- #define textureGatherBlue( lTex, lSamp ) textureGather( lTex, lSamp, 2 )
- #define textureGatherAlpha( lTex, lSamp ) textureGather( lTex, lSamp, 3 )
- #define texture2DComputeGrad( T, C ) texture2D( T, C )
- #elif defined(D_PLATFORM_ORBIS)
- #define SAMPLERCUBE( NAME, REG ) SamplerState NAME##SS : register( s##REG ); TextureCube NAME##TU : register( t##REG )
- #define SAMPLER2D( NAME ) Texture2D NAME; SamplerState NAME##SS
- #define SAMPLER2DSHADOW_SRT( NAME ) Texture2D NAME; SamplerComparisonState NAME##SS //SAMPLER2D( NAME )
- #define SAMPLER3D( NAME ) Texture3D NAME; SamplerState NAME##SS
- #define SAMPLER2DARRAY( NAME ) Texture2D_Array NAME; SamplerState NAME##SS
- #define SAMPLER2DARRAYARG( NAME ) Texture2D_Array NAME, SamplerState NAME##SS
- #define SAMPLER2DARRAYPARAM( NAME ) NAME, NAME##SS
- #define SAMPLER2DPARAM( NAME ) NAME, NAME##SS
- #define SAMPLER2DARG( NAME ) Texture2D NAME, SamplerState NAME##SS
- #define texture2D( T, C ) T.Sample( T##SS, C )
- #if defined(D_PLATFORM_ORBIS_COMPUTE)
- #define texture2DComputeGrad( T, C ) T.SampleGradient( T##SS, C, vec2( dFdx( C ) ), vec2( dFdy( C ) ) )
- #define shadow2D( T, C ) T.SampleCmpLOD0( T##SS, C.xy, C.z )
- #else
- #define texture2DComputeGrad( T, C ) T.Sample( T##SS, C )
- #define shadow2D( T, C ) T.SampleCmp( T##SS, C.xy, C.z )
- #endif
- #define texture2DLod( T, C, N ) T.SampleLOD( T##SS, C, N )
- #define texture2DArray( T, C ) T.Sample( T##SS, C )
- #define texture3DLod( T, C, N ) T.SampleLOD( T##SS, C, N )
- //#define shadow2D( T, C ) vec3( C.z > T.Sample( T##SS, C.xy ).x ? 1.0 : 0.0 )
- //#define shadow2D( T, C ) T.GatherCmp( T##SS, C.xy, C.z )
- //#define shadow2D( T, C ) T.SampleCmpLOD0( T##SS, C.xy, C.z )
- #define textureCube( T, C ) T##TU.Sample( T##SS, C )
- #define textureCubeLod( T, C, N ) T##TU.Sample( T##SS, C, N )
- #define textureGrad( T, C, DDX, DDY ) T.SampleGradient( T##SS, C, DDX, DDY )
- #define imageAtomicAdd( T, C, V ) AtomicAdd( T[ C ], V )
- #define imageAtomicAddOut( T, C, V, O ) AtomicAdd( T[ C ], V, O )
- #define imageStore( T, C, V ) ( T[C] = V )
- #define textureGatherRed( lTex, lSamp ) lTex.GatherRed ( lTex##SS, lSamp )
- #define textureGatherGreen( lTex, lSamp ) lTex.GatherGreen( lTex##SS, lSamp )
- #define textureGatherBlue( lTex, lSamp ) lTex.GatherBlue ( lTex##SS, lSamp )
- #define textureGatherAlpha( lTex, lSamp ) lTex.GatherAlpha( lTex##SS, lSamp )
- #define texelFetch( lTex, lSamp, lLod ) lTex.MipMaps((lLod), (lSamp))
- #endif
- #if defined(D_PLATFORM_ORBIS_COMPUTE)
- #define THREADGROUP_LOCAL thread_group_memory
- #define THREADGROUP_BARRIER ThreadGroupMemoryBarrier()
- #elif defined(D_PLATFORM_PC_COMPUTE)
- #define THREADGROUP_LOCAL layout( shared )
- #define THREADGROUP_BARRIER groupMemoryBarrier()
- #endif
- // =================================================================================================
- // Matrices
- // =================================================================================================
- #ifdef D_PLATFORM_PC
- #define MUL( INPUT_A, INPUT_B ) (INPUT_A * INPUT_B)
- #define PLATFORM_TRANSPOSE
- #define MAT4_SET_POS( M, P ) M[ 3 ] = P
- #define MAT4_SET_TRANSLATION( M, T ) M[ 3 ].xyz = T
- #define MAT4_GET_COLUMN( M, C ) M[ C ].xyz
- #define MAT3_GET_COLUMN( M, C ) M[ C ]
- #define MAT4_GET_COLUMN_VEC4( M, C ) M[ C ]
- #define MAT3_SET_COLUMN( M, C, V ) M[ C ] = V;
- #define MAT4_SET_COLUMN( M, C, V ) M[ C ] = V;
- #elif defined(D_PLATFORM_ORBIS)
- #define MUL( INPUT_A, INPUT_B ) mul( INPUT_B, INPUT_A )
- #define PLATFORM_TRANSPOSE
- #define MAT4_SET_POS( M, P ) M[ 3 ] = P
- #define MAT4_SET_TRANSLATION( M, T ) M[ 3 ].xyz = T
- #define MAT4_GET_COLUMN( M, C ) M[ C ].xyz
- #define MAT3_GET_COLUMN( M, C ) M[ C ]
- #define MAT4_GET_COLUMN_VEC4( M, C ) M[ C ]
- #define MAT3_SET_COLUMN( M, C, V ) M[ C ] = V;
- #define MAT4_SET_COLUMN( M, C, V ) M[ C ] = V;
- #endif
- // =================================================================================================
- // Arrays (workaround AMD shader compiler issues by making arrays have global scope)
- // =================================================================================================
- #if defined(D_PLATFORM_ORBIS)
- #define ARRAY_LOOKUP_FS( _UNIFORMS, _ELEMENT, _INDEX) _UNIFORMS._ELEMENT[_INDEX]
- #define ARRAY_LOOKUP_FP( _UNIFORMS, _ELEMENT, _INDEX) _UNIFORMS._ELEMENT[_INDEX]
- #else
- #define ARRAY_LOOKUP_FS( _UNIFORMS, _ELEMENT, _INDEX) _ELEMENT[_INDEX]
- #define ARRAY_LOOKUP_FP( _UNIFORMS, _ELEMENT, _INDEX) _ELEMENT[_INDEX]
- #endif
- // =================================================================================================
- // Input and Output
- // =================================================================================================
- #ifdef D_PLATFORM_PC
- #define UNIFORM( TYPE, NAME ) uniform TYPE NAME
- #define UNIFORM_SRT( TYPE, NAME ) uniform TYPE NAME
- #define DECLARE_INPUT
- #define DECLARE_OUTPUT
- #define DECLARE_END
- #define DECLARE_PTR( TYPE, NAME ) TYPE NAME;
- #define DECLARE_PATCH_INPUT_TRI
- #define DECLARE_PATCH_OUTPUT_TRI
- #define IN_PATCH_TRI_TESS_CONSTANTS
- #define OUT_PATCH_TRI_TESS_CONSTANTS
- #define DECLARE_PATCH_INPUT_QUAD
- #define DECLARE_PATCH_OUTPUT_QUAD
- #define IN_PATCH_QUAD_TESS_CONSTANTS
- #define OUT_PATCH_QUAD_TESS_CONSTANTS
- #if defined( D_HULL )
- #define INPUT( TYPE, NAME, REG ) in TYPE NAME [];
- #define INPUT_NOINTERP( TYPE, NAME, REG ) flat in TYPE NAME [];
- #define INPUT_NOPERSP( TYPE, NAME, REG ) in TYPE NAME [];
- #define PATCH_OUTPUT( TYPE, NAME, REG ) patch out TYPE NAME;
- #define OUTPUT( TYPE, NAME, REG ) out TYPE NAME [];
- #define OUTPUT_NOINTERP( TYPE, NAME, REG ) flat out TYPE NAME [];
- #define OUTPUT_NOPERSP( TYPE, NAME, REG ) out TYPE NAME [];
- #elif defined( D_DOMAIN )
- #define PATCH_INPUT( TYPE, NAME, REG ) patch in TYPE NAME;
- #define INPUT( TYPE, NAME, REG ) in TYPE NAME [];
- #define INPUT_NOINTERP( TYPE, NAME, REG ) flat in TYPE NAME [];
- #define INPUT_NOPERSP( TYPE, NAME, REG ) in TYPE NAME [];
- #define OUTPUT( TYPE, NAME, REG ) out TYPE NAME;
- #define OUTPUT_NOINTERP( TYPE, NAME, REG ) flat out TYPE NAME;
- #define OUTPUT_NOPERSP( TYPE, NAME, REG ) out TYPE NAME;
- #else
- #define INPUT( TYPE, NAME, REG ) in TYPE NAME;
- #define INPUT_NOINTERP( TYPE, NAME, REG ) flat in TYPE NAME;
- #define INPUT_NOPERSP( TYPE, NAME, REG ) in TYPE NAME;
- #define OUTPUT( TYPE, NAME, REG ) out TYPE NAME;
- #define OUTPUT_NOINTERP( TYPE, NAME, REG ) flat out TYPE NAME;
- #define OUTPUT_NOPERSP( TYPE, NAME, REG ) out TYPE NAME;
- #endif
- #define FRAGMENT_COLOUR_UVEC4_DEFINE layout(location = 0) out uvec4 outu_color0;
- #define FRAGMENT_COLOUR_UVEC4 outu_color0
- #define FRAGMENT_COLOUR out_color0
- #define FRAGMENT_COLOUR0 out_color0
- #define FRAGMENT_COLOUR1 out_color1
- #define FRAGMENT_COLOUR2 out_color2
- #define FRAGMENT_COLOUR3 out_color3
- #define FRAGMENT_COLOUR4 out_color4
- #if defined( D_TAA_RENDER_TARGETS )
- #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;
- #elif !defined(D_ATTRIBUTES)
- #define FRAGMENT_COLOUR_VEC4_DEFINE layout(location = 0) out vec4 out_color0;
- #else
- #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;
- #endif
- #define FRAGMENT_COLOUR01_VEC4_DEFINE layout(location = 0) out vec4 out_color0; layout(location = 1) out vec4 out_color1;
- #define FRAGMENT_DEPTH gl_FragDepth
- #define FRAGMENT_FRONTFACE gl_FrontFacing
- #define INPUT_FRONTFACING
- #define DEREF_PTR( VAR ) VAR
- #if defined( D_HULL )
- #define IN( VAR ) VAR[ gl_InvocationID ]
- #define OUT( VAR ) VAR[ gl_InvocationID ]
- #define PATCH_OUT( VAR ) VAR
- #define OUTPUT_VERTEX_SCREEN_POSITION gl_out[ gl_InvocationID ].gl_Position
- #define INPUT_VERTEX_SCREEN_POSITION gl_in [ gl_InvocationID ].gl_Position
- #define TESS_LEVEL_EDGE( IND ) gl_TessLevelOuter[ IND ]
- #define TESS_LEVEL_INNER( IND ) gl_TessLevelInner[ IND ]
- #elif defined( D_DOMAIN )
- #define PATCH_IN( VAR, IND ) VAR[ IND ]
- #define IN( VAR, IND ) VAR[ IND ]
- #define OUT( VAR ) VAR
- #define INPUT_VERTEX_SCREEN_POSITION( IND ) gl_in [ IND ].gl_Position
- #define DOMAIN_COORDS gl_TessCoord
- #elif defined( D_GEOMETRY )
- #define OUTPUT_VERTEX_SCREEN_POSITION gl_Position
- #define INPUT_VERTEX_SCREEN_POSITION( IND ) gl_in [ IND ].gl_Position
- #define IN( VAR, IND ) VAR[ IND ]
- #define OUT( VAR ) VAR
- #else
- #define IN( VAR ) VAR
- #define OUT( VAR ) VAR
- #endif
- #define OUT_VERTEX_SCREEN_POSITION
- #define IN_SCREEN_POSITION
- #define VERTEX_SCREEN_POSITION gl_Position
- #elif defined(D_PLATFORM_ORBIS_COMPUTE)
- #define DECLARE_INPUT struct cInput {
- #define DECLARE_END };
- #define DECLARE_PTR( TYPE, NAME ) TYPE* NAME;
- #define INPUT( TYPE, NAME, REG ) TYPE NAME : REG;
- #define INPUT_NOINTERP( TYPE, NAME, REG ) TYPE NAME : REG;
- #define IN_SCREEN_POSITION
- #define FRAGMENT_COLOUR lUniforms.mpCmpOutPerMesh.gOutTexture0[dispatchThreadID.xy]
- #define FRAGMENT_COLOUR0 lUniforms.mpCmpOutPerMesh.gOutTexture0[dispatchThreadID.xy]
- #define FRAGMENT_COLOUR1 lUniforms.mpCmpOutPerMesh.gOutTexture1[dispatchThreadID.xy]
- #define FRAGMENT_COLOUR2 lUniforms.mpCmpOutPerMesh.gOutTexture2[dispatchThreadID.xy]
- #define FRAGMENT_COLOUR3 lUniforms.mpCmpOutPerMesh.gOutTexture3[dispatchThreadID.xy]
- #define FRAGMENT_COLOUR4 lUniforms.mpCmpOutPerMesh.gOutTexture4[dispatchThreadID.xy]
- #define FRAGMENT_DEPTH lUniforms.mpCmpOutPerMesh.gOutTextureDepth[dispatchThreadID.xy]
- #define DEREF_PTR( VAR ) *VAR
- #elif defined(D_PLATFORM_ORBIS)
- #define UNIFORM( TYPE, NAME ) ConstantBuffer NAME##CB{ TYPE NAME; };
- #define UNIFORM_SRT( TYPE, NAME ) ConstantBuffer NAME##CB{ TYPE NAME : S_SRT_DATA; };
- #define DECLARE_OUTPUT struct cOutput {
- #define DECLARE_INPUT struct cInput {
- #define DECLARE_END };
- #define DECLARE_PTR( TYPE, NAME ) TYPE* NAME;
- #define INPUT( TYPE, NAME, REG ) TYPE NAME : REG;
- #define INPUT_NOINTERP( TYPE, NAME, REG ) nointerp TYPE NAME : REG;
- #define INPUT_NOPERSP( TYPE, NAME, REG ) nopersp TYPE NAME : REG;
- #define OUTPUT( TYPE, NAME, REG ) TYPE NAME : REG;
- #define OUTPUT_NOINTERP( TYPE, NAME, REG ) nointerp TYPE NAME : REG;
- #define OUTPUT_NOPERSP( TYPE, NAME, REG ) nopersp TYPE NAME : REG;
- #define FRAGMENT_COLOUR_UVEC4_DEFINE
- #define FRAGMENT_COLOUR_UVEC4 Out.mColour
- #define FRAGMENT_COLOUR Out.mColour
- #define FRAGMENT_COLOUR0 Out.mColour0
- #define FRAGMENT_COLOUR1 Out.mColour1
- #define FRAGMENT_COLOUR2 Out.mColour2
- #define FRAGMENT_COLOUR3 Out.mColour3
- #define FRAGMENT_COLOUR4 Out.mColour4
- #define FRAGMENT_DEPTH Out.mDepth
- #define FRAGMENT_FRONTFACE In.mbFrontFacing
- #define INPUT_FRONTFACING bool mbFrontFacing : S_FRONT_FACE;
- #if defined( D_HULL )
- #define IN( VAR ) In[ uCPID ].VAR
- #define OUT( VAR ) Out.VAR
- #define PATCH_OUT( VAR ) Out.VAR
- #define OUTPUT_VERTEX_SCREEN_POSITION OUT( mScreenPositionVec4 )
- #define INPUT_VERTEX_SCREEN_POSITION IN( mScreenPositionVec4 )
- #define TESS_LEVEL_EDGE( IND ) Out.edge_ts[ IND ]
- #define TESS_LEVEL_INNER( IND ) Out.insi_ts[ IND ]
- #define DECLARE_PATCH_OUTPUT_TRI [DOMAIN_PATCH_TYPE("tri")] struct HSConstantOutputData {
- #define OUT_PATCH_TRI_TESS_CONSTANTS float edge_ts[3] : S_EDGE_TESS_FACTOR; \
- float insi_ts[1] : S_INSIDE_TESS_FACTOR;
- #define DECLARE_PATCH_OUTPUT_QUAD [DOMAIN_PATCH_TYPE("quad")] struct HSConstantOutputData (
- #define OUT_PATCH_QUAD_TESS_CONSTANTS float edge_ts[4] : S_EDGE_TESS_FACTOR; \
- float insi_ts[2] : S_INSIDE_TESS_FACTOR;
- #define PATCH_OUTPUT( TYPE, NAME, REG ) TYPE NAME : REG;
- #elif defined( D_DOMAIN )
- #define PATCH_IN( VAR, IND ) patchIn.VAR
- #define IN( VAR, IND ) In[ IND ].VAR
- #define OUT( VAR ) Out.VAR
- #define OUTPUT_VERTEX_SCREEN_POSITION OUT( mScreenPositionVec4 )
- #define INPUT_VERTEX_SCREEN_POSITION( IND ) IN( mScreenPositionVec4, IND )
- #define DOMAIN_COORDS domainCoordinates
- #define DECLARE_PATCH_INPUT_TRI [DOMAIN_PATCH_TYPE("tri")] struct HSConstantOutputData {
- #define IN_PATCH_TRI_TESS_CONSTANTS float edge_ts[3] : S_EDGE_TESS_FACTOR; \
- float insi_ts[1] : S_INSIDE_TESS_FACTOR;
- #define DECLARE_PATCH_INPUT_QUAD [DOMAIN_PATCH_TYPE("quad")] struct HSConstantOutputData {
- #define IN_PATCH_QUAD_TESS_CONSTANTS float edge_ts[4] : S_EDGE_TESS_FACTOR; \
- float insi_ts[2] : S_INSIDE_TESS_FACTOR;
- #define PATCH_INPUT( TYPE, NAME, REG ) TYPE NAME : REG;
- #elif defined( D_GEOMETRY )
- #define IN( VAR, IND ) In[ IND ].VAR
- #define OUT( VAR ) Out.VAR
- #define OUTPUT_VERTEX_SCREEN_POSITION OUT( mScreenPositionVec4 )
- #define INPUT_VERTEX_SCREEN_POSITION( IND ) IN( mScreenPositionVec4, IND )
- #define EMIT_VERTEX TriStream.Append( Out )
- #define END_PRIMITIVE TriStream.RestartStrip()
- #else
- #define IN( VAR ) In.VAR
- #define OUT( VAR ) Out.VAR
- #endif
- // TODO get rid of this - don't pass struct through functinos, pass members.
- #define DEREF_PTR( VAR ) *VAR
- #define OUT_VERTEX_SCREEN_POSITION OUTPUT( vec4, mScreenPositionVec4, S_POSITION )
- #define IN_SCREEN_POSITION INPUT ( vec4, mScreenPositionVec4, S_POSITION )
- #define VERTEX_SCREEN_POSITION OUT( mScreenPositionVec4 )
- #endif
- // =================================================================================================
- // Main
- // =================================================================================================
- #ifdef D_PLATFORM_PC
- #define VERTEX_MAIN void main( void )
- #define VERTEX_MAIN_SRT uniform UniformBuffer lUniforms; void main( void )
- #define HULL_TRI_MAIN_SRT layout( vertices = 3 ) out; uniform UniformBuffer lUniforms; void main( void )
- #define HULL_QUAD_MAIN_SRT layout( vertices = 4 ) out; uniform UniformBuffer lUniforms; void main( void )
- #define DOMAIN_TRI_MAIN_SRT layout( triangles, fractional_even_spacing ) in; uniform UniformBuffer lUniforms; void main( void )
- #define DOMAIN_QUAD_MAIN_SRT layout( quads, fractional_even_spacing ) in; uniform UniformBuffer lUniforms; void main( void )
- #define FRAGMENT_MAIN_COLOUR FRAGMENT_COLOUR_VEC4_DEFINE void main( void )
- #define VOID_MAIN_COLOUR FRAGMENT_COLOUR_VEC4_DEFINE void main( void )
- #define FRAGMENT_MAIN_COLOUR_DEPTH FRAGMENT_COLOUR_VEC4_DEFINE void main( void )
- #define FRAGMENT_MAIN_COLOUR_DEPTH_SRT FRAGMENT_COLOUR_VEC4_DEFINE uniform UniformBuffer lUniforms; void main( void )
- #define FRAGMENT_MAIN_COLOUR_DEPTH_GE_SRT FRAGMENT_COLOUR_VEC4_DEFINE uniform UniformBuffer lUniforms; void main( void )
- #define FRAGMENT_MAIN_COLOUR_DEPTH_LE_SRT FRAGMENT_COLOUR_VEC4_DEFINE uniform UniformBuffer lUniforms; void main( void )
- #define FRAGMENT_MAIN_COLOUR_SRT FRAGMENT_COLOUR_VEC4_DEFINE uniform UniformBuffer lUniforms; void main( void )
- #define FRAGMENT_MAIN_COLOUR_EARLYZ_SRT FRAGMENT_COLOUR_VEC4_DEFINE uniform UniformBuffer lUniforms; void main( void )
- #define FRAGMENT_MAIN_UICOLOUR_SRT FRAGMENT_COLOUR_UVEC4_DEFINE uniform UniformBuffer lUniforms; void main( void )
- #define VOID_MAIN_SRT FRAGMENT_COLOUR_VEC4_DEFINE uniform UniformBuffer lUniforms; void main( void )
- #define VOID_MAIN_DEPTH_SRT FRAGMENT_COLOUR_VEC4_DEFINE uniform UniformBuffer lUniforms; void main( void )
- #define FRAGMENT_MAIN_COLOUR01_SRT FRAGMENT_COLOUR01_VEC4_DEFINE uniform UniformBuffer lUniforms; void main( void )
- #define FRAGMENT_MAIN_COLOUR01_DEPTH_SRT FRAGMENT_COLOUR01_VEC4_DEFINE uniform UniformBuffer lUniforms; void main( void )
- #elif defined( D_PLATFORM_PC_COMPUTE )
- #define COMPUTE_MAIN_SRT( X, Y, Z ) layout (local_size_x = X, local_size_y = Y, local_size_z = Z) in; void main( void )
- #define FRAGMENT_MAIN_COLOUR_SRT COMPUTE_MAIN_SRT( 8,8,1 )
- #define FRAGMENT_MAIN_COLOUR01_SRT COMPUTE_MAIN_SRT( 8,8,1 )
- #define FRAGMENT_MAIN_COLOUR_DEPTH_SRT COMPUTE_MAIN_SRT( 8,8,1 )
- #elif defined( D_PLATFORM_ORBIS_COMPUTE )
- #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)
- #define FRAGMENT_MAIN_COLOUR_SRT COMPUTE_MAIN_SRT( 8,8,1 )
- #define FRAGMENT_MAIN_COLOUR01_SRT COMPUTE_MAIN_SRT( 8,8,1 )
- #define FRAGMENT_MAIN_COLOUR_DEPTH_SRT COMPUTE_MAIN_SRT( 8,8,1 )
- #elif defined( D_PLATFORM_ORBIS )
- #define VERTEX_MAIN void main( cInput In, out cOutput Out )
- #define VERTEX_MAIN_SRT void main( cInput In, out cOutput Out, UniformBuffer lUniforms : S_SRT_DATA )
- #define HULL_TRI_MAIN_SRT [DOMAIN_PATCH_TYPE("tri")] \
- [PARTITIONING_TYPE("integer")] \
- [OUTPUT_TOPOLOGY_TYPE("triangle_cw")] \
- [OUTPUT_CONTROL_POINTS(3)] \
- [PATCH_CONSTANT_FUNC("ConstantsHS")] \
- [MAX_TESS_FACTOR(16.0)] \
- void main( \
- InputPatch<cInput, 3> In, \
- uint uCPID : S_OUTPUT_CONTROL_POINT_ID, \
- UniformBuffer lUniforms : S_SRT_DATA, \
- out cOutput Out )
- #define HULL_QUAD_MAIN_SRT [DOMAIN_PATCH_TYPE("quad")] \
- [PARTITIONING_TYPE("integer")] \
- [OUTPUT_TOPOLOGY_TYPE("triangle_cw")] \
- [OUTPUT_CONTROL_POINTS(4)] \
- [PATCH_CONSTANT_FUNC("ConstantsHS")] \
- [MAX_TESS_FACTOR(16.0)] \
- void main( \
- InputPatch<cInput, 4> In, \
- uint uCPID : S_OUTPUT_CONTROL_POINT_ID, \
- UniformBuffer lUniforms : S_SRT_DATA, \
- out cOutput Out )
- #define DOMAIN_TRI_MAIN_SRT [DOMAIN_PATCH_TYPE("tri")] \
- void main( \
- HSConstantOutputData patchIn, \
- const OutputPatch<cInput, 3> In, \
- out cOutput Out, \
- UniformBuffer lUniforms : S_SRT_DATA, \
- float3 domainCoordinates : S_DOMAIN_LOCATION )
- #define DOMAIN_QUAD_MAIN_SRT [DOMAIN_PATCH_TYPE("quad")] \
- void main( \
- HSConstantOutputData patchIn, \
- const OutputPatch<cInput, 4> In, \
- out cOutput Out, \
- UniformBuffer lUniforms : S_SRT_DATA, \
- float2 domainCoordinates : S_DOMAIN_LOCATION )
- #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 )
- #define FRAGMENT_MAIN_COLOUR struct cOutput { vec4 mColour : S_TARGET_OUTPUT; }; [RE_Z] void main( cInput In, out cOutput Out )
- #define VOID_MAIN_COLOUR struct cOutput { vec4 mColour : S_TARGET_OUTPUT; }; void main( cInput In, out cOutput Out )
- #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 )
- #define VOID_MAIN_SRT void main( cInput In, UniformBuffer lUniforms : S_SRT_DATA )
- #if defined( D_TAA_RENDER_TARGETS )
- #define FRAGMENT_MAIN_COLOUR_SRT struct cOutput { vec4 mColour0 : S_TARGET_OUTPUT0; \
- vec4 mColour1 : S_TARGET_OUTPUT1; \
- vec4 mColour2 : S_TARGET_OUTPUT2; }; \
- [RE_Z] void main( cInput In, out cOutput Out, UniformBuffer lUniforms : S_SRT_DATA )
- #elif !defined( D_ATTRIBUTES )
- #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 )
- #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 )
- #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 )
- #define FRAGMENT_MAIN_COLOUR_SRT struct cOutput { vec4 mColour : S_TARGET_OUTPUT; }; void main( cInput In, out cOutput Out, UniformBuffer lUniforms : S_SRT_DATA )
- #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 )
- #define VOID_MAIN_COLOUR_EARLYZ_SRT [FORCE_EARLY_DEPTH_STENCIL] void main( cInput In, UniformBuffer lUniforms : S_SRT_DATA )
- #define FRAGMENT_MAIN_COLOUR01_SRT struct cOutput { vec4 mColour0 : S_TARGET_OUTPUT0; \
- vec4 mColour1 : S_TARGET_OUTPUT1; }; \
- [RE_Z] void main( cInput In, out cOutput Out, UniformBuffer lUniforms : S_SRT_DATA )
- #define FRAGMENT_MAIN_COLOUR01_DEPTH_SRT struct cOutput { vec4 mColour0 : S_TARGET_OUTPUT0; \
- vec4 mColour1 : S_TARGET_OUTPUT1; \
- float mDepth : S_DEPTH_OUTPUT; }; \
- [RE_Z] void main( cInput In, out cOutput Out, UniformBuffer lUniforms : S_SRT_DATA )
- #else
- // #pragma PSSL_target_output_format(target 1 FMT_32_AR)
- #define FRAGMENT_MAIN_COLOUR_DEPTH_SRT struct cOutput { vec4 mColour0 : S_TARGET_OUTPUT0; \
- vec4 mColour1 : S_TARGET_OUTPUT1; \
- vec4 mColour2 : S_TARGET_OUTPUT2; \
- vec4 mColour3 : S_TARGET_OUTPUT3; \
- float mDepth : S_DEPTH_OUTPUT; }; \
- [RE_Z] void main( cInput In, out cOutput Out, UniformBuffer lUniforms : S_SRT_DATA )
- #define FRAGMENT_MAIN_COLOUR_SRT struct cOutput { vec4 mColour0 : S_TARGET_OUTPUT0; \
- vec4 mColour1 : S_TARGET_OUTPUT1; \
- vec4 mColour2 : S_TARGET_OUTPUT2; \
- vec4 mColour3 : S_TARGET_OUTPUT3; }; \
- [RE_Z] void main( cInput In, out cOutput Out, UniformBuffer lUniforms : S_SRT_DATA )
- #define FRAGMENT_MAIN_COLOUR_EARLYZ_SRT struct cOutput { vec4 mColour0 : S_TARGET_OUTPUT0; \
- vec4 mColour1 : S_TARGET_OUTPUT1; \
- vec4 mColour2 : S_TARGET_OUTPUT2; \
- vec4 mColour3 : S_TARGET_OUTPUT3; }; \
- [FORCE_EARLY_DEPTH_STENCIL] void main( cInput In, out cOutput Out, UniformBuffer lUniforms : S_SRT_DATA )
- #endif
- #endif
- // =================================================================================================
- // Texture resolution
- // =================================================================================================
- #ifdef D_PLATFORM_ORBIS
- uvec2 GetResolution( Texture2D lTexture )
- {
- uvec2 lResolution;
- lTexture.GetDimensionsFast(lResolution.x, lResolution.y);
- return lResolution;
- }
- uvec2 GetResolution( RW_Texture2D<float4> lTexture )
- {
- uvec2 lResolution;
- lTexture.GetDimensionsFast(lResolution.x, lResolution.y);
- return lResolution;
- }
- #else
- uvec2 GetResolution( sampler2D lTexture )
- {
- return textureSize( lTexture, 0 );
- }
- #endif
- // =================================================================================================
- // Viewport
- // =================================================================================================
- #ifdef D_PLATFORM_PC
- #define SCREENSPACE_AS_RENDERTARGET_UVS( A ) A.xy
- #elif defined(D_PLATFORM_ORBIS)
- #define SCREENSPACE_AS_RENDERTARGET_UVS( A ) ( float2( A.x, 1.0 - A.y ) )
- #endif
- #ifdef D_USING_LOGDEPTH
- #define D_DEPTH_CLEARVALUE (1.0)
- #else
- #define D_DEPTH_CLEARVALUE (0.0)
- #endif
- // =================================================================================================
- // Texture usage feedback
- // =================================================================================================
- #if defined( D_TEXTURE_FEEDBACK ) && defined( D_PLATFORM_PC )
- layout(r32i) uniform iimage2D gTexFeedbackImg;
- void WriteTexFeedback( in int liCounter, in float liMip )
- {
- if( liCounter != 0 )
- {
- #if defined( GL_ARB_shader_ballot ) && ( GL_ARB_shader_ballot == 1 )
- if( readFirstInvocationARB( gl_SubGroupInvocationARB ) == gl_SubGroupInvocationARB )
- #endif
- {
- int liIntMip = int(floor(liMip));
- //imageStore( gTexFeedbackImg, ivec2( liCounter, liIntMip ), ivec4(1,0,0,0) );
- imageAtomicAdd( gTexFeedbackImg, ivec2( liCounter, liIntMip ), int(1) );
- }
- }
- }
- vec4 Tex2dFeedback( in sampler2D lSamp, in int liCounter, in vec2 lCoords )
- {
- float liLod = textureQueryLOD( lSamp, lCoords ).x;
- WriteTexFeedback( liCounter, liLod );
- return texture( lSamp, lCoords );
- }
- vec4 Tex2dLodFeedback( in sampler2D lSamp, in int liCounter, in vec2 lCoords, in float liLod )
- {
- WriteTexFeedback( liCounter, liLod );
- return textureLod( lSamp, lCoords, liLod );
- }
- vec4 Tex2dArrayFeedback( in sampler2DArray lSamp, in int liCounter, in vec3 lCoords )
- {
- float liLod = textureQueryLOD( lSamp, lCoords.xy ).x;
- WriteTexFeedback( liCounter, liLod );
- return texture( lSamp, lCoords );
- }
- vec4 Tex3dFeedback( in sampler3D lSamp, in int liCounter, in vec3 lCoords )
- {
- float liLod = textureQueryLOD( lSamp, lCoords ).x;
- WriteTexFeedback( liCounter, liLod );
- return texture( lSamp, lCoords );
- }
- vec4 Tex3dLodFeedback( in sampler3D lSamp, in int liCounter, in vec3 lCoords, in float liLod )
- {
- WriteTexFeedback( liCounter, liLod );
- return textureLod( lSamp, lCoords, liLod );
- }
- #endif
- #endif
- struct PerFrameUniforms
- {
- vec4 gLightPositionVec4; // EShaderConst_LightPositionVec4
- vec4 gLightDirectionVec4; // EShaderConst_LightDirectionVec4
- vec3 gViewPositionVec3; // EShaderConst_ViewPositionVec3
- float gfTime; // EShaderConst_Time
- float gfPrevTime; // EShaderConst_PrevTime
- vec4 gClipPlanesVec4; // EShaderConst_ClipPlanesVec4
- vec4 gClipPlanesRVec4; // EShaderConst_ClipPlanesRVec4
- mat4 gCameraMat4; // EShaderConst_CameraMat4
- mat4 gCameraDeltaMat4; // EShaderConst_CameraDeltaMat4
- mat4 gPrevViewProjectionMat4; // EShaderConst_PrevViewProjectionMat4
- vec4 gMBlurSettingsVec4; // EShaderConst_BlurSettingsVec4
- vec4 gDeJitterVec4; // EShaderConst_DeJitterVec4
- vec4 gTaaSettingsVec4; // EShaderConst_TaaSettingsVec4
- vec4 gFrameBufferSizeVec4;
- vec4 gFoVValuesVec4; // EShaderConst_FoVValuesVec4
- vec4 gShadowSizeVec4;
- vec4 gShadowFadeParamVec4;
- vec4 gShadowProjScaleVec4[3]; // EShaderConst_ShadowProjScaleVec4
- mat4 gViewMat4; // EShaderConst_ViewMat4
- };
- struct CommonPerMeshUniforms
- {
- // These are planet specific. Should they be here?
- vec4 gPlanetPositionVec4;
- vec4 gLightOriginVec4;
- mat4 gWorldMat4; // EShaderConst_WorldMat4
- mat4 gWorldMotionMat4; // EShaderConst_WorldMotionMat4
- mat4 gWorldViewProjectionMat4; // EShaderConst_WorldViewProjectionMat4
- mat4 gWorldNormalMat4; // EShaderConst_WorldNormalMat4
- #if defined( D_FADE ) && !defined( D_INSTANCE )
- float gfFadeValue; // EShaderConst_FadeTime
- #else
- float fdFadeValueDummy;
- #endif
- #if defined( D_SKINNING_UNIFORMS ) && defined( D_PLATFORM_ORBIS )
- vec4 gaSkinMatrixRowsVec4[ 75 * 3 ];
- vec4 gaPrevSkinMatrixRowsVec4[ 75 * 3 ];
- #endif
- //float gfShadowBias; // EShaderConst_ShadowBias
- // have particle shader use a particlecommon instead of uber, and put these into it.
- #if defined( D_PARTICLE_UNIFORMS ) && defined( D_PLATFORM_ORBIS )
- vec4 gaParticleCornersVec4[ 4 ]; // EShaderConst_ParticleCornersVec4
- vec4 gaParticlePositionsVec4[ 32 ]; // EShaderConst_ParticlePositionsVec4
- vec4 gaParticleSizeAndRotationsVec4[ 32 ]; // EShaderConst_ParticleSizeAndRotationsVec4
- vec4 gaParticleNormalsVec4[ 32 ]; // EShaderConst_ParticleNormalsVec4
- vec4 gaParticleColoursVec4[ 32 ]; // EShaderConst_ParticleColoursVec4
- #endif
- // This stuff is here atm because of shadows. The shadow shader is one thing, but renders twice, with these needing to be set differently.
- // ideally we don't want them set per mesh though, probably a SRT for 'percamera' or something
- //
- //
- mat4 gProjectionMat4; // EShaderConst_ProjectionMat4
- mat4 gViewProjectionMat4; // EShaderConst_ViewProjectionMat4
- #if !defined( D_DEPTHONLY )
- mat4 gInverseWorldUpMat4;
- // Stop these being compiled in when recolouring as the recolour shader needs ALL tex units.
- #if defined( D_DEFERRED_DECAL )
- mat4 gInverseModelMat4; // EShaderConst_InverseModelMat4 = 0
- #else
- mat4 gInverseProjectionSCMat4; // EShaderConst_InverseProjectionSCMat4
- #endif
- mat4 gInverseViewMat4; // EShaderConst_InverseViewMat4
- mat4 gInverseProjectionMat4; // EShaderConst_InverseProjectionMat4
- //mat4 gInverseViewProjectionMat4; // EShaderConst_InverseViewProjectionMat4
- mat4 gaShadowMat4[ 3 ]; // EShaderConst_ShadowMat4
- vec4 gLightColourVec4; // EShaderConst_LightColourVec4
- #ifdef D_IBL
- vec4 gGenericParam0Vec4; // EShaderConst_GenericParam0Vec4
- #else
- vec4 gGenericParam0DummyVec4;
- #endif
- // These shouldn't be per mesh, the should be per rendertarget. BUT we need to add them to the enum
- // in egShader and SetPErRenderTargetUniforms for that to work and we're trying to do a build for sony
- // so that will have to wait. (also probably need a way of setting per RT uniforms from Game).
- vec4 gScanParamsPosVec4;
- vec4 gScanParamsCfg1Vec4;
- vec4 gScanParamsCfg2Vec4;
- vec4 gScanParamsCfg3Vec4;
- vec4 gScanColourVec4;
- vec4 gSpotlightPositionVec4;
- vec4 gSpotlightDirectionVec4;
- #endif
- vec4 gUserDataVec4;
- };
- #if defined( D_PARTICLE_UNIFORMS ) && defined( D_PLATFORM_PC )
- uniform vec4 gaParticleCornersVec4[4]; // EShaderConst_ParticleCornersVec4
- uniform vec4 gaParticlePositionsVec4[32]; // EShaderConst_ParticlePositionsVec4
- uniform vec4 gaParticleSizeAndRotationsVec4[32]; // EShaderConst_ParticleSizeAndRotationsVec4
- uniform vec4 gaParticleNormalsVec4[32]; // EShaderConst_ParticleNormalsVec4
- uniform vec4 gaParticleColoursVec4[32]; // EShaderConst_ParticleColoursVec4
- #endif
- #endif
- ////////////////////////////////////////////////////////////////////////////////
- ///
- /// @file Common.h
- /// @author User
- /// @date
- ///
- /// @brief Common
- ///
- /// Copyright (c) 2008 Hello Games Ltd. All Rights Reserved.
- ///
- ////////////////////////////////////////////////////////////////////////////////
- #ifndef D_COMMON_H
- #define D_COMMON_H
- #define D_TERRAINCOLOURARRAY_SIZE 23
- STATIC_CONST vec3 kGammaOutVec3 = vec3( 1.0 / 2.2 );
- STATIC_CONST vec3 kGammaInVec3 = vec3( 2.2 );
- STATIC_CONST vec4 RGBToHSV_K = vec4( 0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0 );
- STATIC_CONST vec4 HSVToRGB_K = vec4( 1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0 );
- #ifdef D_PLATFORM_ORBIS
- STATIC_CONST float3x3 BT709_TO_BT2020 = float3x3( //ref: ARIB STD-B62 and BT.2087
- #else
- STATIC_CONST mat3 BT709_TO_BT2020 = mat3( //ref: ARIB STD-B62 and BT.2087
- #endif
- 0.6274, 0.3293, 0.0433,
- 0.0691, 0.9195, 0.0114,
- 0.0164, 0.0880, 0.8956
- );
- #ifdef D_PLATFORM_ORBIS
- STATIC_CONST float3x3 BT2020_TO_BT709 = float3x3(
- #else
- STATIC_CONST mat3 BT2020_TO_BT709 = mat3(
- #endif
- 1.6605, -0.5877, -0.0728,
- -0.1246, 1.1330, -0.0084,
- -0.0182, -0.1006, 1.1187
- );
- //-----------------------------------------------------------------------------
- ///
- /// GammaCorrect
- ///
- //-----------------------------------------------------------------------------
- vec3
- GammaCorrectInput(
- in vec3 lColourVec3 )
- {
- vec3 lCorrectColourVec3;
- lCorrectColourVec3 = lColourVec3 * ( lColourVec3 * ( lColourVec3 * vec3( 0.305306011 ) + vec3( 0.682171111 ) ) + vec3( 0.012522878 ) );
- return lCorrectColourVec3;
- }
- //-----------------------------------------------------------------------------
- ///
- /// GammaCorrect
- ///
- //-----------------------------------------------------------------------------
- vec3
- GammaCorrectOutput(
- in vec3 lColourVec3 )
- {
- vec3 lCorrectColourVec3;
- lCorrectColourVec3 = pow( lColourVec3, kGammaOutVec3 );
- return lCorrectColourVec3;
- }
- //-----------------------------------------------------------------------------
- ///
- /// RGBToHSV
- ///
- //-----------------------------------------------------------------------------
- vec3
- RGBToHSV(
- vec3 lRGB )
- {
- //vec4 p = mix( vec4(lRGB.bg, RGBToHSV_K.wz), vec4(lRGB.gb, RGBToHSV_K.xy), step(lRGB.b, lRGB.g) );
- //vec4 q = mix( vec4(p.xyw, lRGB.r), vec4(lRGB.r, p.yzx), step(p.x, lRGB.r) );
- // This variant is faster, since it generates conditional moves
- vec4 p = lRGB.g < lRGB.b ? vec4(lRGB.bg, RGBToHSV_K.wz) : vec4(lRGB.gb, RGBToHSV_K.xy);
- vec4 q = lRGB.r < p.x ? vec4(p.xyw, lRGB.r) : vec4(lRGB.r, p.yzx);
- float d = q.x - min(q.w, q.y);
- float e = 1.0e-10;
- return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);
- }
- //-----------------------------------------------------------------------------
- ///
- /// HSVToRGB
- ///
- /// @brief http://lolengine.net/blog/2013/07/27/rgb-to-hsv-in-glsl
- ///
- //-----------------------------------------------------------------------------
- vec3
- HSVToRGB(
- vec3 lHSV )
- {
- vec3 p = abs(fract(lHSV.xxx + HSVToRGB_K.xyz) * 6.0 - HSVToRGB_K.www);
- return lHSV.z * mix(HSVToRGB_K.xxx, saturate(p - HSVToRGB_K.xxx), lHSV.y);
- }
- //-----------------------------------------------------------------------------
- ///
- /// HDR ( Perceptual Quantizer(PQ), Rec. 2020 color space. ) helpers
- ///
- //------------------------------------------------------------------------------
- #ifdef D_PLATFORM_PC
- float CndMask(bool cnd, float src0, float src1)
- {
- return cnd ? src0 : src1;
- }
- #endif
- STATIC_CONST float kRefWhiteLevel = 100.0;
- vec4 SRGB_OETF(vec4 L)
- {
- vec3 dark = L.xyz * 12.92;
- vec3 light = 1.055 * pow(L.xyz, vec3(1.0 / 2.4)) - 0.055;
- vec4 r;
- r.x = CndMask(L.x <= 0.0031308, dark.x, light.x);
- r.y = CndMask(L.y <= 0.0031308, dark.y, light.y);
- r.z = CndMask(L.z <= 0.0031308, dark.z, light.z);
- r.w = L.w;
- return r;
- }
- vec4 SRGB_EOTF(vec4 E)
- {
- vec3 dark = E.xyz / 12.92;
- vec3 light = pow((E.xyz + 0.055) / (1 + 0.055), vec3(2.4));
- vec4 r;
- r.x = CndMask(E.x <= 0.04045, dark.x, light.x);
- r.y = CndMask(E.y <= 0.04045, dark.y, light.y);
- r.z = CndMask(E.z <= 0.04045, dark.z, light.z);
- r.w = E.w;
- return r;
- }
- //apply gamma adjustment to (minL, maxL).
- vec4 GammaAdjOOTF(vec4 L, float minLNits, float maxLNits, float gamma, bool inverse)
- {
- vec3 nits = L.xyz * kRefWhiteLevel;
- vec4 i = vec4((nits - minLNits) / (maxLNits - minLNits), 1.0);
- vec3 j;
- if (inverse){
- j = SRGB_EOTF(pow(i, vec4(1 / gamma))).xyz;
- }
- else{
- j = pow(SRGB_OETF(i).xyz,vec3(gamma));
- }
- vec3 adj = (minLNits + (maxLNits - minLNits) * j) / kRefWhiteLevel;
- vec4 ret;
- ret.x = CndMask(nits.x >= minLNits && nits.x < maxLNits, adj.x, L.x);
- ret.y = CndMask(nits.y >= minLNits && nits.y < maxLNits, adj.y, L.y);
- ret.z = CndMask(nits.z >= minLNits && nits.z < maxLNits, adj.z, L.z);
- ret.w = L.w;
- return ret;
- }
- //input: normalized L in units of RefWhite (1.0=100nits), output: normalized E
- vec4 PQ_OETF(vec4 L, uint gamma_adj, float gamma)
- {
- if (gamma_adj != 0)
- L = GammaAdjOOTF(L, 0.0, 300.0, gamma, false);
- const float c1 = 0.8359375;//3424.f/4096.f;
- const float c2 = 18.8515625;//2413.f/4096.f*32.f;
- const float c3 = 18.6875; //2392.f/4096.f*32.f;
- const float m1 = 0.159301758125; //2610.f / 4096.f / 4;
- const float m2 = 78.84375;// 2523.f / 4096.f * 128.f;
- L = L * kRefWhiteLevel / 10000.0;
- vec3 Lm1 = pow(L.xyz, vec3(m1));
- vec3 X = (c1 + c2 * Lm1) / (1 + c3 * Lm1);
- vec4 res = vec4(pow(X, vec3(m2)), L.w);
- return res;
- }
- //input: normalized E (0.0, 1.0), output: normalized L in units of RefWhite
- vec4 PQ_EOTF(vec4 E, uint gamma_adj, float gamma)
- {
- const float c1 = 0.8359375;//3424.f/4096.f;
- const float c2 = 18.8515625;//2413.f/4096.f*32.f;
- const float c3 = 18.6875; //2392.f/4096.f*32.f;
- const float m1 = 0.159301758125; //2610.f / 4096.f / 4;
- const float m2 = 78.84375;// 2523.f / 4096.f * 128.f;
- vec3 M = c2 - c3 * pow(E.xyz, vec3(1 / m2));
- vec3 N = max(pow(E.xyz, vec3(1 / m2)) - c1, 0);
- vec3 L = pow(N / M, vec3(1 / m1)); //normalized nits (1.0 = 10000nits)
- L = L * 10000.0 / kRefWhiteLevel; //convert to normalized L in units of RefWhite
- return (gamma_adj !=0) ? GammaAdjOOTF(vec4(L, E.w), 0.0, 300.0, gamma, true) : vec4(L, E.w);
- }
- // PQ OETF fast approximation
- // http://www.glowybits.com/blog/2017/01/04/ifl_iss_hdr_2/
- vec3 PQ_OETF_Fast(vec3 x)
- {
- x = (x * (x * (x * (x * (x * 533095.76 + 47438306.2) + 29063622.1) + 575216.76) + 383.09104) + 0.000487781) /
- (x * (x * (x * (x * 66391357.4 + 81884528.2) + 4182885.1) + 10668.404) + 1.0);
- return x;
- }
- //-----------------------------------------------------------------------------
- ///
- /// BrightnessVibranceContrast
- ///
- //-----------------------------------------------------------------------------
- vec3 BrightnessVibranceContrast(
- vec3 lInputColour,
- float lfBrightness,
- float lfVibrance,
- float lfContrast)
- {
- vec3 lBrtResult = lInputColour * lfBrightness;
- // get lum
- vec3 lLuma = vec3( dot(lBrtResult, vec3( 0.2125, 0.7154, 0.0721 )) );
- // get saturation
- float lfMaxCol = max( lBrtResult.r, max(lBrtResult.g, lBrtResult.b) );
- float lfMinCol = min( lBrtResult.r, min(lBrtResult.g, lBrtResult.b) );
- float lfCurSatV = lfMaxCol - lfMinCol;
- // lerp by 1 + (1 - vibrance) - current saturation
- float lfVibranceMix = (1.0 + (lfVibrance * (1.0 - (sign(lfVibrance) * lfCurSatV))));
- vec3 lVibResult = mix( lLuma, lBrtResult, lfVibranceMix );
- // lerp from mid gray for contrast
- vec3 lContrastBase = vec3( 0.5, 0.5, 0.5 );
- vec3 lConResult = mix( lContrastBase , lVibResult, lfContrast );
- return lConResult;
- }
- //-----------------------------------------------------------------------------
- ///
- /// Desaturate
- ///
- //-----------------------------------------------------------------------------
- vec3 Desaturate( vec3 color, float lfAmount )
- {
- vec3 gray = vec3( dot( vec3( 0.299, 0.587, 0.114 ), color) );
- return mix( color, gray, lfAmount );
- }
- // improved rgb lerp by @stormoid
- // https://www.shadertoy.com/view/lsdGzN
- //---------------Improved RGB--------------
- /*
- The idea behind this function is to avoid the low saturation area in the
- rgb color space. This is done by getting the direction to that diagonal
- and displacing the interpolated color by it's inverse while scaling it
- by saturation error and desired lightness.
- I find it behaves very well under most circumstances, the only instance
- where it doesn't behave ideally is when the hues are very close to 180
- degrees apart, since the method I am using to find the displacement vector
- does not compensate for non-curving motion. I tried a few things to
- circumvent this problem but none were cheap and effective enough..
- */
- //Changes the strength of the displacement
- #define DSP_STR 1.5
- //-----------------------------------------------------------------------------
- float _getsat( vec3 lColour )
- {
- float mi = min(min(lColour.x, lColour.y), lColour.z);
- float ma = max(max(lColour.x, lColour.y), lColour.z);
- return (ma - mi) / (ma + 1e-7);
- }
- vec3 NmzRgbLerp( vec3 a, vec3 b, float x )
- {
- // interpolated base color (with singularity fix)
- vec3 ic = mix( a, b, x ) + vec3( 1e-6, 0.0, 0.0 );
- // saturation difference from ideal scenario
- float sd = abs( _getsat( ic ) - mix( _getsat( a ), _getsat( b ), x ) );
- // displacement direction
- vec3 dir = normalize(
- vec3( 2.0 * ic.x - ic.y - ic.z,
- 2.0 * ic.y - ic.x - ic.z,
- 2.0 * ic.z - ic.y - ic.x )
- );
- // simple Lighntess
- float lgt = dot( vec3( 1.0 ), ic );
- // extra scaling factor for the displacement
- float ff = dot( dir, normalize( ic ) );
- // displace the color
- ic += DSP_STR * dir * sd * ff * lgt;
- return clamp( ic, 0.0, 1.0 );
- }
- //-----------------------------------------------------------------------------
- ///
- /// Inverse
- ///
- //-----------------------------------------------------------------------------
- mat4
- Inverse(
- const mat4 lInMat4 )
- {
- #ifdef D_PLATFORM_PC
- return inverse( lInMat4 );
- #else
- float det = determinant( lInMat4 );
- det = 1.0f / det;
- mat4 M = lInMat4;
- mat4 IM;
- 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] );
- 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] );
- 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] );
- 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] );
- 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] );
- 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] );
- 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] );
- 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] );
- 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] );
- 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] );
- 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] );
- 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] );
- 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] );
- 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] );
- 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] );
- 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] );
- return IM;
- #endif
- }
- float
- lengthSquared( vec3 lInVec3 )
- {
- return dot( lInVec3, lInVec3 );
- }
- #endif
- ////////////////////////////////////////////////////////////////////////////////
- ///
- /// @file PostCommon.h
- /// @author User
- /// @date
- ///
- /// @brief PostCommon
- ///
- /// Copyright (c) 2008 Hello Games Ltd. All Rights Reserved.
- ///
- ////////////////////////////////////////////////////////////////////////////////
- //-----------------------------------------------------------------------------
- // Compilation defines
- //-----------------------------------------------------------------------------
- // Include files
- // =================================================================================================
- #ifndef D_DEFINES
- #define D_DEFINES
- // =================================================================================================
- // Platform defines
- // =================================================================================================
- #ifdef D_PLATFORM_PC
- #define D_ENABLE_REVERSEZ_PROJECTION (1)
- #pragma optionNV(strict on)
- #extension GL_ARB_gpu_shader5 : enable
- #extension GL_ARB_fragment_coord_conventions : enable
- #extension GL_ARB_derivative_control : enable
- #if defined( D_FRAGMENT ) && defined( _F64_ )
- layout(early_fragment_tests) in;
- #endif
- #elif defined(D_PLATFORM_ORBIS)
- #define D_ENABLE_REVERSEZ_PROJECTION (1)
- // use this with sdk 2.0 compiler
- // #pragma argument (allow-scratch-buffer-spill)
- //define these flags so they don't get ignored in build process and in the comb mask
- //this is because materials, vertex layouts and shaders need to be synced on 360 to avoid patching
- #ifdef _F27_
- #endif
- #ifdef _F28_
- #endif
- #ifdef _F29_
- #endif
- #ifdef _F21_
- #endif
- #ifdef _F02_
- #endif
- #ifdef _F03_
- #endif
- #if defined( _F01_ ) || defined( D_LOD0 ) || defined( D_LOD1 ) || defined( D_LOD2 ) || defined( D_LOD3) || defined( D_LOD4 )
- #endif
- #ifdef _F01_
- #endif
- #ifdef _F09_
- #endif
- #ifdef _F10_
- #endif
- // disable warnings for unused parameters. This happens a lot because of defining different things.
- #pragma warning (disable: 5203)
- // temp thing to know what things are still required on ps4.
- #define D_PLATFORM_ORBIS_FIX
- #ifdef __PSSL_CS__
- #define D_PLATFORM_ORBIS_COMPUTE
- #endif
- #ifdef __PSSL_HS__
- #define D_HULL
- #endif
- #ifdef __PSSL_DS__
- #define D_DOMAIN
- #endif
- #ifdef __PSSL_VS__
- #define D_VERTEX
- #endif
- #ifdef __PSSL_GS__
- #define D_GEOMETRY
- #endif
- #endif
- #if !D_ENABLE_REVERSEZ_PROJECTION
- #define D_USING_LOGDEPTH
- #endif
- // =================================================================================================
- // Basic Types
- // =================================================================================================
- #ifdef D_PLATFORM_PC
- #define JOINT_TYPE vec4
- //#define CONST const
- #define STATIC_CONST const
- #elif defined(D_PLATFORM_ORBIS)
- #define JOINT_TYPE int4
- #define float float
- #define vec2 float2
- #define vec3 float3
- #define vec4 float4
- #define ivec2 int2
- #define ivec3 int3
- #define ivec4 int4
- #define uvec2 uint2
- #define uvec3 uint3
- #define uvec4 uint4
- // NOTE:
- // operator[] accesses rows, not columns
- // matrix constructors interpret the passed vectors as row vectors, not column vectors
- #define mat2 row_major float2x2
- #define mat3 row_major float3x3
- #define mat4 row_major float4x4
- //#define CONST
- #define STATIC_CONST static const
- // #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.
- #endif
- // =================================================================================================
- // Functions
- // =================================================================================================
- #ifdef D_PLATFORM_PC
- #define saturate( V ) min( max( V, 0.0) , 1.0)
- #define atan2( Y, X ) atan( Y, X )
- #define invsqrt( X ) inversesqrt( X )
- #ifdef D_COMPUTE
- #define groupID gl_WorkGroupID
- #define groupThreadID gl_LocalInvocationID
- #define dispatchThreadID gl_GlobalInvocationID
- #endif
- #elif defined(D_PLATFORM_ORBIS)
- #if defined(D_PLATFORM_ORBIS_COMPUTE)
- float dFdx( float var ) { float delta = var - LaneSwizzle( var, 0x1f, 0, 1 ); return __v_cndmask_b32(0, 1, 0xAAAAAAAAAAAAAAAA ) ? delta : -delta; }
- float dFdy( float var ) { float delta = var - LaneSwizzle( var, 0x1f, 0, 8 ); return __v_cndmask_b32(0, 1, 0xFF00FF00FF00FF00 ) ? delta : -delta; }
- 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; }
- 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; }
- 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; }
- 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; }
- 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; }
- 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; }
- #define dFdxFine dFdx
- #define dFdyFine dFdy
- #else
- #define dFdx ddx
- #define dFdy ddy
- #define dFdxFine ddx_fine
- #define dFdyFine ddy_fine
- #endif
- #define mix lerp
- #define fract frac
- #define mod fmod
- #define saturate( V ) ( min( max( V, 0.0) , 1.0) )
- #define invsqrt( X ) rsqrt( X )
- #endif
- // =================================================================================================
- // Samplers and textures
- // =================================================================================================
- #ifdef D_PLATFORM_PC
- #define shadow2D( S, UV ) texture( S, UV )
- #define SAMPLER2DSHADOW( NAME, REG ) uniform sampler2DShadow NAME
- #define SAMPLERCUBE( NAME ) samplerCube NAME
- #define SAMPLERCUBEARG( NAME ) in samplerCube NAME
- #define SAMPLERCUBEPARAM( NAME ) NAME
- #define imageAtomicAddOut( T, C, V, O ) O = imageAtomicAdd( T, C, V )
- #if defined( D_TEXTURE_FEEDBACK )
- #define texture2D( T, C ) Tex2dFeedback( T, T##FB, C )
- #define texture2DLod( T, C, N ) Tex2dLodFeedback( T, T##FB, C, N )
- #define texture2DArray( T, C ) Tex2dArrayFeedback( T, T##FB, C )
- #define texture3D( S, UV ) Tex3dFeedback( S, S##FB, UV )
- #define texture3DLod( S, UV, LOD ) Tex3dLodFeedback( S, S##FB, UV, LOD )
- #define SAMPLER2DARG( NAME ) in sampler2D NAME, in int NAME##FB
- #define SAMPLER2DPARAM( NAME ) NAME, NAME##FB
- #define SAMPLER2DARRAYARG( NAME ) in sampler2DArray NAME, in int NAME##FB
- #define SAMPLER2DARRAYPARAM( NAME ) NAME, NAME##FB
- #define SAMPLER2D( NAME ) sampler2D NAME; int NAME##FB
- #define SAMPLER2DARRAY( NAME ) sampler2DArray NAME; int NAME##FB
- #define SAMPLER3D( NAME ) sampler3D NAME; int NAME##FB
- #define SAMPLER2DSHADOW_SRT( NAME ) sampler2DShadow NAME; int NAME##FB
- #else
- #define texture2DLod( S, UV, LOD ) textureLod( S, UV, LOD )
- #define texture3DLod( S, UV, LOD ) textureLod( S, UV, LOD )
- #define SAMPLER2DARG( NAME ) in sampler2D NAME
- #define SAMPLER2DPARAM( NAME ) NAME
- #define SAMPLER2DARRAYARG( NAME ) in sampler2DArray NAME
- #define SAMPLER2DARRAYPARAM( NAME ) NAME
- #define SAMPLER2D( NAME ) sampler2D NAME
- #define SAMPLER2DARRAY( NAME ) sampler2DArray NAME
- #define SAMPLER3D( NAME ) sampler3D NAME
- #define SAMPLER2DSHADOW_SRT( NAME ) sampler2DShadow NAME
- #endif
- #define textureGatherRed( lTex, lSamp ) textureGather( lTex, lSamp, 0 )
- #define textureGatherGreen( lTex, lSamp ) textureGather( lTex, lSamp, 1 )
- #define textureGatherBlue( lTex, lSamp ) textureGather( lTex, lSamp, 2 )
- #define textureGatherAlpha( lTex, lSamp ) textureGather( lTex, lSamp, 3 )
- #define texture2DComputeGrad( T, C ) texture2D( T, C )
- #elif defined(D_PLATFORM_ORBIS)
- #define SAMPLERCUBE( NAME, REG ) SamplerState NAME##SS : register( s##REG ); TextureCube NAME##TU : register( t##REG )
- #define SAMPLER2D( NAME ) Texture2D NAME; SamplerState NAME##SS
- #define SAMPLER2DSHADOW_SRT( NAME ) Texture2D NAME; SamplerComparisonState NAME##SS //SAMPLER2D( NAME )
- #define SAMPLER3D( NAME ) Texture3D NAME; SamplerState NAME##SS
- #define SAMPLER2DARRAY( NAME ) Texture2D_Array NAME; SamplerState NAME##SS
- #define SAMPLER2DARRAYARG( NAME ) Texture2D_Array NAME, SamplerState NAME##SS
- #define SAMPLER2DARRAYPARAM( NAME ) NAME, NAME##SS
- #define SAMPLER2DPARAM( NAME ) NAME, NAME##SS
- #define SAMPLER2DARG( NAME ) Texture2D NAME, SamplerState NAME##SS
- #define texture2D( T, C ) T.Sample( T##SS, C )
- #if defined(D_PLATFORM_ORBIS_COMPUTE)
- #define texture2DComputeGrad( T, C ) T.SampleGradient( T##SS, C, vec2( dFdx( C ) ), vec2( dFdy( C ) ) )
- #define shadow2D( T, C ) T.SampleCmpLOD0( T##SS, C.xy, C.z )
- #else
- #define texture2DComputeGrad( T, C ) T.Sample( T##SS, C )
- #define shadow2D( T, C ) T.SampleCmp( T##SS, C.xy, C.z )
- #endif
- #define texture2DLod( T, C, N ) T.SampleLOD( T##SS, C, N )
- #define texture2DArray( T, C ) T.Sample( T##SS, C )
- #define texture3DLod( T, C, N ) T.SampleLOD( T##SS, C, N )
- //#define shadow2D( T, C ) vec3( C.z > T.Sample( T##SS, C.xy ).x ? 1.0 : 0.0 )
- //#define shadow2D( T, C ) T.GatherCmp( T##SS, C.xy, C.z )
- //#define shadow2D( T, C ) T.SampleCmpLOD0( T##SS, C.xy, C.z )
- #define textureCube( T, C ) T##TU.Sample( T##SS, C )
- #define textureCubeLod( T, C, N ) T##TU.Sample( T##SS, C, N )
- #define textureGrad( T, C, DDX, DDY ) T.SampleGradient( T##SS, C, DDX, DDY )
- #define imageAtomicAdd( T, C, V ) AtomicAdd( T[ C ], V )
- #define imageAtomicAddOut( T, C, V, O ) AtomicAdd( T[ C ], V, O )
- #define imageStore( T, C, V ) ( T[C] = V )
- #define textureGatherRed( lTex, lSamp ) lTex.GatherRed ( lTex##SS, lSamp )
- #define textureGatherGreen( lTex, lSamp ) lTex.GatherGreen( lTex##SS, lSamp )
- #define textureGatherBlue( lTex, lSamp ) lTex.GatherBlue ( lTex##SS, lSamp )
- #define textureGatherAlpha( lTex, lSamp ) lTex.GatherAlpha( lTex##SS, lSamp )
- #define texelFetch( lTex, lSamp, lLod ) lTex.MipMaps((lLod), (lSamp))
- #endif
- #if defined(D_PLATFORM_ORBIS_COMPUTE)
- #define THREADGROUP_LOCAL thread_group_memory
- #define THREADGROUP_BARRIER ThreadGroupMemoryBarrier()
- #elif defined(D_PLATFORM_PC_COMPUTE)
- #define THREADGROUP_LOCAL layout( shared )
- #define THREADGROUP_BARRIER groupMemoryBarrier()
- #endif
- // =================================================================================================
- // Matrices
- // =================================================================================================
- #ifdef D_PLATFORM_PC
- #define MUL( INPUT_A, INPUT_B ) (INPUT_A * INPUT_B)
- #define PLATFORM_TRANSPOSE
- #define MAT4_SET_POS( M, P ) M[ 3 ] = P
- #define MAT4_SET_TRANSLATION( M, T ) M[ 3 ].xyz = T
- #define MAT4_GET_COLUMN( M, C ) M[ C ].xyz
- #define MAT3_GET_COLUMN( M, C ) M[ C ]
- #define MAT4_GET_COLUMN_VEC4( M, C ) M[ C ]
- #define MAT3_SET_COLUMN( M, C, V ) M[ C ] = V;
- #define MAT4_SET_COLUMN( M, C, V ) M[ C ] = V;
- #elif defined(D_PLATFORM_ORBIS)
- #define MUL( INPUT_A, INPUT_B ) mul( INPUT_B, INPUT_A )
- #define PLATFORM_TRANSPOSE
- #define MAT4_SET_POS( M, P ) M[ 3 ] = P
- #define MAT4_SET_TRANSLATION( M, T ) M[ 3 ].xyz = T
- #define MAT4_GET_COLUMN( M, C ) M[ C ].xyz
- #define MAT3_GET_COLUMN( M, C ) M[ C ]
- #define MAT4_GET_COLUMN_VEC4( M, C ) M[ C ]
- #define MAT3_SET_COLUMN( M, C, V ) M[ C ] = V;
- #define MAT4_SET_COLUMN( M, C, V ) M[ C ] = V;
- #endif
- // =================================================================================================
- // Arrays (workaround AMD shader compiler issues by making arrays have global scope)
- // =================================================================================================
- #if defined(D_PLATFORM_ORBIS)
- #define ARRAY_LOOKUP_FS( _UNIFORMS, _ELEMENT, _INDEX) _UNIFORMS._ELEMENT[_INDEX]
- #define ARRAY_LOOKUP_FP( _UNIFORMS, _ELEMENT, _INDEX) _UNIFORMS._ELEMENT[_INDEX]
- #else
- #define ARRAY_LOOKUP_FS( _UNIFORMS, _ELEMENT, _INDEX) _ELEMENT[_INDEX]
- #define ARRAY_LOOKUP_FP( _UNIFORMS, _ELEMENT, _INDEX) _ELEMENT[_INDEX]
- #endif
- // =================================================================================================
- // Input and Output
- // =================================================================================================
- #ifdef D_PLATFORM_PC
- #define UNIFORM( TYPE, NAME ) uniform TYPE NAME
- #define UNIFORM_SRT( TYPE, NAME ) uniform TYPE NAME
- #define DECLARE_INPUT
- #define DECLARE_OUTPUT
- #define DECLARE_END
- #define DECLARE_PTR( TYPE, NAME ) TYPE NAME;
- #define DECLARE_PATCH_INPUT_TRI
- #define DECLARE_PATCH_OUTPUT_TRI
- #define IN_PATCH_TRI_TESS_CONSTANTS
- #define OUT_PATCH_TRI_TESS_CONSTANTS
- #define DECLARE_PATCH_INPUT_QUAD
- #define DECLARE_PATCH_OUTPUT_QUAD
- #define IN_PATCH_QUAD_TESS_CONSTANTS
- #define OUT_PATCH_QUAD_TESS_CONSTANTS
- #if defined( D_HULL )
- #define INPUT( TYPE, NAME, REG ) in TYPE NAME [];
- #define INPUT_NOINTERP( TYPE, NAME, REG ) flat in TYPE NAME [];
- #define INPUT_NOPERSP( TYPE, NAME, REG ) in TYPE NAME [];
- #define PATCH_OUTPUT( TYPE, NAME, REG ) patch out TYPE NAME;
- #define OUTPUT( TYPE, NAME, REG ) out TYPE NAME [];
- #define OUTPUT_NOINTERP( TYPE, NAME, REG ) flat out TYPE NAME [];
- #define OUTPUT_NOPERSP( TYPE, NAME, REG ) out TYPE NAME [];
- #elif defined( D_DOMAIN )
- #define PATCH_INPUT( TYPE, NAME, REG ) patch in TYPE NAME;
- #define INPUT( TYPE, NAME, REG ) in TYPE NAME [];
- #define INPUT_NOINTERP( TYPE, NAME, REG ) flat in TYPE NAME [];
- #define INPUT_NOPERSP( TYPE, NAME, REG ) in TYPE NAME [];
- #define OUTPUT( TYPE, NAME, REG ) out TYPE NAME;
- #define OUTPUT_NOINTERP( TYPE, NAME, REG ) flat out TYPE NAME;
- #define OUTPUT_NOPERSP( TYPE, NAME, REG ) out TYPE NAME;
- #else
- #define INPUT( TYPE, NAME, REG ) in TYPE NAME;
- #define INPUT_NOINTERP( TYPE, NAME, REG ) flat in TYPE NAME;
- #define INPUT_NOPERSP( TYPE, NAME, REG ) in TYPE NAME;
- #define OUTPUT( TYPE, NAME, REG ) out TYPE NAME;
- #define OUTPUT_NOINTERP( TYPE, NAME, REG ) flat out TYPE NAME;
- #define OUTPUT_NOPERSP( TYPE, NAME, REG ) out TYPE NAME;
- #endif
- #define FRAGMENT_COLOUR_UVEC4_DEFINE layout(location = 0) out uvec4 outu_color0;
- #define FRAGMENT_COLOUR_UVEC4 outu_color0
- #define FRAGMENT_COLOUR out_color0
- #define FRAGMENT_COLOUR0 out_color0
- #define FRAGMENT_COLOUR1 out_color1
- #define FRAGMENT_COLOUR2 out_color2
- #define FRAGMENT_COLOUR3 out_color3
- #define FRAGMENT_COLOUR4 out_color4
- #if defined( D_TAA_RENDER_TARGETS )
- #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;
- #elif !defined(D_ATTRIBUTES)
- #define FRAGMENT_COLOUR_VEC4_DEFINE layout(location = 0) out vec4 out_color0;
- #else
- #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;
- #endif
- #define FRAGMENT_COLOUR01_VEC4_DEFINE layout(location = 0) out vec4 out_color0; layout(location = 1) out vec4 out_color1;
- #define FRAGMENT_DEPTH gl_FragDepth
- #define FRAGMENT_FRONTFACE gl_FrontFacing
- #define INPUT_FRONTFACING
- #define DEREF_PTR( VAR ) VAR
- #if defined( D_HULL )
- #define IN( VAR ) VAR[ gl_InvocationID ]
- #define OUT( VAR ) VAR[ gl_InvocationID ]
- #define PATCH_OUT( VAR ) VAR
- #define OUTPUT_VERTEX_SCREEN_POSITION gl_out[ gl_InvocationID ].gl_Position
- #define INPUT_VERTEX_SCREEN_POSITION gl_in [ gl_InvocationID ].gl_Position
- #define TESS_LEVEL_EDGE( IND ) gl_TessLevelOuter[ IND ]
- #define TESS_LEVEL_INNER( IND ) gl_TessLevelInner[ IND ]
- #elif defined( D_DOMAIN )
- #define PATCH_IN( VAR, IND ) VAR[ IND ]
- #define IN( VAR, IND ) VAR[ IND ]
- #define OUT( VAR ) VAR
- #define INPUT_VERTEX_SCREEN_POSITION( IND ) gl_in [ IND ].gl_Position
- #define DOMAIN_COORDS gl_TessCoord
- #elif defined( D_GEOMETRY )
- #define OUTPUT_VERTEX_SCREEN_POSITION gl_Position
- #define INPUT_VERTEX_SCREEN_POSITION( IND ) gl_in [ IND ].gl_Position
- #define IN( VAR, IND ) VAR[ IND ]
- #define OUT( VAR ) VAR
- #else
- #define IN( VAR ) VAR
- #define OUT( VAR ) VAR
- #endif
- #define OUT_VERTEX_SCREEN_POSITION
- #define IN_SCREEN_POSITION
- #define VERTEX_SCREEN_POSITION gl_Position
- #elif defined(D_PLATFORM_ORBIS_COMPUTE)
- #define DECLARE_INPUT struct cInput {
- #define DECLARE_END };
- #define DECLARE_PTR( TYPE, NAME ) TYPE* NAME;
- #define INPUT( TYPE, NAME, REG ) TYPE NAME : REG;
- #define INPUT_NOINTERP( TYPE, NAME, REG ) TYPE NAME : REG;
- #define IN_SCREEN_POSITION
- #define FRAGMENT_COLOUR lUniforms.mpCmpOutPerMesh.gOutTexture0[dispatchThreadID.xy]
- #define FRAGMENT_COLOUR0 lUniforms.mpCmpOutPerMesh.gOutTexture0[dispatchThreadID.xy]
- #define FRAGMENT_COLOUR1 lUniforms.mpCmpOutPerMesh.gOutTexture1[dispatchThreadID.xy]
- #define FRAGMENT_COLOUR2 lUniforms.mpCmpOutPerMesh.gOutTexture2[dispatchThreadID.xy]
- #define FRAGMENT_COLOUR3 lUniforms.mpCmpOutPerMesh.gOutTexture3[dispatchThreadID.xy]
- #define FRAGMENT_COLOUR4 lUniforms.mpCmpOutPerMesh.gOutTexture4[dispatchThreadID.xy]
- #define FRAGMENT_DEPTH lUniforms.mpCmpOutPerMesh.gOutTextureDepth[dispatchThreadID.xy]
- #define DEREF_PTR( VAR ) *VAR
- #elif defined(D_PLATFORM_ORBIS)
- #define UNIFORM( TYPE, NAME ) ConstantBuffer NAME##CB{ TYPE NAME; };
- #define UNIFORM_SRT( TYPE, NAME ) ConstantBuffer NAME##CB{ TYPE NAME : S_SRT_DATA; };
- #define DECLARE_OUTPUT struct cOutput {
- #define DECLARE_INPUT struct cInput {
- #define DECLARE_END };
- #define DECLARE_PTR( TYPE, NAME ) TYPE* NAME;
- #define INPUT( TYPE, NAME, REG ) TYPE NAME : REG;
- #define INPUT_NOINTERP( TYPE, NAME, REG ) nointerp TYPE NAME : REG;
- #define INPUT_NOPERSP( TYPE, NAME, REG ) nopersp TYPE NAME : REG;
- #define OUTPUT( TYPE, NAME, REG ) TYPE NAME : REG;
- #define OUTPUT_NOINTERP( TYPE, NAME, REG ) nointerp TYPE NAME : REG;
- #define OUTPUT_NOPERSP( TYPE, NAME, REG ) nopersp TYPE NAME : REG;
- #define FRAGMENT_COLOUR_UVEC4_DEFINE
- #define FRAGMENT_COLOUR_UVEC4 Out.mColour
- #define FRAGMENT_COLOUR Out.mColour
- #define FRAGMENT_COLOUR0 Out.mColour0
- #define FRAGMENT_COLOUR1 Out.mColour1
- #define FRAGMENT_COLOUR2 Out.mColour2
- #define FRAGMENT_COLOUR3 Out.mColour3
- #define FRAGMENT_COLOUR4 Out.mColour4
- #define FRAGMENT_DEPTH Out.mDepth
- #define FRAGMENT_FRONTFACE In.mbFrontFacing
- #define INPUT_FRONTFACING bool mbFrontFacing : S_FRONT_FACE;
- #if defined( D_HULL )
- #define IN( VAR ) In[ uCPID ].VAR
- #define OUT( VAR ) Out.VAR
- #define PATCH_OUT( VAR ) Out.VAR
- #define OUTPUT_VERTEX_SCREEN_POSITION OUT( mScreenPositionVec4 )
- #define INPUT_VERTEX_SCREEN_POSITION IN( mScreenPositionVec4 )
- #define TESS_LEVEL_EDGE( IND ) Out.edge_ts[ IND ]
- #define TESS_LEVEL_INNER( IND ) Out.insi_ts[ IND ]
- #define DECLARE_PATCH_OUTPUT_TRI [DOMAIN_PATCH_TYPE("tri")] struct HSConstantOutputData {
- #define OUT_PATCH_TRI_TESS_CONSTANTS float edge_ts[3] : S_EDGE_TESS_FACTOR; \
- float insi_ts[1] : S_INSIDE_TESS_FACTOR;
- #define DECLARE_PATCH_OUTPUT_QUAD [DOMAIN_PATCH_TYPE("quad")] struct HSConstantOutputData (
- #define OUT_PATCH_QUAD_TESS_CONSTANTS float edge_ts[4] : S_EDGE_TESS_FACTOR; \
- float insi_ts[2] : S_INSIDE_TESS_FACTOR;
- #define PATCH_OUTPUT( TYPE, NAME, REG ) TYPE NAME : REG;
- #elif defined( D_DOMAIN )
- #define PATCH_IN( VAR, IND ) patchIn.VAR
- #define IN( VAR, IND ) In[ IND ].VAR
- #define OUT( VAR ) Out.VAR
- #define OUTPUT_VERTEX_SCREEN_POSITION OUT( mScreenPositionVec4 )
- #define INPUT_VERTEX_SCREEN_POSITION( IND ) IN( mScreenPositionVec4, IND )
- #define DOMAIN_COORDS domainCoordinates
- #define DECLARE_PATCH_INPUT_TRI [DOMAIN_PATCH_TYPE("tri")] struct HSConstantOutputData {
- #define IN_PATCH_TRI_TESS_CONSTANTS float edge_ts[3] : S_EDGE_TESS_FACTOR; \
- float insi_ts[1] : S_INSIDE_TESS_FACTOR;
- #define DECLARE_PATCH_INPUT_QUAD [DOMAIN_PATCH_TYPE("quad")] struct HSConstantOutputData {
- #define IN_PATCH_QUAD_TESS_CONSTANTS float edge_ts[4] : S_EDGE_TESS_FACTOR; \
- float insi_ts[2] : S_INSIDE_TESS_FACTOR;
- #define PATCH_INPUT( TYPE, NAME, REG ) TYPE NAME : REG;
- #elif defined( D_GEOMETRY )
- #define IN( VAR, IND ) In[ IND ].VAR
- #define OUT( VAR ) Out.VAR
- #define OUTPUT_VERTEX_SCREEN_POSITION OUT( mScreenPositionVec4 )
- #define INPUT_VERTEX_SCREEN_POSITION( IND ) IN( mScreenPositionVec4, IND )
- #define EMIT_VERTEX TriStream.Append( Out )
- #define END_PRIMITIVE TriStream.RestartStrip()
- #else
- #define IN( VAR ) In.VAR
- #define OUT( VAR ) Out.VAR
- #endif
- // TODO get rid of this - don't pass struct through functinos, pass members.
- #define DEREF_PTR( VAR ) *VAR
- #define OUT_VERTEX_SCREEN_POSITION OUTPUT( vec4, mScreenPositionVec4, S_POSITION )
- #define IN_SCREEN_POSITION INPUT ( vec4, mScreenPositionVec4, S_POSITION )
- #define VERTEX_SCREEN_POSITION OUT( mScreenPositionVec4 )
- #endif
- // =================================================================================================
- // Main
- // =================================================================================================
- #ifdef D_PLATFORM_PC
- #define VERTEX_MAIN void main( void )
- #define VERTEX_MAIN_SRT uniform UniformBuffer lUniforms; void main( void )
- #define HULL_TRI_MAIN_SRT layout( vertices = 3 ) out; uniform UniformBuffer lUniforms; void main( void )
- #define HULL_QUAD_MAIN_SRT layout( vertices = 4 ) out; uniform UniformBuffer lUniforms; void main( void )
- #define DOMAIN_TRI_MAIN_SRT layout( triangles, fractional_even_spacing ) in; uniform UniformBuffer lUniforms; void main( void )
- #define DOMAIN_QUAD_MAIN_SRT layout( quads, fractional_even_spacing ) in; uniform UniformBuffer lUniforms; void main( void )
- #define FRAGMENT_MAIN_COLOUR FRAGMENT_COLOUR_VEC4_DEFINE void main( void )
- #define VOID_MAIN_COLOUR FRAGMENT_COLOUR_VEC4_DEFINE void main( void )
- #define FRAGMENT_MAIN_COLOUR_DEPTH FRAGMENT_COLOUR_VEC4_DEFINE void main( void )
- #define FRAGMENT_MAIN_COLOUR_DEPTH_SRT FRAGMENT_COLOUR_VEC4_DEFINE uniform UniformBuffer lUniforms; void main( void )
- #define FRAGMENT_MAIN_COLOUR_DEPTH_GE_SRT FRAGMENT_COLOUR_VEC4_DEFINE uniform UniformBuffer lUniforms; void main( void )
- #define FRAGMENT_MAIN_COLOUR_DEPTH_LE_SRT FRAGMENT_COLOUR_VEC4_DEFINE uniform UniformBuffer lUniforms; void main( void )
- #define FRAGMENT_MAIN_COLOUR_SRT FRAGMENT_COLOUR_VEC4_DEFINE uniform UniformBuffer lUniforms; void main( void )
- #define FRAGMENT_MAIN_COLOUR_EARLYZ_SRT FRAGMENT_COLOUR_VEC4_DEFINE uniform UniformBuffer lUniforms; void main( void )
- #define FRAGMENT_MAIN_UICOLOUR_SRT FRAGMENT_COLOUR_UVEC4_DEFINE uniform UniformBuffer lUniforms; void main( void )
- #define VOID_MAIN_SRT FRAGMENT_COLOUR_VEC4_DEFINE uniform UniformBuffer lUniforms; void main( void )
- #define VOID_MAIN_DEPTH_SRT FRAGMENT_COLOUR_VEC4_DEFINE uniform UniformBuffer lUniforms; void main( void )
- #define FRAGMENT_MAIN_COLOUR01_SRT FRAGMENT_COLOUR01_VEC4_DEFINE uniform UniformBuffer lUniforms; void main( void )
- #define FRAGMENT_MAIN_COLOUR01_DEPTH_SRT FRAGMENT_COLOUR01_VEC4_DEFINE uniform UniformBuffer lUniforms; void main( void )
- #elif defined( D_PLATFORM_PC_COMPUTE )
- #define COMPUTE_MAIN_SRT( X, Y, Z ) layout (local_size_x = X, local_size_y = Y, local_size_z = Z) in; void main( void )
- #define FRAGMENT_MAIN_COLOUR_SRT COMPUTE_MAIN_SRT( 8,8,1 )
- #define FRAGMENT_MAIN_COLOUR01_SRT COMPUTE_MAIN_SRT( 8,8,1 )
- #define FRAGMENT_MAIN_COLOUR_DEPTH_SRT COMPUTE_MAIN_SRT( 8,8,1 )
- #elif defined( D_PLATFORM_ORBIS_COMPUTE )
- #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)
- #define FRAGMENT_MAIN_COLOUR_SRT COMPUTE_MAIN_SRT( 8,8,1 )
- #define FRAGMENT_MAIN_COLOUR01_SRT COMPUTE_MAIN_SRT( 8,8,1 )
- #define FRAGMENT_MAIN_COLOUR_DEPTH_SRT COMPUTE_MAIN_SRT( 8,8,1 )
- #elif defined( D_PLATFORM_ORBIS )
- #define VERTEX_MAIN void main( cInput In, out cOutput Out )
- #define VERTEX_MAIN_SRT void main( cInput In, out cOutput Out, UniformBuffer lUniforms : S_SRT_DATA )
- #define HULL_TRI_MAIN_SRT [DOMAIN_PATCH_TYPE("tri")] \
- [PARTITIONING_TYPE("integer")] \
- [OUTPUT_TOPOLOGY_TYPE("triangle_cw")] \
- [OUTPUT_CONTROL_POINTS(3)] \
- [PATCH_CONSTANT_FUNC("ConstantsHS")] \
- [MAX_TESS_FACTOR(16.0)] \
- void main( \
- InputPatch<cInput, 3> In, \
- uint uCPID : S_OUTPUT_CONTROL_POINT_ID, \
- UniformBuffer lUniforms : S_SRT_DATA, \
- out cOutput Out )
- #define HULL_QUAD_MAIN_SRT [DOMAIN_PATCH_TYPE("quad")] \
- [PARTITIONING_TYPE("integer")] \
- [OUTPUT_TOPOLOGY_TYPE("triangle_cw")] \
- [OUTPUT_CONTROL_POINTS(4)] \
- [PATCH_CONSTANT_FUNC("ConstantsHS")] \
- [MAX_TESS_FACTOR(16.0)] \
- void main( \
- InputPatch<cInput, 4> In, \
- uint uCPID : S_OUTPUT_CONTROL_POINT_ID, \
- UniformBuffer lUniforms : S_SRT_DATA, \
- out cOutput Out )
- #define DOMAIN_TRI_MAIN_SRT [DOMAIN_PATCH_TYPE("tri")] \
- void main( \
- HSConstantOutputData patchIn, \
- const OutputPatch<cInput, 3> In, \
- out cOutput Out, \
- UniformBuffer lUniforms : S_SRT_DATA, \
- float3 domainCoordinates : S_DOMAIN_LOCATION )
- #define DOMAIN_QUAD_MAIN_SRT [DOMAIN_PATCH_TYPE("quad")] \
- void main( \
- HSConstantOutputData patchIn, \
- const OutputPatch<cInput, 4> In, \
- out cOutput Out, \
- UniformBuffer lUniforms : S_SRT_DATA, \
- float2 domainCoordinates : S_DOMAIN_LOCATION )
- #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 )
- #define FRAGMENT_MAIN_COLOUR struct cOutput { vec4 mColour : S_TARGET_OUTPUT; }; [RE_Z] void main( cInput In, out cOutput Out )
- #define VOID_MAIN_COLOUR struct cOutput { vec4 mColour : S_TARGET_OUTPUT; }; void main( cInput In, out cOutput Out )
- #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 )
- #define VOID_MAIN_SRT void main( cInput In, UniformBuffer lUniforms : S_SRT_DATA )
- #if defined( D_TAA_RENDER_TARGETS )
- #define FRAGMENT_MAIN_COLOUR_SRT struct cOutput { vec4 mColour0 : S_TARGET_OUTPUT0; \
- vec4 mColour1 : S_TARGET_OUTPUT1; \
- vec4 mColour2 : S_TARGET_OUTPUT2; }; \
- [RE_Z] void main( cInput In, out cOutput Out, UniformBuffer lUniforms : S_SRT_DATA )
- #elif !defined( D_ATTRIBUTES )
- #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 )
- #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 )
- #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 )
- #define FRAGMENT_MAIN_COLOUR_SRT struct cOutput { vec4 mColour : S_TARGET_OUTPUT; }; void main( cInput In, out cOutput Out, UniformBuffer lUniforms : S_SRT_DATA )
- #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 )
- #define VOID_MAIN_COLOUR_EARLYZ_SRT [FORCE_EARLY_DEPTH_STENCIL] void main( cInput In, UniformBuffer lUniforms : S_SRT_DATA )
- #define FRAGMENT_MAIN_COLOUR01_SRT struct cOutput { vec4 mColour0 : S_TARGET_OUTPUT0; \
- vec4 mColour1 : S_TARGET_OUTPUT1; }; \
- [RE_Z] void main( cInput In, out cOutput Out, UniformBuffer lUniforms : S_SRT_DATA )
- #define FRAGMENT_MAIN_COLOUR01_DEPTH_SRT struct cOutput { vec4 mColour0 : S_TARGET_OUTPUT0; \
- vec4 mColour1 : S_TARGET_OUTPUT1; \
- float mDepth : S_DEPTH_OUTPUT; }; \
- [RE_Z] void main( cInput In, out cOutput Out, UniformBuffer lUniforms : S_SRT_DATA )
- #else
- // #pragma PSSL_target_output_format(target 1 FMT_32_AR)
- #define FRAGMENT_MAIN_COLOUR_DEPTH_SRT struct cOutput { vec4 mColour0 : S_TARGET_OUTPUT0; \
- vec4 mColour1 : S_TARGET_OUTPUT1; \
- vec4 mColour2 : S_TARGET_OUTPUT2; \
- vec4 mColour3 : S_TARGET_OUTPUT3; \
- float mDepth : S_DEPTH_OUTPUT; }; \
- [RE_Z] void main( cInput In, out cOutput Out, UniformBuffer lUniforms : S_SRT_DATA )
- #define FRAGMENT_MAIN_COLOUR_SRT struct cOutput { vec4 mColour0 : S_TARGET_OUTPUT0; \
- vec4 mColour1 : S_TARGET_OUTPUT1; \
- vec4 mColour2 : S_TARGET_OUTPUT2; \
- vec4 mColour3 : S_TARGET_OUTPUT3; }; \
- [RE_Z] void main( cInput In, out cOutput Out, UniformBuffer lUniforms : S_SRT_DATA )
- #define FRAGMENT_MAIN_COLOUR_EARLYZ_SRT struct cOutput { vec4 mColour0 : S_TARGET_OUTPUT0; \
- vec4 mColour1 : S_TARGET_OUTPUT1; \
- vec4 mColour2 : S_TARGET_OUTPUT2; \
- vec4 mColour3 : S_TARGET_OUTPUT3; }; \
- [FORCE_EARLY_DEPTH_STENCIL] void main( cInput In, out cOutput Out, UniformBuffer lUniforms : S_SRT_DATA )
- #endif
- #endif
- // =================================================================================================
- // Texture resolution
- // =================================================================================================
- #ifdef D_PLATFORM_ORBIS
- uvec2 GetResolution( Texture2D lTexture )
- {
- uvec2 lResolution;
- lTexture.GetDimensionsFast(lResolution.x, lResolution.y);
- return lResolution;
- }
- uvec2 GetResolution( RW_Texture2D<float4> lTexture )
- {
- uvec2 lResolution;
- lTexture.GetDimensionsFast(lResolution.x, lResolution.y);
- return lResolution;
- }
- #else
- uvec2 GetResolution( sampler2D lTexture )
- {
- return textureSize( lTexture, 0 );
- }
- #endif
- // =================================================================================================
- // Viewport
- // =================================================================================================
- #ifdef D_PLATFORM_PC
- #define SCREENSPACE_AS_RENDERTARGET_UVS( A ) A.xy
- #elif defined(D_PLATFORM_ORBIS)
- #define SCREENSPACE_AS_RENDERTARGET_UVS( A ) ( float2( A.x, 1.0 - A.y ) )
- #endif
- #ifdef D_USING_LOGDEPTH
- #define D_DEPTH_CLEARVALUE (1.0)
- #else
- #define D_DEPTH_CLEARVALUE (0.0)
- #endif
- // =================================================================================================
- // Texture usage feedback
- // =================================================================================================
- #if defined( D_TEXTURE_FEEDBACK ) && defined( D_PLATFORM_PC )
- layout(r32i) uniform iimage2D gTexFeedbackImg;
- void WriteTexFeedback( in int liCounter, in float liMip )
- {
- if( liCounter != 0 )
- {
- #if defined( GL_ARB_shader_ballot ) && ( GL_ARB_shader_ballot == 1 )
- if( readFirstInvocationARB( gl_SubGroupInvocationARB ) == gl_SubGroupInvocationARB )
- #endif
- {
- int liIntMip = int(floor(liMip));
- //imageStore( gTexFeedbackImg, ivec2( liCounter, liIntMip ), ivec4(1,0,0,0) );
- imageAtomicAdd( gTexFeedbackImg, ivec2( liCounter, liIntMip ), int(1) );
- }
- }
- }
- vec4 Tex2dFeedback( in sampler2D lSamp, in int liCounter, in vec2 lCoords )
- {
- float liLod = textureQueryLOD( lSamp, lCoords ).x;
- WriteTexFeedback( liCounter, liLod );
- return texture( lSamp, lCoords );
- }
- vec4 Tex2dLodFeedback( in sampler2D lSamp, in int liCounter, in vec2 lCoords, in float liLod )
- {
- WriteTexFeedback( liCounter, liLod );
- return textureLod( lSamp, lCoords, liLod );
- }
- vec4 Tex2dArrayFeedback( in sampler2DArray lSamp, in int liCounter, in vec3 lCoords )
- {
- float liLod = textureQueryLOD( lSamp, lCoords.xy ).x;
- WriteTexFeedback( liCounter, liLod );
- return texture( lSamp, lCoords );
- }
- vec4 Tex3dFeedback( in sampler3D lSamp, in int liCounter, in vec3 lCoords )
- {
- float liLod = textureQueryLOD( lSamp, lCoords ).x;
- WriteTexFeedback( liCounter, liLod );
- return texture( lSamp, lCoords );
- }
- vec4 Tex3dLodFeedback( in sampler3D lSamp, in int liCounter, in vec3 lCoords, in float liLod )
- {
- WriteTexFeedback( liCounter, liLod );
- return textureLod( lSamp, lCoords, liLod );
- }
- #endif
- #endif
- //-----------------------------------------------------------------------------
- ///
- /// CustomPerMeshUniforms
- ///
- /// @brief CustomPerMeshUniforms
- ///
- /// Stuff that is only used for these types of meshes.
- //-----------------------------------------------------------------------------
- struct CustomPerMeshUniforms
- {
- vec4 gDoFParamsVec4;
- vec4 gHDRParamsVec4;
- vec4 gHBAOParamsVec4;
- vec4 gThresholdParamsVec4;
- vec4 gBlurParamsVec4;
- SAMPLER2D( gBufferMap );
- SAMPLER2D( gBuffer1Map );
- SAMPLER2D( gBuffer2Map );
- SAMPLER2D( gBuffer3Map );
- SAMPLER2D( gBuffer4Map );
- SAMPLER2D( gBuffer5Map );
- #if defined( D_DEBUG_QUAD )
- SAMPLER2D( gBuffer6Map );
- SAMPLER2D( gBuffer7Map );
- SAMPLER2D( gBuffer8Map );
- SAMPLER2D( gBuffer9Map );
- SAMPLER2D( gBuffer10Map );
- SAMPLER2D( gBuffer11Map );
- SAMPLER2D( gBuffer12Map );
- SAMPLER2D( gBuffer13Map );
- SAMPLER2D( gBuffer14Map );
- #endif
- #if defined ( D_IBL )
- SAMPLER2D (gDualPMapFront );
- SAMPLER2D (gDualPMapBack );
- vec4 gIBLParamsVec4;
- #else
- SAMPLER2D( gBlurMask );
- SAMPLER3D( gColourLUT );
- vec4 gTextureSizeMipLevelVec4;
- #endif
- SAMPLER2D( gLensDirt );
- #if defined ( D_UI )
- // UI shader stuff
- SAMPLER2D( gUIMap );
- SAMPLER2D( gUIMask );
- SAMPLER2D( gUIFullscreenEffect );
- SAMPLER2D( gUIFullscreenNormal );
- SAMPLER2D( gUIZoomEffect );
- SAMPLER2D( gUINoiseEffect );
- SAMPLER2D( gUIFullScreenRefraction );
- vec4 gUIColourVec4;
- vec4 gUIDeformVec4;
- vec4 gVignetteVec4;
- vec4 gUILowHealthVignetteVec4;
- vec4 gWashParamsVec4;
- vec4 gCriticalHitPointsVec4;
- #else
- vec4 gSkyUpperParamsVec4;
- vec4 gLightShaftColourBottomVec4;
- vec4 gLightShaftColourTopVec4;
- #endif
- };
- #if defined( D_PLATFORM_ORBIS_COMPUTE )
- //-----------------------------------------------------------------------------
- ///
- /// ComputeOutputUniforms
- ///
- /// @brief ComputeOutputUniforms
- ///
- /// Refs to output textures for compute quad shaders
- //-----------------------------------------------------------------------------
- struct ComputeOutputUniforms
- {
- RW_Texture2D<float4> gOutTexture0;
- RW_Texture2D<float4> gOutTexture1;
- RW_Texture2D<float4> gOutTexture2;
- RW_Texture2D<float4> gOutTexture3;
- RW_Texture2D<float4> gOutTexture4;
- RW_Texture2D<float> gOutTextureDepth;
- };
- #endif
- //
- // This is the SRT buffer that everything gets uploaded to (on PS4). PC just functions as normal.
- //
- struct UniformBuffer
- {
- DECLARE_PTR( PerFrameUniforms, mpPerFrame ) /*: PER_MESH*/
- DECLARE_PTR( CustomPerMeshUniforms, mpCustomPerMesh ) /*: PER_MESH*/
- DECLARE_PTR( CommonPerMeshUniforms, mpCommonPerMesh ) /*: PER_MESH*/
- #if defined( D_PLATFORM_ORBIS_COMPUTE )
- DECLARE_PTR( ComputeOutputUniforms, mpCmpOutPerMesh ) /* hack - marked 'per mesh' so it'll be alloced in cmd buf */
- #endif
- };
- #if defined( D_PLATFORM_ORBIS_COMPUTE )
- #define TEX_COORDS ( ( vec2( dispatchThreadID.xy ) + vec2(0.5) ) / vec2( GetResolution( lUniforms.mpCmpOutPerMesh.gOutTexture0 ) ) )
- #else
- #define TEX_COORDS IN(mTexCoordsVec2)
- #endif
- // =================================================================================================
- //
- // D_LENSFLARE_BRIGHT
- //
- // =================================================================================================
- #ifdef D_LENSFLARE_BRIGHT
- //-----------------------------------------------------------------------------
- // Global Data
- //-----------------------------------------------------------------------------
- // Typedefs and Classes
- DECLARE_INPUT
- IN_SCREEN_POSITION
- INPUT( vec2, mTexCoordsVec2, TEXCOORD0 )
- DECLARE_END
- //-----------------------------------------------------------------------------
- // Functions
- STATIC_CONST vec3 kLumcoeff = vec3(0.000,0.000,0.000);
- vec3
- Threshold(
- in vec3 lColour,
- in float lfThreshold,
- in float lfGain )
- {
- float lum = dot(lColour.rgb, kLumcoeff);
- float thresh = max((lum-lfThreshold)*lfGain, 0.0);
- return mix( vec3(0.0), lColour, thresh );
- }
- FRAGMENT_MAIN_COLOUR_SRT
- {
- vec4 lTexVec4;
- lTexVec4 = texture2D( lUniforms.mpCustomPerMesh.gBufferMap, TEX_COORDS.xy );
- lTexVec4.rgb = Threshold( lTexVec4.rgb,
- lUniforms.mpCustomPerMesh.gThresholdParamsVec4.x, // Threshold
- lUniforms.mpCustomPerMesh.gThresholdParamsVec4.y );// Offset
- FRAGMENT_COLOUR = vec4( lTexVec4.xyz, 1.0);
- }
- #endif // D_LENSFLARE_BRIGHT
- // =================================================================================================
- //
- // D_LENSFLARE_FEATURE
- //
- // =================================================================================================
- #ifdef D_LENSFLARE_FEATURE
- //-----------------------------------------------------------------------------
- // Global Data
- //-----------------------------------------------------------------------------
- // Typedefs and Classes
- DECLARE_INPUT
- IN_SCREEN_POSITION
- INPUT( vec2, mTexCoordsVec2, TEXCOORD0 )
- DECLARE_END
- //-----------------------------------------------------------------------------
- // Functions
- //UNIFORM( vec4, gLensParamsVec4 );
- //------------------------------------------
- //user variables
- /*
- int NSAMPLES = 0;
- float FLARE_DISPERSAL = 0;
- float FLARE_HALO_WIDTH = 0;
- vec3 FLARE_CHROMA_DISTORTION = vec3(0.00, 0.00, 0.00);
- float threshold = 0; //highlight threshold;
- float gain = 0; //highlight gain;
- */
- //------------------------------------------
- vec2
- flipTexcoords(
- in vec2 texcoords )
- {
- return -texcoords + 1.0;
- }
- float
- vignette(
- in vec2 coords )
- {
- float dist = distance(coords, vec2(0.0,0.0));
- dist = smoothstep(0.00 0.00 dist);
- return clamp(dist,0.0,0.0);
- }
- vec3
- textureDistorted(
- SAMPLER2DARG( tex ),
- in vec2 sample_center,
- in vec2 sample_vector,
- in vec3 distortion )
- {
- vec3 col = vec3(0.0);
- col.r = texture2D( tex, sample_center + sample_vector * distortion.r).r;
- col.g = texture2D( tex, sample_center + sample_vector * distortion.g).g;
- col.b = texture2D( tex, sample_center + sample_vector * distortion.b).b;
- return col;
- }
- #ifdef D_PLATFORM_ORBIS
- #pragma argument(unrollallloops)
- #endif
- FRAGMENT_MAIN_COLOUR_SRT
- {
- vec2 lTexCoord = TEX_COORDS.xy;
- lTexCoord = clamp(lTexCoord,0.000,0.000);
- vec2 image_center = vec2(0.5);
- vec2 sample_vector = (image_center - lTexCoord) * 0.0;
- vec2 halo_vector = normalize(sample_vector) * 0.0;
- vec3 result = textureDistorted( SAMPLER2DPARAM( lUniforms.mpCustomPerMesh.gBufferMap ), lTexCoord + halo_vector, halo_vector, vec3(0.000, 0.000, 0.000)).rgb;
- result *= vignette(lTexCoord);
- for (int i = 0; i < 5; ++i)
- {
- vec2 offset = sample_vector * float(i);
- result += textureDistorted( SAMPLER2DPARAM( lUniforms.mpCustomPerMesh.gBufferMap ), lTexCoord + offset, offset, vec3(0.000, 0.000, 0.000)).rgb;
- }
- vec3 anamorph = vec3(0.0);
- float s;
- for (int i = -32; i < 32; ++i)
- {
- s = clamp(1.0/abs(float(i)),0.0,1.0);
- anamorph += texture2D( lUniforms.mpCustomPerMesh.gBufferMap, vec2(lTexCoord.x + float(i)*(1.0/64.0),lTexCoord.y)).rgb*s;
- }
- FRAGMENT_COLOUR = vec4( result+(anamorph*vec3(0.1,0.0,1.0)* lUniforms.mpCustomPerMesh.gThresholdParamsVec4.z), 1.0 );
- }
- #endif // D_LENSFLARE_FEATURE
- // =================================================================================================
- //
- // D_LENSFLARE_COMBINE
- //
- // =================================================================================================
- #ifdef D_LENSFLARE_COMBINE
- //-----------------------------------------------------------------------------
- // Global Data
- //-----------------------------------------------------------------------------
- // Typedefs and Classes
- DECLARE_INPUT
- IN_SCREEN_POSITION
- INPUT( vec2, mTexCoordsVec2, TEXCOORD0 )
- DECLARE_END
- //-----------------------------------------------------------------------------
- // Functions
- //----------------------------------------------------------------------------
- FRAGMENT_MAIN_COLOUR_SRT
- {
- vec3 lFragCol;
- vec2 newCoords = TEX_COORDS.xy;
- vec3 lLensDirt = texture2D( lUniforms.mpCustomPerMesh.gLensDirt, newCoords ).xyz;
- vec3 lLensFlareCol = texture2D(lUniforms.mpCustomPerMesh.gBuffer4Map, newCoords).xyz;
- lLensFlareCol *= (lLensDirt* (lUniforms.mpCustomPerMesh.gThresholdParamsVec4.w + 0.2)) + (1.0 - lUniforms.mpCustomPerMesh.gThresholdParamsVec4.w);
- lFragCol = (texture2D(lUniforms.mpCustomPerMesh.gBuffer1Map, newCoords).xyz);
- lFragCol += (texture2D(lUniforms.mpCustomPerMesh.gBuffer2Map, newCoords).xyz);
- lFragCol += GammaCorrectInput(texture2D(lUniforms.mpCustomPerMesh.gBuffer3Map, newCoords).xyz);
- lFragCol += GammaCorrectInput(lLensFlareCol);
- lFragCol = GammaCorrectOutput(lFragCol);
- FRAGMENT_COLOUR = vec4(lFragCol, 1.0);
- }
- #endif // D_LENSFLARE_COMBINE
- ----------------------------------------
- ERROR----------------------------------------
- 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