#version 460 | |
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 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; | |
}; | |
void TDAlphaTest(float alpha); | |
vec4 TDDither(vec4 color); | |
vec4 TDOutputSwizzle(vec4 v); | |
uvec4 TDOutputSwizzle(uvec4 v); | |
void TDCheckOrderIndTrans(); | |
void TDCheckDiscard(); | |
uniform vec3 uConstant; | |
uniform float uShadowStrength; | |
uniform vec3 uShadowColor; | |
uniform vec4 uDiffuseColor; | |
uniform vec4 uAmbientColor; | |
uniform sampler2DArray sColorMap; | |
in Vertex | |
{ | |
vec4 color; | |
vec3 worldSpacePos; | |
vec3 texCoord0; | |
flat int cameraIndex; | |
flat int instance; | |
} iVert; | |
// Output variable for the color | |
layout(location = 0) out vec4 oFragColor[TD_NUM_COLOR_BUFFERS]; | |
void main() | |
{ | |
// This allows things such as order independent transparency | |
// and Dual-Paraboloid rendering to work properly | |
TDCheckDiscard(); | |
vec4 outcol = vec4(0.0, 0.0, 0.0, 0.0); | |
vec3 texCoord0 = iVert.texCoord0.stp; | |
float actualTexZ = mod(int(texCoord0.z),2048); | |
float instanceLoop = floor(int(texCoord0.z)/2048); | |
texCoord0.z = actualTexZ; | |
vec4 colorMapColor = texture(sColorMap, texCoord0.stp); | |
float red = colorMapColor[int(instanceLoop)]; | |
colorMapColor = vec4(red); | |
// Constant Light Contribution | |
outcol.rgb += uConstant * iVert.color.rgb; | |
outcol *= colorMapColor; | |
// Alpha Calculation | |
float alpha = iVert.color.a * colorMapColor.a ; | |
// Dithering, does nothing if dithering is disabled | |
outcol = TDDither(outcol); | |
outcol.rgb *= alpha; | |
// Modern GL removed the implicit alpha test, so we need to apply | |
// it manually here. This function does nothing if alpha test is disabled. | |
TDAlphaTest(alpha); | |
outcol.a = alpha; | |
oFragColor[0] = TDOutputSwizzle(outcol); | |
// TD_NUM_COLOR_BUFFERS will be set to the number of color buffers | |
// active in the render. By default we want to output zero to every | |
// buffer except the first one. | |
for (int i = 1; i < TD_NUM_COLOR_BUFFERS; i++) | |
{ | |
oFragColor[i] = vec4(0.0); | |
} | |
} |