C++ gui QT4 OPENGL 开发4

来源:互联网 发布:绩效加薪矩阵 编辑:程序博客网 时间:2024/05/29 11:02

现在我们学习在OpenGL场景中应用简单的光照

 

把类GLWidget的initializeGL函数实体改为下面的样子:

 

void GLWidget::initializeGL()
{
    qglClearColor(trolltechPurple.dark());
    object = makeObject();
    glShadeModel(GL_FLAT);
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_CULL_FACE);
   
    static const GLfloat lightPos[4] = { 0.0f, 0.0f, 1.0f, 1.0f };
    GLfloat lightAmbient[4] = { 0.5f, 0.5f, 0.5f, 0.5f };
    GLfloat lightDiffuse[4] = { 1.0f, 1.0f, 1.0f, 1.0f };

     glLightfv(GL_LIGHT1, GL_POSITION, lightPos);
     glLightfv( GL_LIGHT1, GL_AMBIENT, lightAmbient );
     glLightfv( GL_LIGHT1, GL_DIFFUSE, lightDiffuse );

     glEnable(GL_LIGHTING);
     glEnable(GL_LIGHT1);
}

 

把类GLWidget的makeObject函数实体改为下面的样子:

 

GLuint GLWidget::makeObject()
{
    GLUquadricObj   *qobj;
    glClearColor(0.0,   0.0,   0.0,   0.0);
   
    GLuint list = glGenLists(1);
    glNewList(list, GL_COMPILE);
   
    static const GLfloat reflectance3[4] = { 1.0f, 1.0f, 1.0f, 1.0f };//设置对象为白色
     glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, reflectance3);
    
    qobj=gluNewQuadric();
    gluQuadricDrawStyle(qobj,GLU_SILHOUETTE);
    gluSphere(qobj,0.1f,30,30);
    gluDeleteQuadric(qobj);

 

    glEndList();
    return list;
}

 

我们将使用两种不同的光。第一种称为环境光。环境光来自于四面八方。所有场景中的对象都处于环境光的照射中。第二种类型的光源叫做漫射光。漫射光由特定的光源产生,并在您的场景中的对象表面上产生反射。处于漫射光直接照射下的任何对象表面都变得很亮,而几乎未被照射到的区域就显得要暗一些。这样在我们所创建的木板箱的棱边上就会产生的很不错的阴影效果。
   创建光源的过程和颜色的创建完全一致。前三个参数分别是RGB三色分量,最后一个是alpha通道参数。
   因此,下面的代码我们得到的是半亮(0.5f)的白色环境光。如果没有环境光,未被漫射光照到的地方会变得十分黑暗。

  GLfloat LightAmbient[]= { 0.5f, 0.5f, 0.5f, 1.0f };    // 环境光参数 (新增)

   下一行代码我们生成最亮的漫射光。所有的参数值都取成最大值1.0f。它将照在我们木板箱的前面,看起来挺好。

  GLfloat LightDiffuse[]= { 1.0f, 1.0f, 1.0f, 1.0f };    // 漫射光参数 (新增)

最后我们保存光源的位置。前三个参数和glTranslate中的一样。依次分别是XYZ轴上的位移。由于我们想要光线直接照射在木箱的正面,所以XY轴上的位移都是0.0f。第三个值是Z轴上的位移。为了保证光线总在木箱的前面,所以我们将光源的位置朝着观察者(就是您哪。)挪出屏幕。我们通常将屏幕也就是显示器的屏幕玻璃所处的位置称作Z轴的0.0f点。所以Z轴上的位移最后定为2.0f。假如您能够看见光源的话,它就浮在您显示器的前方。当然,如果木箱不在显示器的屏幕玻璃后面的话,您也无法看见箱子。最后一个参数取为1.0f。这将告诉OpenGL这里指定的坐标就是光源的位置,以后的教程中我会多加解释。

  GLfloat LightPosition[]= { 0.0f, 0.0f, 1.0f, 1.0f };    // 光源位置 ( 新增 )

原创粉丝点击