【问题标题】:OpenGL Color Interpolation across vertices跨顶点的OpenGL颜色插值
【发布时间】:2010-04-17 07:09:13
【问题描述】:

现在,我有超过 25 个顶点构成一个模型。我想在第一个和最后一个顶点之间线性插入颜色。问题是当我编写以下代码时

glColor3f(1.0,0.0,0.0);
vertex3f(1.0,1.0,1.0);
vertex3f(0.9,1.0,1.0);
.
.`<more vertices>;
glColor3f(0.0,0.0,1.0);
vertex3f(0.0,0.0,0.0);

除了最后一个之外的所有顶点都是红色的。现在我想知道是否有一种方法可以在这些顶点上插入颜色,而不必在每个顶点手动插入颜色(而不是原生地,就像 opengl 如何自动完成它),因为我将在各种顶点。任何帮助将不胜感激。

谢谢!

【问题讨论】:

    标签: opengl graphics colors 3d interpolation


    【解决方案1】:

    OpenGL 将在一个顶点和下一个顶点之间插入像素颜色,但我不知道有什么方法可以让它自动插入中间顶点的值。通常,这并不是特别困难——无论如何你都不想为每个单独的顶点编写代码,所以添加计算非常简单:

    class pointf { 
        GLfloat x, y, z;
    };
    
    std::vector<pointf> spots;
    
    // ...
    GLfloat start_blue = 1.0f;
    GLfloat end_blue = 0.0f;
    GLfloat start_green = 0.0f;
    GLfloat end_green = 0.0f;
    GLfloat start_red = 0.0f;
    GLfloat end_red = 1.0f;
    
    GLfloat size = spots.size();
    
    glBegin(GL_POLYGON);
    for (int i=0; i<spots.size(); i++) {
        GLfloat red = start_red + (end_red-start_red) * i/size;
        GLfloat green = start_green + (end_green-start_green) * i/size;
        GLfloat blue = start_blue + (end_blue-start_blue) * i/size;
    
        glColor3f(red, green, blue);
        glVertex3f(spots[i].x, spots[i].y, spots[i].z);
    }
    glEnd();
    

    但有一件事:这对每个顶点进行纯线性插值。例如,它不会尝试考虑一个顶点与下一个顶点之间的距离。我猜想如何做这样的事情的问题是(至少部分)为什么 OpenGL 不自己尝试这样做。

    编辑:对于一个半球的渐变,我会尝试这样的事情:

    // Blue light on the left  
    GLfloat blue[] = {0.0f, 0.0f, 1.0f, 1.0f};
    GLfloat blue_pos[] = {-1.0f, 0.0f, -0.3f, 0.0f};
    
    // red light on the right
    GLfloat red[] = {1.0f, 0.0f, 0.0f, 1.0f};
    GLfloat red_pos[] = {1.0f, 0.0f, -0.3f, 0.0f};
    
    // turn on lighting:
    glEnable(GL_LIGHTING);
    glShadeModel(GL_SMOOTH);
    
    // Set up the two lights:
    glEnable(GL_LIGHT0);
    glLightfv(GL_LIGHT0, GL_DIFFUSE, blue);
    glLightfv(GL_LIGHT0, GL_POSITION, blue_pos);
    
    glEnable(GL_LIGHT1);
    glLightfv(GL_LIGHT1, GL_DIFFUSE, red);
    glLightfv(GL_LIGHT1, GL_POSITION, red_pos);
    
    // set up the material for our sphere (light neutral gray):
    GLfloat sph_mat[] = {0.8f, 0.8f, 0.8f, 1.0f};
    glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, sph_mat);
    
    // Draw a sphere:
    GLUquadric *q = gluNewQuadric();
    gluQuadricOrientation(q, GLU_OUTSIDE);
    gluQuadricDrawStyle(q, GLU_FILL);
    gluQuadricNormals(q, GLU_SMOOTH);
    gluSphere(q, 1.0, 64, 64);
    

    目前,我已经完成了一个球体的外部,但做一个半球体并没有太大的不同。

    【讨论】:

    • 感谢您的回复。你的回答绝对有道理。现在的问题是我可以将此逻辑应用于半球吗?我有一个巨大的半球,我想在不同的位置有不同的颜色。我不确定这个逻辑是否真的有效,所以你认为我可能会更好,在单个顶点计算颜色?再次感谢您抽出宝贵时间。
    • @gutsblow:也许你最好告诉我们更多关于你真正想要完成的事情。马上,听起来你最好用一个中性色的球体,在适当的位置放上红光和蓝光。
    • 抱歉,含糊其辞。这就是我真正想到的,一个巨大的球体/半球体,用作天穹。我可以对其应用纹理,但我想要一个可以通过颜色位置控制的颜色渐变。再次感谢!
    • 非常感谢。这个方法真的很管用。因为我是 OpenGL 的新手,所以我不知道有一个直接的函数可以创建一个球体,这让我的生活变得更轻松。谢谢!
    【解决方案2】:

    OpenGL 将在多边形内插入颜色,但不会跨多边形。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-11
      • 2016-06-19
      • 2020-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-17
      相关资源
      最近更新 更多