Я пытаюсь нарисовать двухмерную линию с плавным градиентом между двумя цветами. Мое приложение позволяет мне щелкать и перетаскивать, первая точка отрезка линии является первой точкой щелчка, вторая точка линии следует за положением курсора мыши.
У меня есть рисование линий, используя glDrawArrays(GL_LINES, 0, points.size());
, points — это 2-х индексный массив точек.
Линия рисуется нормально, щелкая и перетаскивая, чтобы переместить линию вокруг работ, но у меня есть объяснимое поведение с моим фрагментным шейдером:
uniform vec4 color1; //Color at p1
uniform vec4 color2; //Color at p2
out vec4 fragColor;
void main()
{
//Average the fragment positions
float weight = (gl_PointCoord.s + gl_PointCoord.t) * 0.5f;
//Weight the first and second color
fragColor = (color1 * weight) + (color2 * (1.0f - weight));
}
color1
красный, color2
зеленый.
Когда я перетаскиваю свою линию вокруг нее, она отражается между полностью красным, полностью зеленым, желаемым градиентом или какой-то твердой смесью красного и зеленого на каждом перерисовке экрана.
Я подозреваю, что я использую gl_PointCoord
неправильно, но я не могу проверить значения, так как они находятся в шейдере. Я попробовал следующее в своем шейдере:
fragColor = (color1 + color2) * 0.5f;
И он дает стабильный желтый цвет, поэтому я уверен, что цвета между перерисовками стабильны.
Какие-нибудь советы?
gl_PointCoord
определяется только для точка primitves. Используя это с GL_LINES
просто неопределенное поведение и никогда не будет работать.
Если вы хотите плавный градиент, вы должны добавить weight
приписать вершины вашей линии и установить его в 0 или 1 для начальной и конечной точек, соответственно.