56 lines
1.0 KiB
GLSL
56 lines
1.0 KiB
GLSL
#ifndef _GRADIENT_GLSL_
|
|
#define _GRADIENT_GLSL_
|
|
|
|
#define DB_GRADIENT_MAX 16
|
|
|
|
struct Gradient_t {
|
|
float fPosition;
|
|
float pad0;
|
|
float pad1;
|
|
float pad2;
|
|
vec4 v4Color;
|
|
};
|
|
|
|
uniform GradientBlock
|
|
{
|
|
Gradient_t vstGradientStops[DB_GRADIENT_MAX];
|
|
};
|
|
|
|
vec4 getGradientColor(float position, int index, int count)
|
|
{
|
|
position = clamp(position, 0, 1);
|
|
|
|
int i0 = 0;
|
|
float p0 = vstGradientStops[index + i0].fPosition;
|
|
|
|
int i1 = count - 1;
|
|
float p1 = vstGradientStops[index + i1].fPosition;
|
|
|
|
for (int i = 0; i < count; i++)
|
|
{
|
|
float px = vstGradientStops[index + i].fPosition;
|
|
|
|
if (px > p0 && px <= position)
|
|
{
|
|
p0 = px;
|
|
i0 = i;
|
|
}
|
|
|
|
if (px < p1 && px >= position)
|
|
{
|
|
p1 = px;
|
|
i1 = i;
|
|
}
|
|
}
|
|
|
|
vec4 c0 = vstGradientStops[index + i0].v4Color;
|
|
vec4 c1 = vstGradientStops[index + i1].v4Color;
|
|
|
|
float l = p1 - p0;
|
|
float w = (l > 0) ? (position - p0) / (p1 - p0) : 0;
|
|
|
|
return mix(c0, c1, w);
|
|
}
|
|
|
|
#endif
|