Я пытаюсь сделать для программы несколько простых шейдеров градиентных фрагментов. Ничего особенного, просто укажите начальный и конечный цвета и интерполируйте между ними. Вроде все нормально работает, кроме альфа-канала. Похоже, что если цвет не является чисто черным (черный с альфа-каналом 0), альфа-канал либо игнорируется, либо устанавливается на 1.
Фрагментный шейдер:
uniform mediump vec4 TopColor;
uniform mediump vec4 BottomColor;
uniform mediump float ViewHeight;
uniform mediump vec4 kzViewport;
void main()
{
precision mediump float;
float centerY = ViewHeight / 2.0;
float r = abs(gl_FragCoord.y - centerY) / centerY;
gl_FragColor = mix(TopColor, BottomColor, r);
}
Вершинный шейдер:
attribute vec3 kzPosition;
uniform highp mat4 kzProjectionCameraWorldMatrix;
void main()
{
precision mediump float;
gl_Position = kzProjectionCameraWorldMatrix * vec4(kzPosition.xyz, 1.0);
}
Наверняка вы забыли установить glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
@HolyBlackCat Я бы посчитал, что не учитывать изменение альфа-канала что-то "неправильное", но да, проблема может быть не в самом шейдере.
Я имею в виду, что ваш шейдер обрабатывает компоненты RGB и A совершенно одинаково. Таким образом, нет никакого способа, что вывод неверен, если в то же время вывод RGB правильный.
у вас вообще есть Alpha BUFFER в вашем пиксельном формате? Если не настроить смешивание, это не поможет
Если вы говорите, что цвета интерполируются правильно, то с шейдером все в порядке. Может быть, вы забыли включить смешивание в своем движке или что-то подобное?