美文网首页
OpenGL实现颜色切换与光照切换

OpenGL实现颜色切换与光照切换

作者: 正经龙 | 来源:发表于2018-09-06 09:38 被阅读0次

颜色切换

目的:实现按c使颜色在红、绿、蓝三种颜色切换

要实现这个效果,首先得搞懂在哪个地方修改颜色。
查看代码,发现给出了一行注释

void display(void)
{
    GLfloat mat[4];
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
    glTranslatef(8, 8, 0.0);
    //teapot的颜色
    mat[0] = 0.2,mat[1] = 0.2, mat[2] = 0.9;
    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat);
    glutSolidTeapot(3.0);
    glPopMatrix();
    glFlush();
}

mat就是一个float类型的数组,分布对应R\G\B\透明度
我们可以通过每次按下c键之后,修改这一个数组,然后重绘达到修改颜色的目的

声明两个全局变量用于控制和保存当前颜色
static int keyNum = 3;
static GLfloat color[4] = { 0.2,0.2,0.9,1.0 };
查看键盘输入函数
void keyboard(unsigned char key, int x, int y)
{
    switch (key) {
    case 27:
        exit(0);
        break;
    case 'c':
        reDraw();
        break;
    default:
                  cout<<key;
        break;
    }
}
自定义绘制函数为reDraw(),在函数点击c时调用。
void reDraw() {
    GLfloat mat[4];
#清理屏幕
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
#设定当前茶壶的位置
    glTranslatef(8, 8, 0.0);
    //teapot的颜色
    switch (keyNum++ % 3)
    {
    case 0:
        mat[0] = 0.5;
        mat[1] = 0.0;
        mat[2] = 0.0;
        break;
    case 1:
        mat[0] = 0.0;
        mat[1] = 0.5;
        mat[2] = 0.0;
        break;
    case 2:
        mat[0] = 0.0;
        mat[1] = 0.0;
        mat[2] = 0.5;
        break;
    default:
        break;
    }
#保存当前颜色
    color[0] = mat[0];
    color[1] = mat[1];
    color[2] = mat[2];
    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat);
    glutSolidTeapot(3.0);
    glPopMatrix();
#清空缓存区,必须要有这句否则不会运行
    glFlush();
}

点击运行查看效果


未按c改变颜色

键盘输入c呈现不同颜色


image.png
image.png
image.png

实现w \ a \ s \ d控制光源移动

同样,查看控制光源的部分,在initial函数里

//光源位置
    GLfloat position[] = { 1.0, 1.0, 1.0, 0.0 };
//设置光源
    glLightfv(GL_LIGHT0, GL_POSITION, position);

我们设置一个全局变量记录光源的位置

static GLfloat light[4] = { 1.0,1.0,5.0,0.0 };

思路如下:

  1. 通过键盘响应事件调用函数reLight(char),传进去的就是我们的方向键
  2. 在函数内部实现修改光源位置
  3. 自定义reLightDraw函数,不用reDraw的原因是这次我们不修改颜色,而是只用当前的颜色重绘,所以我们重写了一次函数。
  4. 重绘,完成
键盘响应事件
void keyboard(unsigned char key, int x, int y)
{
    switch (key) {
    case 27:
        exit(0);
        break;
    case 'c':
        reDraw();
        break;
    case 'a':
    case 'w':
    case 'd':
    case 's':
        reLight(key);
        break;
    default:
                  cout<<key;
        break;
    }
}

实现reLight修改光源位置
void reLight(char num) {
    switch (num)
    {
    case 'a':
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        light[0] -= 0.5;
        glLightfv(GL_LIGHT0, GL_POSITION, light);
        reLightDraw();
        glFlush();
        break;
    case 'w':
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        light[1] += 0.5;
        glLightfv(GL_LIGHT0, GL_POSITION, light);
        reLightDraw();
        glFlush();
        break;
    case 's':
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        light[1] -= 0.5;
        glLightfv(GL_LIGHT0, GL_POSITION, light);
        reLightDraw();
        glFlush();
        break;
    case 'd':
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        light[0] += 0.5;
        glLightfv(GL_LIGHT0, GL_POSITION, light);
        reLightDraw();
        glFlush();
        break;
    default:
        break;
    }
}
reLightDraw重绘
void reLightDraw() {
    glPushMatrix();
    glTranslatef(8, 8, 0.0);
    glMaterialfv(GL_FRONT, GL_DIFFUSE,color);
#这里的color是我们自定义的保存颜色的数组。
    glutSolidTeapot(3.0);
    glPopMatrix();
}
运行查看效果
image.png
image.png

相关文章

网友评论

      本文标题:OpenGL实现颜色切换与光照切换

      本文链接:https://www.haomeiwen.com/subject/flutgftx.html