2 uniform sampler2D sTDNoiseMap;
\r
3 uniform sampler1D sTDSineLookup;
\r
4 uniform sampler2D sTDWhite2D;
\r
5 uniform sampler3D sTDWhite3D;
\r
6 uniform sampler2DArray sTDWhite2DArray;
\r
7 uniform samplerCube sTDWhiteCube;
\r
8 uniform int uTDInstanceIDOffset;
\r
9 uniform int uTDNumInstances;
\r
10 uniform float uTDAlphaTestVal;
\r
11 #define TD_NUM_COLOR_BUFFERS 1
\r
12 #define TD_NUM_LIGHTS 0
\r
13 #define TD_NUM_SHADOWED_LIGHTS 0
\r
14 #define TD_NUM_ENV_LIGHTS 0
\r
15 #define TD_LIGHTS_ARRAY_SIZE 1
\r
16 #define TD_ENV_LIGHTS_ARRAY_SIZE 1
\r
17 #define TD_NUM_CAMERAS 1
\r
26 vec4 coneLookupScaleBias;
\r
27 vec4 attenScaleBiasRoll;
\r
28 mat4 shadowMapMatrix;
\r
29 mat4 shadowMapCamMatrix;
\r
38 layout(std140) uniform TDLightBlock
\r
40 TDLight uTDLights[TD_LIGHTS_ARRAY_SIZE];
\r
42 layout(std140) uniform TDEnvLightBlock
\r
44 TDEnvLight uTDEnvLights[TD_ENV_LIGHTS_ARRAY_SIZE];
\r
46 layout(std430) readonly restrict buffer TDEnvLightBuffer
\r
49 } uTDEnvLightBuffers[TD_ENV_LIGHTS_ARRAY_SIZE];
\r
50 struct TDPhongResult
\r
55 float shadowStrength;
\r
61 float shadowStrength;
\r
68 mat4 worldCamInverse;
\r
72 mat4 camProjInverse;
\r
76 mat4 worldCamProjInverse;
\r
78 mat3 worldForNormals;
\r
80 mat3 worldCamForNormals;
\r
82 layout(std140) uniform TDMatricesBlock {
\r
83 TDMatrix uTDMats[TD_NUM_CAMERAS];
\r
90 int renderTOPCameraIndex;
\r
92 layout(std140) uniform TDCameraInfoBlock {
\r
93 TDCameraInfo uTDCamInfos[TD_NUM_CAMERAS];
\r
104 layout(std140) uniform TDGeneralBlock {
\r
105 TDGeneral uTDGeneral;
\r
108 layout(binding = 15) uniform samplerBuffer sTDInstanceT;
\r
109 layout(binding = 16) uniform samplerBuffer sTDInstanceTexCoord;
\r
110 layout(binding = 17) uniform samplerBuffer sTDInstanceColor;
\r
111 vec4 TDDither(vec4 color);
\r
112 vec3 TDHSVToRGB(vec3 c);
\r
113 vec3 TDRGBToHSV(vec3 c);
\r
114 #define PI 3.14159265
\r
116 vec4 TDColor(vec4 color) { return color; }
\r
117 void TDCheckOrderIndTrans() {
\r
119 void TDCheckDiscard() {
\r
120 TDCheckOrderIndTrans();
\r
122 vec4 TDDither(vec4 color)
\r
124 float d = texture(sTDNoiseMap,
\r
125 gl_FragCoord.xy / 256.0).r;
\r
128 return vec4(color.rgb + d, color.a);
\r
130 bool TDFrontFacing(vec3 pos, vec3 normal)
\r
132 return gl_FrontFacing;
\r
134 float TDAttenuateLight(int index, float lightDist)
\r
138 void TDAlphaTest(float alpha) {
\r
140 float TDHardShadow(int lightIndex, vec3 worldSpacePos)
\r
142 float TDSoftShadow(int lightIndex, vec3 worldSpacePos, int samples, int steps)
\r
144 float TDSoftShadow(int lightIndex, vec3 worldSpacePos)
\r
146 float TDShadow(int lightIndex, vec3 worldSpacePos)
\r
148 vec3 TDEquirectangularToCubeMap(vec2 mapCoord);
\r
149 vec2 TDCubeMapToEquirectangular(vec3 envMapCoord);
\r
150 vec2 TDCubeMapToEquirectangular(vec3 envMapCoord, out float mipMapBias);
\r
151 vec2 TDTexGenSphere(vec3 envMapCoord);
\r
152 float iTDRadicalInverse_VdC(uint bits)
\r
154 bits = (bits << 16u) | (bits >> 16u);
\r
155 bits = ((bits & 0x55555555u) << 1u) | ((bits & 0xAAAAAAAAu) >> 1u);
\r
156 bits = ((bits & 0x33333333u) << 2u) | ((bits & 0xCCCCCCCCu) >> 2u);
\r
157 bits = ((bits & 0x0F0F0F0Fu) << 4u) | ((bits & 0xF0F0F0F0u) >> 4u);
\r
158 bits = ((bits & 0x00FF00FFu) << 8u) | ((bits & 0xFF00FF00u) >> 8u);
\r
159 return float(bits) * 2.3283064365386963e-10; // / 0x100000000
\r
161 vec2 iTDHammersley(uint i, uint N)
\r
163 return vec2(float(i) / float(N), iTDRadicalInverse_VdC(i));
\r
165 vec3 iTDImportanceSampleGGX(vec2 Xi, float roughness2, vec3 N)
\r
167 float a = roughness2;
\r
168 float phi = 2 * 3.14159265 * Xi.x;
\r
169 float cosTheta = sqrt( (1 - Xi.y) / (1 + (a*a - 1) * Xi.y) );
\r
170 float sinTheta = sqrt( 1 - cosTheta * cosTheta );
\r
173 H.x = sinTheta * cos(phi);
\r
174 H.y = sinTheta * sin(phi);
\r
177 vec3 upVector = abs(N.z) < 0.999 ? vec3(0, 0, 1) : vec3(1, 0, 0);
\r
178 vec3 tangentX = normalize(cross(upVector, N));
\r
179 vec3 tangentY = cross(N, tangentX);
\r
181 // Tangent to world space
\r
182 vec3 worldResult = tangentX * H.x + tangentY * H.y + N * H.z;
\r
183 return worldResult;
\r
185 float iTDDistributionGGX(vec3 normal, vec3 half_vector, float roughness2)
\r
187 const float Epsilon = 0.000001;
\r
189 float NdotH = clamp(dot(normal, half_vector), Epsilon, 1.0);
\r
191 float alpha2 = roughness2 * roughness2;
\r
193 float denom = NdotH * NdotH * (alpha2 - 1.0) + 1.0;
\r
194 denom = max(1e-8, denom);
\r
195 return alpha2 / (PI * denom * denom);
\r
197 vec3 iTDCalcF(vec3 F0, float VdotH) {
\r
198 return F0 + (vec3(1.0) - F0) * pow(2.0, (-5.55473*VdotH - 6.98316) * VdotH);
\r
201 float iTDCalcG(float NdotL, float NdotV, float k) {
\r
202 float Gl = 1.0 / (NdotL * (1.0 - k) + k);
\r
203 float Gv = 1.0 / (NdotV * (1.0 - k) + k);
\r
207 TDPBRResult TDLightingPBR(int index,vec3 diffuseColor,vec3 specularColor,vec3 worldSpacePos,vec3 normal,float shadowStrength,vec3 shadowColor,vec3 camVector,float roughness)
\r
213 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)
\r
215 TDPBRResult res = TDLightingPBR(index,diffuseColor,specularColor,worldSpacePos,normal,shadowStrength,shadowColor,camVector,roughness); diffuseContrib = res.diffuse;
\r
216 specularContrib = res.specular;
\r
217 shadowStrengthOut = res.shadowStrength;
\r
220 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)
\r
222 TDPBRResult res = TDLightingPBR(index,diffuseColor,specularColor,worldSpacePos,normal,shadowStrength,shadowColor,camVector,roughness); diffuseContrib = res.diffuse;
\r
223 specularContrib = res.specular;
\r
226 TDPBRResult TDEnvLightingPBR(int index,vec3 diffuseColor,vec3 specularColor,vec3 normal,vec3 camVector,float roughness,float ambientOcclusion)
\r
232 void TDEnvLightingPBR(inout vec3 diffuseContrib,inout vec3 specularContrib,int index,vec3 diffuseColor,vec3 specularColor,vec3 normal,vec3 camVector,float roughness,float ambientOcclusion)
\r
234 TDPBRResult res = TDEnvLightingPBR(index, diffuseColor, specularColor, normal, camVector, roughness, ambientOcclusion);
\r
235 diffuseContrib = res.diffuse;
\r
236 specularContrib = res.specular;
\r
239 TDPhongResult TDLighting(int index,vec3 worldSpacePos,vec3 normal,float shadowStrength,vec3 shadowColor,vec3 camVector,float shininess,float shininess2)
\r
245 res.diffuse = vec3(0.0);
\r
246 res.specular = vec3(0.0);
\r
247 res.specular2 = vec3(0.0);
\r
248 res.shadowStrength = 0.0;
\r
254 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)
\r
260 res.diffuse = vec3(0.0);
\r
261 res.specular = vec3(0.0);
\r
262 res.specular2 = vec3(0.0);
\r
263 res.shadowStrength = 0.0;
\r
266 diffuseContrib = res.diffuse;
\r
267 specularContrib = res.specular;
\r
268 specularContrib2 = res.specular2;
\r
269 shadowStrengthOut = res.shadowStrength;
\r
272 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)
\r
278 res.diffuse = vec3(0.0);
\r
279 res.specular = vec3(0.0);
\r
280 res.specular2 = vec3(0.0);
\r
281 res.shadowStrength = 0.0;
\r
284 diffuseContrib = res.diffuse;
\r
285 specularContrib = res.specular;
\r
286 specularContrib2 = res.specular2;
\r
288 // 1 - Without specular2
\r
289 void TDLighting(inout vec3 diffuseContrib,inout vec3 specularContrib,int index,vec3 worldSpacePos,vec3 normal,float shadowStrength,vec3 shadowColor,vec3 camVector,float shininess)
\r
295 res.diffuse = vec3(0.0);
\r
296 res.specular = vec3(0.0);
\r
297 res.specular2 = vec3(0.0);
\r
298 res.shadowStrength = 0.0;
\r
301 diffuseContrib = res.diffuse;
\r
302 specularContrib = res.specular;
\r
304 // 2 - Without shadows
\r
305 void TDLighting(inout vec3 diffuseContrib,inout vec3 specularContrib,inout vec3 specularContrib2,int index,vec3 worldSpacePos,vec3 normal,vec3 camVector,float shininess,float shininess2)
\r
311 res.diffuse = vec3(0.0);
\r
312 res.specular = vec3(0.0);
\r
313 res.specular2 = vec3(0.0);
\r
314 res.shadowStrength = 0.0;
\r
317 diffuseContrib = res.diffuse;
\r
318 specularContrib = res.specular;
\r
319 specularContrib2 = res.specular2;
\r
321 // 3 - diffuse and specular only
\r
322 void TDLighting(inout vec3 diffuseContrib,inout vec3 specularContrib,int index,vec3 worldSpacePos,vec3 normal,vec3 camVector,float shininess)
\r
328 res.diffuse = vec3(0.0);
\r
329 res.specular = vec3(0.0);
\r
330 res.specular2 = vec3(0.0);
\r
331 res.shadowStrength = 0.0;
\r
334 diffuseContrib = res.diffuse;
\r
335 specularContrib = res.specular;
\r
337 // 4 - Diffuse only
\r
338 void TDLighting(inout vec3 diffuseContrib,int index, vec3 worldSpacePos, vec3 normal)
\r
344 res.diffuse = vec3(0.0);
\r
345 res.specular = vec3(0.0);
\r
346 res.specular2 = vec3(0.0);
\r
347 res.shadowStrength = 0.0;
\r
350 diffuseContrib = res.diffuse;
\r
352 // 5 - diffuse only with shadows
\r
353 void TDLighting(inout vec3 diffuseContrib,int index,vec3 worldSpacePos,vec3 normal,float shadowStrength,vec3 shadowColor)
\r
359 res.diffuse = vec3(0.0);
\r
360 res.specular = vec3(0.0);
\r
361 res.specular2 = vec3(0.0);
\r
362 res.shadowStrength = 0.0;
\r
365 diffuseContrib = res.diffuse;
\r
367 vec4 TDProjMap(int index, vec3 worldSpacePos, vec4 defaultColor) {
\r
370 default: return defaultColor;
\r
373 vec4 TDFog(vec4 color, vec3 lightingSpacePosition, int cameraIndex) {
\r
374 switch (cameraIndex) {
\r
382 vec4 TDFog(vec4 color, vec3 lightingSpacePosition)
\r
384 return TDFog(color, lightingSpacePosition, 0);
\r
386 vec3 TDInstanceTexCoord(int index, vec3 t) {
\r
389 vec4 samp = texelFetch(sTDInstanceTexCoord, coord);
\r
396 bool TDInstanceActive(int index) {
\r
397 index -= uTDInstanceIDOffset;
\r
400 vec4 samp = texelFetch(sTDInstanceT, coord);
\r
404 vec3 iTDInstanceTranslate(int index, out bool instanceActive) {
\r
405 int origIndex = index;
\r
406 index -= uTDInstanceIDOffset;
\r
409 vec4 samp = texelFetch(sTDInstanceT, coord);
\r
413 instanceActive = samp[0] != 0.0;
\r
416 vec3 TDInstanceTranslate(int index) {
\r
417 index -= uTDInstanceIDOffset;
\r
420 vec4 samp = texelFetch(sTDInstanceT, coord);
\r
426 mat3 TDInstanceRotateMat(int index) {
\r
427 index -= uTDInstanceIDOffset;
\r
428 vec3 v = vec3(0.0, 0.0, 0.0);
\r
429 mat3 m = mat3(1.0);
\r
435 vec3 TDInstanceScale(int index) {
\r
436 index -= uTDInstanceIDOffset;
\r
437 vec3 v = vec3(1.0, 1.0, 1.0);
\r
440 vec3 TDInstancePivot(int index) {
\r
441 index -= uTDInstanceIDOffset;
\r
442 vec3 v = vec3(0.0, 0.0, 0.0);
\r
445 vec3 TDInstanceRotTo(int index) {
\r
446 index -= uTDInstanceIDOffset;
\r
447 vec3 v = vec3(0.0, 0.0, 1.0);
\r
450 vec3 TDInstanceRotUp(int index) {
\r
451 index -= uTDInstanceIDOffset;
\r
452 vec3 v = vec3(0.0, 1.0, 0.0);
\r
455 mat4 TDInstanceMat(int id) {
\r
456 bool instanceActive = true;
\r
457 vec3 t = iTDInstanceTranslate(id, instanceActive);
\r
458 if (!instanceActive)
\r
462 mat4 m = mat4(1.0);
\r
465 m[3][0] += m[0][0]*tt.x;
\r
466 m[3][1] += m[0][1]*tt.x;
\r
467 m[3][2] += m[0][2]*tt.x;
\r
468 m[3][3] += m[0][3]*tt.x;
\r
469 m[3][0] += m[1][0]*tt.y;
\r
470 m[3][1] += m[1][1]*tt.y;
\r
471 m[3][2] += m[1][2]*tt.y;
\r
472 m[3][3] += m[1][3]*tt.y;
\r
473 m[3][0] += m[2][0]*tt.z;
\r
474 m[3][1] += m[2][1]*tt.z;
\r
475 m[3][2] += m[2][2]*tt.z;
\r
476 m[3][3] += m[2][3]*tt.z;
\r
480 mat3 TDInstanceMat3(int id) {
\r
481 mat3 m = mat3(1.0);
\r
484 mat3 TDInstanceMat3ForNorm(int id) {
\r
485 mat3 m = TDInstanceMat3(id);
\r
488 vec4 TDInstanceColor(int index, vec4 curColor) {
\r
489 index -= uTDInstanceIDOffset;
\r
492 vec4 samp = texelFetch(sTDInstanceColor, coord);
\r
497 curColor[0] = v[0];
\r
499 curColor[1] = v[1];
\r
501 curColor[2] = v[2];
\r