OpenRCT2/data/shaders/drawimage.frag

90 lines
2.4 KiB
GLSL

#version 150
const int FLAG_COLOUR = (1 << 0);
const int FLAG_REMAP = (1 << 1);
const int FLAG_TRANSPARENT = (1 << 2);
const int FLAG_TRANSPARENT_SPECIAL = (1 << 3);
uniform vec4 uPalette[256];
uniform usampler2DArray uTexture;
flat in ivec4 fClip;
flat in int fFlags;
in vec4 fColour;
flat in int fTexColourAtlas;
in vec2 fTexColourCoords;
flat in int fTexMaskAtlas;
in vec2 fTexMaskCoords;
flat in int fTexPaletteAtlas;
flat in vec4 fTexPaletteBounds;
flat in int fMask;
in vec2 fPosition;
in vec2 fTextureCoordinate;
out vec4 oColour;
void main()
{
if (fPosition.x < fClip.x || fPosition.x > fClip.z ||
fPosition.y < fClip.y || fPosition.y > fClip.w)
{
discard;
}
vec4 texel;
// If remap palette used
if ((fFlags & FLAG_REMAP) != 0)
{
// z is the size of each x pixel in the atlas
float x = fTexPaletteBounds.x + texture(uTexture, vec3(fTexColourCoords, float(fTexColourAtlas))).r * fTexPaletteBounds.z;
texel = uPalette[texture(uTexture, vec3(x, fTexPaletteBounds.y, float(fTexPaletteAtlas))).r];
} // If transparent or special transparent
else if ((fFlags & (FLAG_TRANSPARENT | FLAG_TRANSPARENT_SPECIAL)) != 0)
{
float line = texture(uTexture,vec3(fTexColourCoords, float(fTexColourAtlas))).r;
if (line == 0.0)
{
discard;
}
float alpha = 0.5;
if ((fFlags & FLAG_TRANSPARENT_SPECIAL) != 0)
{
alpha = 0.5 + (line - 1.0) / 10.0;
}
// z is the size of each x pixel in the atlas
float x = fTexPaletteBounds.x + fTexPaletteBounds.z * 50.0;
oColour = vec4(uPalette[texture(uTexture, vec3(x, fTexPaletteBounds.y, float(fTexPaletteAtlas))).r].rgb, alpha);
return;
}
else
{
texel = uPalette[texture(uTexture, vec3(fTexColourCoords, float(fTexColourAtlas))).r];
}
if (fMask != 0)
{
float mask = texture(uTexture, vec3(fTexMaskCoords, float(fTexMaskAtlas))).r;
if ( mask == 0.0 )
{
discard;
}
oColour = texel;
}
else
{
if ((fFlags & FLAG_COLOUR) != 0)
{
oColour = vec4(fColour.rgb, fColour.a * texel.a);
}
else
{
oColour = texel;
}
}
}