如何在使用顶点着色器时获得平坦的非插值颜色

时间:2010-04-21 17:21:51

标签: c++ opengl interpolation shader

有没有办法实现这个目标(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 个答案:

答案 0 :(得分:1)

如果您不希望在基元内的顶点属性之间进行插值(例如,在您的情况下为线段中的颜色),则需要将相同的颜色传递两次,因此最终会复制几何体:

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

(v0由结构p0和c0,v1和p1等组成。)

使用颜色插值绘制线条

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拓扑,因为您不希望在基元内共享属性。