#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