(радиальная) градиентная заливка с использованием OpenGL ES - PullRequest
4 голосов
/ 14 июля 2011

В настоящее время я рисую форму, используя следующий код;

GLfloat vertex = // vertex points

glLineWidth(2);

glEnableClientState(GL_VERTEX_ARRAY);
glColor4f(1.0, 0.0, 0.0, 1.0);
glVertexPointer(2, GL_FLOAT, 0, vertex);
glDrawArrays(GL_LINE_STRIP, 0, vertex_size);
glDisableClientState(GL_VERTEX_ARRAY);

Форма, которую я рисую, сама закрывается, возможно ли заполнить эту форму (радиальным) градиентом? Если да, то как это сделать?

1 Ответ

13 голосов
/ 14 июля 2011

Если вы используете ES 1.x, вы не сможете получить вычисленный радиальный градиент на пиксель, поскольку цвета интерполируются линейно по граням.Поэтому вы можете либо загрузить текстуру с радиальным градиентом, либо построить подходящую геометрию, чтобы получить почти радиальный градиент.

В ES 2.x такого ограничения нет, поскольку вы сами определяете, что происходит для каждого пикселя.Чрезвычайно наивный шейдер фрагмента радиального градиента может быть (закодирован внешне, без тщательной проверки грамматики):

varying mediump vec3 myPosition;
uniform mediump vec3 referencePosition;
uniform lowp vec4 centreColour, outerColour;

[...]

mediump float distanceFromReferencePoint =
                       clamp(distance(myPosition, referencePosition), 0.0, 1.0);

gl_FragColor = mix(centreColour, outerColour, distanceFromReferencePoint);
...