кодирование функции градиента с весами, а также добавление более одного цвета
Я усердно работал над школьным заданием, связанным с Shadertoy, в котором используется GLSL. Проект состоит в том, чтобы сделать «искаженный» фрагментный шейдер, и я подумал, что смогу сделать свой медленно движущийся поток магмы. По сути, я хочу сделать градиент, сопоставить «самую яркую» часть градиента везде, где появляется белый цвет, и смешать остальную часть градиента по краям яркой части. В основном что-то вроде этого:[текущий шейдер лавы][1]. Вот задачи, которые мне поручены:
В GLSL встроена функция , которая отлично работает, только мой градиент будет иметь более двух значений для интерполяции между ними. Написав это сейчас, я понимаю, насколько неприятным (или простым) может быть кодирование на...
Еще одна проблема, с которой я столкнулся при работе с GLSL, — это способ
«утяжеляет» градиент. Если я использую чтобы создать свой собственный двухцветный градиент, который рисует красный слева и синий справа (с оттенками фиолетового, интерполированными посередине), я не могу редактировать, где на экране находится синяя часть. Как мне добавить «ползунки» в мой код, чтобы я мог изменить положение синей части на оси x?
Вот мой код на данный момент, не стесняйтесь судить и/или давать предложения.
const vec3 lavaColorBrightOrange = vec3(1.0, 0.6471, 0.0);
const vec3 lavaColorBrightRed = vec3(0.9333, 0.2941, 0.1686);
const vec3 lavaColorDarkRed = vec3(0.6471, 0.1647, 0.1647);
const vec3 lavaColorBrownishRed = vec3(0.5451, 0.0, 0.0);
const vec3 lavaColorBlack = vec3(0.1, 0.1, 0.1);
// Weight Constants
const float lavaWeightBrightOrange = 0.01;
const float lavaWeightBrightRed = 0.03;
const float lavaWeightDarkRed = 0.08;
const float lavaWeightBrownishRed = 0.15;
const float lavaWeightBlack = 0.32;
// Self defined functions
vec3 mixMore(vec3[5] color, float[5] weight, float t) // Mixes (or lerps) more than two color values (for use with multi-color gradients)
{
vec3 result = (color[0] + (color[1] - color[0]) * weight[0]);
return result;
}
float normalizeSine(float x) // Normalizes a sin (or cosine, although it has yet to be programmed in) to a float value
{
float y = sin(x * 0.5 + 0.5);
return y;
}
float normalizeRGB(float x) // Normalizes an RGB float value back to a sin/cosine format value
{
float y = x * 2.0 - 1.0;
return y;
}
void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
// Normalized pixel coordinates (from 0 to 1)
vec2 uv = fragCoord/iResolution.xy;
// Defining the Color and Weight arrays
vec3[5] lavaColors = vec3[] (lavaColorBrightOrange, lavaColorBrightRed, lavaColorDarkRed, lavaColorBrownishRed, lavaColorBlack);
float[5] lavaWeights = float[] (lavaWeightBrightOrange, lavaWeightBrightRed, lavaWeightDarkRed, lavaWeightBrownishRed, lavaWeightBlack);
// Getting the input channel
vec3 col = texture(iChannel0, uv).rgb;
// Lava Gradient (for testing only)
vec3 lavaGradient = mixMore(lavaColors, lavaWeights, uv.x);
// Output to screen
fragColor = vec4(lavaGradient, 1.0);
}```
Thank you in advance
[1]: https://i.stack.imgur.com/TVZcS.jpg