blob: 2a82b65d80a452c66af8a803b5b64388da8e766a [file] [log] [blame]
#version 460
uniform sampler2D sTDNoiseMap;
uniform sampler1D sTDSineLookup;
uniform sampler2D sTDWhite2D;
uniform sampler3D sTDWhite3D;
uniform sampler2DArray sTDWhite2DArray;
uniform samplerCube sTDWhiteCube;
uniform int uTDInstanceIDOffset;
uniform int uTDNumInstances;
uniform float uTDAlphaTestVal;
#define TD_NUM_COLOR_BUFFERS 1
#define TD_NUM_LIGHTS 0
#define TD_NUM_SHADOWED_LIGHTS 0
#define TD_NUM_ENV_LIGHTS 0
#define TD_LIGHTS_ARRAY_SIZE 1
#define TD_ENV_LIGHTS_ARRAY_SIZE 1
#define TD_NUM_CAMERAS 1
struct TDLight
{
vec4 position;
vec3 direction;
vec3 diffuse;
vec4 nearFar;
vec4 lightSize;
vec4 misc;
vec4 coneLookupScaleBias;
vec4 attenScaleBiasRoll;
mat4 shadowMapMatrix;
mat4 shadowMapCamMatrix;
vec4 shadowMapRes;
mat4 projMapMatrix;
};
struct TDEnvLight
{
vec3 color;
mat3 rotate;
};
layout(std140) uniform TDLightBlock
{
TDLight uTDLights[TD_LIGHTS_ARRAY_SIZE];
};
layout(std140) uniform TDEnvLightBlock
{
TDEnvLight uTDEnvLights[TD_ENV_LIGHTS_ARRAY_SIZE];
};
layout(std430) readonly restrict buffer TDEnvLightBuffer
{
vec3 shCoeffs[9];
} uTDEnvLightBuffers[TD_ENV_LIGHTS_ARRAY_SIZE];
struct TDPhongResult
{
vec3 diffuse;
vec3 specular;
vec3 specular2;
float shadowStrength;
};
struct TDPBRResult
{
vec3 diffuse;
vec3 specular;
float shadowStrength;
};
struct TDMatrix
{
mat4 world;
mat4 worldInverse;
mat4 worldCam;
mat4 worldCamInverse;
mat4 cam;
mat4 camInverse;
mat4 camProj;
mat4 camProjInverse;
mat4 proj;
mat4 projInverse;
mat4 worldCamProj;
mat4 worldCamProjInverse;
mat4 quadReproject;
mat3 worldForNormals;
mat3 camForNormals;
mat3 worldCamForNormals;
};
layout(std140) uniform TDMatricesBlock {
TDMatrix uTDMats[TD_NUM_CAMERAS];
};
struct TDCameraInfo
{
vec4 nearFar;
vec4 fog;
vec4 fogColor;
int renderTOPCameraIndex;
};
layout(std140) uniform TDCameraInfoBlock {
TDCameraInfo uTDCamInfos[TD_NUM_CAMERAS];
};
struct TDGeneral
{
vec4 ambientColor;
vec4 nearFar;
vec4 viewport;
vec4 viewportRes;
vec4 fog;
vec4 fogColor;
};
layout(std140) uniform TDGeneralBlock {
TDGeneral uTDGeneral;
};
layout(binding = 15) uniform samplerBuffer sTDInstanceT;
layout(binding = 16) uniform samplerBuffer sTDInstanceTexCoord;
layout(binding = 17) uniform samplerBuffer sTDInstanceColor;
vec4 TDDither(vec4 color);
vec3 TDHSVToRGB(vec3 c);
vec3 TDRGBToHSV(vec3 c);
#define PI 3.14159265
vec4 TDColor(vec4 color) { return color; }
void TDCheckOrderIndTrans() {
}
void TDCheckDiscard() {
TDCheckOrderIndTrans();
}
vec4 TDDither(vec4 color)
{
float d = texture(sTDNoiseMap,
gl_FragCoord.xy / 256.0).r;
d -= 0.5;
d /= 256.0;
return vec4(color.rgb + d, color.a);
}
bool TDFrontFacing(vec3 pos, vec3 normal)
{
return gl_FrontFacing;
}
float TDAttenuateLight(int index, float lightDist)
{
return 1.0;
}
void TDAlphaTest(float alpha) {
}
float TDHardShadow(int lightIndex, vec3 worldSpacePos)
{ return 0.0; }
float TDSoftShadow(int lightIndex, vec3 worldSpacePos, int samples, int steps)
{ return 0.0; }
float TDSoftShadow(int lightIndex, vec3 worldSpacePos)
{ return 0.0; }
float TDShadow(int lightIndex, vec3 worldSpacePos)
{ return 0.0; }
vec3 TDEquirectangularToCubeMap(vec2 mapCoord);
vec2 TDCubeMapToEquirectangular(vec3 envMapCoord);
vec2 TDCubeMapToEquirectangular(vec3 envMapCoord, out float mipMapBias);
vec2 TDTexGenSphere(vec3 envMapCoord);
float iTDRadicalInverse_VdC(uint bits)
{
bits = (bits << 16u) | (bits >> 16u);
bits = ((bits & 0x55555555u) << 1u) | ((bits & 0xAAAAAAAAu) >> 1u);
bits = ((bits & 0x33333333u) << 2u) | ((bits & 0xCCCCCCCCu) >> 2u);
bits = ((bits & 0x0F0F0F0Fu) << 4u) | ((bits & 0xF0F0F0F0u) >> 4u);
bits = ((bits & 0x00FF00FFu) << 8u) | ((bits & 0xFF00FF00u) >> 8u);
return float(bits) * 2.3283064365386963e-10; // / 0x100000000
}
vec2 iTDHammersley(uint i, uint N)
{
return vec2(float(i) / float(N), iTDRadicalInverse_VdC(i));
}
vec3 iTDImportanceSampleGGX(vec2 Xi, float roughness2, vec3 N)
{
float a = roughness2;
float phi = 2 * 3.14159265 * Xi.x;
float cosTheta = sqrt( (1 - Xi.y) / (1 + (a*a - 1) * Xi.y) );
float sinTheta = sqrt( 1 - cosTheta * cosTheta );
vec3 H;
H.x = sinTheta * cos(phi);
H.y = sinTheta * sin(phi);
H.z = cosTheta;
vec3 upVector = abs(N.z) < 0.999 ? vec3(0, 0, 1) : vec3(1, 0, 0);
vec3 tangentX = normalize(cross(upVector, N));
vec3 tangentY = cross(N, tangentX);
// Tangent to world space
vec3 worldResult = tangentX * H.x + tangentY * H.y + N * H.z;
return worldResult;
}
float iTDDistributionGGX(vec3 normal, vec3 half_vector, float roughness2)
{
const float Epsilon = 0.000001;
float NdotH = clamp(dot(normal, half_vector), Epsilon, 1.0);
float alpha2 = roughness2 * roughness2;
float denom = NdotH * NdotH * (alpha2 - 1.0) + 1.0;
denom = max(1e-8, denom);
return alpha2 / (PI * denom * denom);
}
vec3 iTDCalcF(vec3 F0, float VdotH) {
return F0 + (vec3(1.0) - F0) * pow(2.0, (-5.55473*VdotH - 6.98316) * VdotH);
}
float iTDCalcG(float NdotL, float NdotV, float k) {
float Gl = 1.0 / (NdotL * (1.0 - k) + k);
float Gv = 1.0 / (NdotV * (1.0 - k) + k);
return Gl * Gv;
}
// 0 - All options
TDPBRResult TDLightingPBR(int index,vec3 diffuseColor,vec3 specularColor,vec3 worldSpacePos,vec3 normal,float shadowStrength,vec3 shadowColor,vec3 camVector,float roughness)
{
TDPBRResult res;
return res;
}
// 0 - All options
void TDLightingPBR(inout vec3 diffuseContrib,inout vec3 specularContrib,inout float shadowStrengthOut,int index,vec3 diffuseColor,vec3 specularColor,vec3 worldSpacePos,vec3 normal,float shadowStrength,vec3 shadowColor,vec3 camVector,float roughness)
{
TDPBRResult res = TDLightingPBR(index,diffuseColor,specularColor,worldSpacePos,normal,shadowStrength,shadowColor,camVector,roughness); diffuseContrib = res.diffuse;
specularContrib = res.specular;
shadowStrengthOut = res.shadowStrength;
}
// 0 - All options
void TDLightingPBR(inout vec3 diffuseContrib,inout vec3 specularContrib,int index,vec3 diffuseColor,vec3 specularColor,vec3 worldSpacePos,vec3 normal,float shadowStrength,vec3 shadowColor,vec3 camVector,float roughness)
{
TDPBRResult res = TDLightingPBR(index,diffuseColor,specularColor,worldSpacePos,normal,shadowStrength,shadowColor,camVector,roughness); diffuseContrib = res.diffuse;
specularContrib = res.specular;
}
// 0 - All options
TDPBRResult TDEnvLightingPBR(int index,vec3 diffuseColor,vec3 specularColor,vec3 normal,vec3 camVector,float roughness,float ambientOcclusion)
{
TDPBRResult res;
return res;
}
// 0 - All options
void TDEnvLightingPBR(inout vec3 diffuseContrib,inout vec3 specularContrib,int index,vec3 diffuseColor,vec3 specularColor,vec3 normal,vec3 camVector,float roughness,float ambientOcclusion)
{
TDPBRResult res = TDEnvLightingPBR(index, diffuseColor, specularColor, normal, camVector, roughness, ambientOcclusion);
diffuseContrib = res.diffuse;
specularContrib = res.specular;
}
// 0 - All options
TDPhongResult TDLighting(int index,vec3 worldSpacePos,vec3 normal,float shadowStrength,vec3 shadowColor,vec3 camVector,float shininess,float shininess2)
{
TDPhongResult res;
switch (index)
{
default:
res.diffuse = vec3(0.0);
res.specular = vec3(0.0);
res.specular2 = vec3(0.0);
res.shadowStrength = 0.0;
break;
}
return res;
}
// 0 - Legacy
void TDLighting(inout vec3 diffuseContrib,inout vec3 specularContrib,inout vec3 specularContrib2,inout float shadowStrengthOut,int index,vec3 worldSpacePos,vec3 normal,float shadowStrength,vec3 shadowColor,vec3 camVector,float shininess,float shininess2)
{
TDPhongResult res;
switch (index)
{
default:
res.diffuse = vec3(0.0);
res.specular = vec3(0.0);
res.specular2 = vec3(0.0);
res.shadowStrength = 0.0;
break;
}
diffuseContrib = res.diffuse;
specularContrib = res.specular;
specularContrib2 = res.specular2;
shadowStrengthOut = res.shadowStrength;
}
// 0 - Legacy
void TDLighting(inout vec3 diffuseContrib,inout vec3 specularContrib,inout vec3 specularContrib2,int index,vec3 worldSpacePos,vec3 normal,float shadowStrength,vec3 shadowColor,vec3 camVector,float shininess,float shininess2)
{
TDPhongResult res;
switch (index)
{
default:
res.diffuse = vec3(0.0);
res.specular = vec3(0.0);
res.specular2 = vec3(0.0);
res.shadowStrength = 0.0;
break;
}
diffuseContrib = res.diffuse;
specularContrib = res.specular;
specularContrib2 = res.specular2;
}
// 1 - Without specular2
void TDLighting(inout vec3 diffuseContrib,inout vec3 specularContrib,int index,vec3 worldSpacePos,vec3 normal,float shadowStrength,vec3 shadowColor,vec3 camVector,float shininess)
{
TDPhongResult res;
switch (index)
{
default:
res.diffuse = vec3(0.0);
res.specular = vec3(0.0);
res.specular2 = vec3(0.0);
res.shadowStrength = 0.0;
break;
}
diffuseContrib = res.diffuse;
specularContrib = res.specular;
}
// 2 - Without shadows
void TDLighting(inout vec3 diffuseContrib,inout vec3 specularContrib,inout vec3 specularContrib2,int index,vec3 worldSpacePos,vec3 normal,vec3 camVector,float shininess,float shininess2)
{
TDPhongResult res;
switch (index)
{
default:
res.diffuse = vec3(0.0);
res.specular = vec3(0.0);
res.specular2 = vec3(0.0);
res.shadowStrength = 0.0;
break;
}
diffuseContrib = res.diffuse;
specularContrib = res.specular;
specularContrib2 = res.specular2;
}
// 3 - diffuse and specular only
void TDLighting(inout vec3 diffuseContrib,inout vec3 specularContrib,int index,vec3 worldSpacePos,vec3 normal,vec3 camVector,float shininess)
{
TDPhongResult res;
switch (index)
{
default:
res.diffuse = vec3(0.0);
res.specular = vec3(0.0);
res.specular2 = vec3(0.0);
res.shadowStrength = 0.0;
break;
}
diffuseContrib = res.diffuse;
specularContrib = res.specular;
}
// 4 - Diffuse only
void TDLighting(inout vec3 diffuseContrib,int index, vec3 worldSpacePos, vec3 normal)
{
TDPhongResult res;
switch (index)
{
default:
res.diffuse = vec3(0.0);
res.specular = vec3(0.0);
res.specular2 = vec3(0.0);
res.shadowStrength = 0.0;
break;
}
diffuseContrib = res.diffuse;
}
// 5 - diffuse only with shadows
void TDLighting(inout vec3 diffuseContrib,int index,vec3 worldSpacePos,vec3 normal,float shadowStrength,vec3 shadowColor)
{
TDPhongResult res;
switch (index)
{
default:
res.diffuse = vec3(0.0);
res.specular = vec3(0.0);
res.specular2 = vec3(0.0);
res.shadowStrength = 0.0;
break;
}
diffuseContrib = res.diffuse;
}
vec4 TDProjMap(int index, vec3 worldSpacePos, vec4 defaultColor) {
switch (index)
{
default: return defaultColor;
}
}
vec4 TDFog(vec4 color, vec3 lightingSpacePosition, int cameraIndex) {
switch (cameraIndex) {
default:
case 0:
{
return color;
}
}
}
vec4 TDFog(vec4 color, vec3 lightingSpacePosition)
{
return TDFog(color, lightingSpacePosition, 0);
}
vec3 TDInstanceTexCoord(int index, vec3 t) {
vec3 v;
int coord = index;
vec4 samp = texelFetch(sTDInstanceTexCoord, coord);
v[0] = t.s;
v[1] = t.t;
v[2] = samp[0];
t.stp = v.stp;
return t;
}
bool TDInstanceActive(int index) {
index -= uTDInstanceIDOffset;
float v;
int coord = index;
vec4 samp = texelFetch(sTDInstanceT, coord);
v = samp[0];
return v != 0.0;
}
vec3 iTDInstanceTranslate(int index, out bool instanceActive) {
int origIndex = index;
index -= uTDInstanceIDOffset;
vec3 v;
int coord = index;
vec4 samp = texelFetch(sTDInstanceT, coord);
v[0] = samp[1];
v[1] = samp[2];
v[2] = samp[3];
instanceActive = samp[0] != 0.0;
return v;
}
vec3 TDInstanceTranslate(int index) {
index -= uTDInstanceIDOffset;
vec3 v;
int coord = index;
vec4 samp = texelFetch(sTDInstanceT, coord);
v[0] = samp[1];
v[1] = samp[2];
v[2] = samp[3];
return v;
}
mat3 TDInstanceRotateMat(int index) {
index -= uTDInstanceIDOffset;
vec3 v = vec3(0.0, 0.0, 0.0);
mat3 m = mat3(1.0);
{
mat3 r;
}
return m;
}
vec3 TDInstanceScale(int index) {
index -= uTDInstanceIDOffset;
vec3 v = vec3(1.0, 1.0, 1.0);
return v;
}
vec3 TDInstancePivot(int index) {
index -= uTDInstanceIDOffset;
vec3 v = vec3(0.0, 0.0, 0.0);
return v;
}
vec3 TDInstanceRotTo(int index) {
index -= uTDInstanceIDOffset;
vec3 v = vec3(0.0, 0.0, 1.0);
return v;
}
vec3 TDInstanceRotUp(int index) {
index -= uTDInstanceIDOffset;
vec3 v = vec3(0.0, 1.0, 0.0);
return v;
}
mat4 TDInstanceMat(int id) {
bool instanceActive = true;
vec3 t = iTDInstanceTranslate(id, instanceActive);
if (!instanceActive)
{
return mat4(0.0);
}
mat4 m = mat4(1.0);
{
vec3 tt = t;
m[3][0] += m[0][0]*tt.x;
m[3][1] += m[0][1]*tt.x;
m[3][2] += m[0][2]*tt.x;
m[3][3] += m[0][3]*tt.x;
m[3][0] += m[1][0]*tt.y;
m[3][1] += m[1][1]*tt.y;
m[3][2] += m[1][2]*tt.y;
m[3][3] += m[1][3]*tt.y;
m[3][0] += m[2][0]*tt.z;
m[3][1] += m[2][1]*tt.z;
m[3][2] += m[2][2]*tt.z;
m[3][3] += m[2][3]*tt.z;
}
return m;
}
mat3 TDInstanceMat3(int id) {
mat3 m = mat3(1.0);
return m;
}
mat3 TDInstanceMat3ForNorm(int id) {
mat3 m = TDInstanceMat3(id);
return m;
}
vec4 TDInstanceColor(int index, vec4 curColor) {
index -= uTDInstanceIDOffset;
vec4 v;
int coord = index;
vec4 samp = texelFetch(sTDInstanceColor, coord);
v[0] = samp[0];
v[1] = samp[1];
v[2] = samp[2];
v[3] = 1.0;
curColor[0] = v[0];
;
curColor[1] = v[1];
;
curColor[2] = v[2];
;
return curColor;
}