欢迎访问宙启技术站
智能推送

在QOpenGLWidget()中添加光照效果

发布时间:2024-01-02 10:07:31

在QOpenGLWidget中添加光照效果可以通过以下几个步骤来实现:

1. 在Qt的OpenGL窗口中,首先需要启用光照,可以通过在初始化函数中添加以下代码来完成:

void MyGLWidget::initializeGL()
{  
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
}

其中,glEnable(GL_LIGHTING) 表示启用光照功能,glEnable(GL_LIGHT0)表示启用 个光源。

2. 设置光照的属性。在Qt中,可以通过glLightfv函数来设置光源的属性,如位置、颜色、强度等。以下是一个设置光源属性的示例代码:

void MyGLWidget::initializeGL()
{  
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);

    GLfloat light_pos[] = {1.0f, 1.0f, 1.0f, 0.0f}; // 光源位置
    GLfloat light_ambient[] = {0.2f, 0.2f, 0.2f, 1.0f}; // 环境光颜色
    GLfloat light_diffuse[] = {1.0f, 1.0f, 1.0f, 1.0f}; // 漫反射光颜色
    GLfloat light_specular[] = {1.0f, 1.0f, 1.0f, 1.0f}; // 镜面反射光颜色

    glLightfv(GL_LIGHT0, GL_POSITION, light_pos);
    glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
    glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
    glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
}

其中,light_pos表示光源的位置,light_ambient表示环境光颜色,light_diffuse表示漫反射光颜色,light_specular表示镜面反射光颜色。

3. 绘制需要添加光照效果的物体。在绘制函数中,可以为每个顶点设置法线向量(用于计算光照效果),并为物体设置材质属性。以下是一个示例代码:

void MyGLWidget::paintGL()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    
    glBegin(GL_TRIANGLES);
    glNormal3f(0.0f, 0.0f, 1.0f); // 设置法线向量
    glVertex3f(-0.5f, -0.5f, 0.0f);
    glVertex3f(0.5f, -0.5f, 0.0f);
    glVertex3f(0.0f, 0.5f, 0.0f);
    glEnd();

    GLfloat mat_ambient[] = {0.2f, 0.2f, 0.2f, 1.0f}; // 环境光颜色
    GLfloat mat_diffuse[] = {0.8f, 0.8f, 0.8f, 1.0f}; // 漫反射光颜色
    GLfloat mat_specular[] = {1.0f, 1.0f, 1.0f, 1.0f}; // 镜面反射光颜色
    GLfloat mat_shininess = 100.0f; // 镜面反射强度

    glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
    glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
    glMaterialf(GL_FRONT, GL_SHININESS, mat_shininess);

    update();
}

其中,glNormal3f函数用于设置法线向量,glMaterialfv函数用于设置材质属性。

4. 运行程序。可以通过调用show()函数来显示窗口,并通过添加其他所需的OpenGL代码来实现更复杂的效果。

以下是一个完整的示例代码:

#include <QOpenGLWidget>
#include <GL/glut.h>

class MyGLWidget : public QOpenGLWidget
{
public:
    MyGLWidget(QWidget *parent = nullptr) : QOpenGLWidget(parent){}
    
protected:
    void initializeGL()
    {
        glEnable(GL_LIGHTING);
        glEnable(GL_LIGHT0);

        GLfloat light_pos[] = {1.0f, 1.0f, 1.0f, 0.0f};
        GLfloat light_ambient[] = {0.2f, 0.2f, 0.2f, 1.0f};
        GLfloat light_diffuse[] = {1.0f, 1.0f, 1.0f, 1.0f};
        GLfloat light_specular[] = {1.0f, 1.0f, 1.0f, 1.0f};

        glLightfv(GL_LIGHT0, GL_POSITION, light_pos);
        glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
        glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
        glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
    }
    
    void paintGL()
    {
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        
        glBegin(GL_TRIANGLES);
        glNormal3f(0.0f, 0.0f, 1.0f);
        glVertex3f(-0.5f, -0.5f, 0.0f);
        glVertex3f(0.5f, -0.5f, 0.0f);
        glVertex3f(0.0f, 0.5f, 0.0f);
        glEnd();

        GLfloat mat_ambient[] = {0.2f, 0.2f, 0.2f, 1.0f};
        GLfloat mat_diffuse[] = {0.8f, 0.8f, 0.8f, 1.0f};
        GLfloat mat_specular[] = {1.0f, 1.0f, 1.0f, 1.0f};
        GLfloat mat_shininess = 100.0f;

        glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
        glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
        glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
        glMaterialf(GL_FRONT, GL_SHININESS, mat_shininess);

        update();
    }
};

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    MyGLWidget *widget = new MyGLWidget;
    widget->show();
    return app.exec();
}

以上是在QOpenGLWidget中添加光照效果的基本步骤和示例代码。