#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); } }