Skip to content

Instantly share code, notes, and snippets.

@abesmon
Last active April 28, 2021 08:10
Show Gist options
  • Save abesmon/712540980a515841641fd1ff81ffdbdc to your computer and use it in GitHub Desktop.
Save abesmon/712540980a515841641fd1ff81ffdbdc to your computer and use it in GitHub Desktop.
Fake Liquid shader made in GLSL to run in TouchDesigner. Though, can be ported painlessly to any other engines/languages :) It also supports shaking, but some external script should provide wobble angles :)
uniform vec3 uLine;
uniform vec4 uLiquidColor;
uniform float uLineHeight;
uniform float uFrenelPow;
in Vert {
vec3 objectPoint;
vec3 normalForCam;
} iVert;
out vec4 fragColor;
void main()
{
TDCheckDiscard();
vec4 color = vec4(0.0);
float frenel = 1 - dot(vec3(0.0, 0.0, 1.0), iVert.normalForCam);
if (iVert.objectPoint.y < uLine.z) {
if (gl_FrontFacing) {
if (uLine.z - iVert.objectPoint.y < uLineHeight) {
vec3 ringColorHSV = TDRGBToHSV(uLiquidColor.rgb);
ringColorHSV.y -= 0.5;
ringColorHSV.z += 0.5;
color = vec4(TDHSVToRGB(ringColorHSV), uLiquidColor.a);
} else {
vec3 mainColorHSV = TDRGBToHSV(uLiquidColor.rgb);
mainColorHSV.z += pow(frenel, uFrenelPow);
color = vec4(TDHSVToRGB(mainColorHSV), uLiquidColor.a);
}
} else {
vec3 capColorHSV = TDRGBToHSV(uLiquidColor.rgb);
capColorHSV.y -= 0.7;
capColorHSV.z += 0.5;
color = vec4(TDHSVToRGB(capColorHSV), uLiquidColor.a);
}
}
TDAlphaTest(color.a);
fragColor = TDOutputSwizzle(color);
}
uniform vec3 uWobbleAngle;
uniform float uGlassWidth;
out Vert {
vec3 objectPoint;
vec3 normalForCam;
} oVert;
mat3 rotateZ(float _angle) {
return mat3(cos(_angle),-sin(_angle), 0.0,
sin(_angle),cos(_angle), 0.0,
0.0, 0.0, 1.0);
}
mat3 rotateX(float _angle) {
return mat3(1.0, 0.0, 0.0,
0.0, cos(_angle), -sin(_angle),
0.0, sin(_angle), cos(_angle));
}
void main()
{
vec3 scaledPoint = P - (N * uGlassWidth);
oVert.objectPoint = scaledPoint;
oVert.objectPoint = rotateZ(uWobbleAngle.z) * oVert.objectPoint;
oVert.objectPoint = rotateX(uWobbleAngle.x) * oVert.objectPoint;
oVert.normalForCam = uTDMats[TDCameraIndex()].camForNormals * N;
vec4 worldSpacePos = TDDeform(scaledPoint);
gl_Position = TDWorldToProj(worldSpacePos);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment