首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不使用glShadeModel(GL_SMOOTH)的颜色插值

不使用glShadeModel(GL_SMOOTH)的颜色插值
EN

Stack Overflow用户
提问于 2018-06-28 20:11:16
回答 1查看 1.3K关注 0票数 0

当前和所需输出

我试图在一个3D立方体中获得颜色插值/颜色渐变,我听说这是默认的,但由于某些原因它不起作用。看起来它使用的是glShadeModel(GL_FLAT),而不是我声明的。我做错了什么?

源代码:

代码语言:javascript
复制
  void drawObj (CGFobject *obj)
{ int jF, jP, dummyi=0;
  glMatrixMode(GL_MODELVIEW);
  glPushMatrix (); 
  move();
  if (!strncmp (obj->Name, "Triangle", strlen("Triangle"))) {;
  }
  glShadeModel(GL_SMOOTH);
  for (jF=0; jF < obj->nFace; jF++)
  {
    if (!jF) { 
        glLineStipple(2, 0xAAAA); }
    else{ 
        glLineStipple(2, 0xAAAA); }
        if (wire == GL_FILL && shade == GL_FLAT) glColor4fv(colors[jF]);
        glBegin(GL_POLYGON);
    for (jP=0; jP < obj->Face[jF].nPnt; jP++)
    {
      glVertex3fv(*obj->Face[jF].Pnt[jP]);
    } 
    glEnd();
  }
  glPopMatrix ();
}
  void display (void)
{ glClear(GL_COLOR_BUFFER_BIT);
  nah=eyez; fern=nah+2*diag;
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  if (persp) /*Perspective:*/
  {
    glViewport(winWidth*(1-viewScale)/2, winHeight*(1-viewScale)/2, 
               winWidth*viewScale,       winHeight*viewScale); 
    glFrustum (-diag, diag, -diag, diag, nah, fern);
  } else /*Parallel-Projection:*/
  { glViewport(0, 0, winWidth, winHeight); 
    glOrtho (-diag, diag, -diag, diag, nah, fern);
  }
  if (backF) glEnable  (GL_CULL_FACE);
  else       glDisable (GL_CULL_FACE);
  if (aa && wire == GL_LINE) 
  { glEnable (GL_POINT_SMOOTH); glEnable (GL_LINE_SMOOTH);
    glEnable (GL_BLEND); glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  } else    { glDisable (GL_POINT_SMOOTH); glDisable (GL_LINE_SMOOTH);
              glDisable (GL_BLEND); }
  glPolygonMode(GL_FRONT_AND_BACK, wire);
  glLineWidth((GLfloat)1.5f);
  if (stipple)
      glEnable(GL_LINE_STIPPLE);
  else
      glDisable(GL_LINE_STIPPLE);
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity(); 
  drawObj(&obj); 
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-28 20:31:38

但由于某种原因它不起作用。看起来它使用的是glShadeModel(GL_FLAT),而不是我声明的。我做错了什么?

当您使用glShadeModel(GL_SMOOTH)时,则通过根据三角形基元内的重心坐标插值顶点的颜色属性来计算片段的颜色。

但是在你的例子中,颜色是根据每个面而不是每个顶点指定的。这意味着定义人脸的顶点的颜色属性是相同的。因此,相同的颜色被内插,你会得到一个“扁平”的外观。

为了解决这个问题,您必须为每个顶点坐标而不仅仅是每个面设置不同的颜色属性:

代码语言:javascript
复制
glShadeModel(GL_SMOOTH);
for (jF=0; jF < obj->nFace; jF++)
{
    .....

    // if you would set the color here,
    // then every vertex of a face would have the same color attribute

    glBegin(GL_POLYGON);
    for (jP=0; jP < obj->Face[jF].nPnt; jP++)
    {
        glColor4fv( .... ); // <------------- set different color attributes per vertex
        glVertex3fv(*obj->Face[jF].Pnt[jP]);
    } 
    glEnd();
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51090578

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档