Как создать gradleиент цвета в SDL

SDL не имеет такой функции, любопытно, если кто-либо в прошлом это сделал и не прочь возглавить меня в правильном направлении. Я хочу создать gradleиент между двумя цветами для отражения на высоте прямоугольника.

Просто сделайте цикл над желаемыми y позициями, в которых вы:

  1. Вычислите желаемый цвет путем интерполяции между цветами конечной точки gradleиента.
  2. Вызовите SDL_SetRenderDrawColor() чтобы установить цвет.
  3. Вызовите SDL_RenderDrawLine() чтобы нарисовать горизонтальную линию в текущей позиции y.

Я сам обдумывал это вчера, и у меня была забавная идея. Если вы установите масштабирование рендеринга на линейное, вы можете масштабировать текстуру всего в пару пикселей до любых размеров, которые вы хотите, и получить плавную интерполяцию между цветами – по существу, аппаратная ускоренная фильтрация текстур дает вам gradleиенты, не требуя, чтобы процессор finger re: вычисляет их.

Я проверил это и смог создать произвольный прямоугольник с разными цветами в каждом углу и плавное смешивание между ними, используя только четырехпиксельную текстуру. Единственная проблема, с которой я столкнулся, заключалась в том, что на моей машине Windows интерполяция текстур смешалась с серой по краям и немного начала использовать цветную часть. К счастью, расширение текстуры источника с изображения 2×2 на 4×4 и смешение от центр 2×2 квадрат зафиксировал это, воспроизведя результат, который я получил на моей машине Devuan.

Конечно, это само по себе только дает вам gradleиенты вдоль осей X или Y или гипотенузы вашего прямоугольника назначения, но этого достаточно для работы, и я уверен, что умное применение функции вращения может дать вам gradleиенты под любым углом , Вот код:

 // Set linear blending (haven't tried this with bilinear...) SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY,"1"); // Create a 4x4 texture to serve as the source for our gradient. uint32_t * bgpixels; SDL_Texture * background = SDL_CreateTexture(renderer,SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_STREAMING,4,4); // Set up the gradient colors. // Each 2x2 quadrant of the texture has a separate color: // AABB // AABB // CCDD // CCDD SDL_LockTexture(background,NULL,(void**)(&bgpixels),&i); bgpixels[0] = 0x0000ffff; bgpixels[1] = 0x0000ffff; bgpixels[2] = 0x00ff00ff; bgpixels[3] = 0x00ff00ff; bgpixels[4] = 0x0000ffff; bgpixels[5] = 0x0000ffff; bgpixels[6] = 0x00ff00ff; bgpixels[7] = 0x00ff00ff; bgpixels[8] = 0xff0000ff; bgpixels[9] = 0xff0000ff; bgpixels[10] = 0xffffffff; bgpixels[11] = 0xffffffff; bgpixels[12] = 0xff0000ff; bgpixels[13] = 0xff0000ff; bgpixels[14] = 0xffffffff; bgpixels[15] = 0xffffffff; SDL_UnlockTexture(background); // Blit it into place with the renderer. SDL_RenderCopy(renderer, // The SDL 2D renderer we're using background, // The background texture &(SDL_Rect){1,1,2,2}, // We blit from the center 2x2 square to avoid a // quirk on the Windows version. NULL); // The destination rectangle - just using the full // target surface here.