在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中添加光照效果的基本步骤和示例代码。
