Как получить плоский неинтерполированный цвет при использовании вершинных шейдеров - PullRequest
1 голос
/ 21 апреля 2010

Есть ли способ достичь этого (OpenGL 2.1)? Если я нарисую линии, как это

glShadeModel(GL_FLAT);
glBegin(GL_LINES);
  glColor3f(1.0, 1.0, 0.0);
  glVertex3fv(bottomLeft);
  glVertex3fv(topRight);

  glColor3f(1.0, 0.0, 0.0);
  glVertex3fv(topRight);
  glVertex3fv(topLeft);
  .
  .
  (draw a square)
  .
  .
glEnd();

Я получаю желаемый результат (разный цвет для каждого края), но я хочу иметь возможность вычислять значения фрагмента в шейдере. Если я делаю то же самое после настройки моей программы шейдера, я всегда получаю интерполированные цвета между вершинами. Это можно обойти? (было бы еще лучше, если бы я мог получить те же результаты, используя четырехугольники)

Спасибо

1 Ответ

1 голос
/ 22 апреля 2010

Если вы не хотите, чтобы интерполяция между атрибутами вершин в примитиве (например, цвет в сегменте линии в вашем случае) вам понадобится дважды передать один и тот же цвет, поэтому в конечном итоге дублируйте вашу геометрию:

 v0             v1          v2
 x--------------x-----------x    

(v0 состоит из структур p0 и c0, v1 из p1 и c1 и т. Д.)

Для рисования линии с цветной интерполяцией:

glBegin(GL_LINES);
//draw first segment
glColor3fv(&c0); glVertex3fv(&p0);
glColor3fv(&c1); glVertex3fv(&p1);
//draw second segment
glColor3fv(&c1); glVertex3fv(&p1);
glColor3fv(&c2); glVertex3fv(&p2);
glEnd();

Для рисования без интерполяции:

glBegin(GL_LINES);
//draw first segment
glColor3fv(&c0); glVertex3fv(&p0);
glColor3fv(&c0); glVertex3fv(&p1);
//draw second segment
glColor3fv(&c1); glVertex3fv(&v1);
glColor3fv(&c1); glVertex3fv(&v2);
glEnd();

Обратите внимание, это означает, что вы больше не можете использовать топологию GL_x_STRIP, поскольку вы не хотите обмениваться атрибутами внутри примитива.

...