Странное поведение фрагмента шейдера OpenGL с gl_PointCoord

Я пытаюсь нарисовать двухмерную линию с плавным градиентом между двумя цветами. Мое приложение позволяет мне щелкать и перетаскивать, первая точка отрезка линии является первой точкой щелчка, вторая точка линии следует за положением курсора мыши.

У меня есть рисование линий, используя 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;

И он дает стабильный желтый цвет, поэтому я уверен, что цвета между перерисовками стабильны.

Какие-нибудь советы?

0

Решение

gl_PointCoord определяется только для точка primitves. Используя это с GL_LINES просто неопределенное поведение и никогда не будет работать.

Если вы хотите плавный градиент, вы должны добавить weight приписать вершины вашей линии и установить его в 0 или 1 для начальной и конечной точек, соответственно.

3

Другие решения


По вопросам рекламы [email protected]