计算机图形学 光照及纹理报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《计算机图形学》综合训练项目报告
关键代码及界面展示1.源代码
//头文件
#ifndef GLWIDGET_H
#define GLWIDGET_H
#include
#include
class GLWidget : public QGLWidget
{
Q_OBJECT
public:
explicit GLWidget(QGLWidget *parent = 0);
~GLWidget();
protected:
void initializeGL();
void paintGL();
void resizeGL(int width, int height);
void keyPressEvent(QKeyEvent *e);
void loadTextures();
bool fullscreen;
GLuint texture[3];
private:
float rotate_angle;
float zoom;
float rotate_speed;
int filter;
bool light;
bool blend;
};
#endif // GLWIDGET_H
//主函数
#include "glwidget.h"
#include
#include
#include
#include
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
GLWidget w;
w.show();
return a.exec();
}
//程序主要代码
void GLWidget::initializeGL()
{
setGeometry(300, 150, 500, 500);//设置窗口初始位置和大小
loadTextures();
glEnable(GL_TEXTURE_2D);//允许采用2D纹理技术
glShadeModel(GL_SMOOTH);//设置阴影平滑模式
glClearColor(0.0, 0.0, 0.0, 0);//改变窗口的背景颜色,不过我这里貌似设置后并没有什么效果
glClearDepth(1.0);//设置深度缓存
glEnable(GL_DEPTH_TEST);//允许深度测试
glDepthFunc(GL_LEQUAL);//设置深度测试类型
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);//进行透视校正
/*opengl中支持8个光源,即GL_LIGHT0~GL_LIGHT7*/
glLightfv(GL_LIGHT1, GL_AMBIENT, light_ambient);//指定光源1的环境光参数
glLightfv(GL_LIGHT1, GL_DIFFUSE, light_diffuse);//指定光源1的漫射光参数
glLightfv(GL_LIGHT1, GL_POSITION, light_position);//指定光源1的位置glEnable(GL_LIGHT1);//允许光源1的使用
// glEnable(GL_LIGHTING);//我们还需要启动总光源开关,默认的时候不开,后面的L键来控制开启和关闭
glColor4f(1.0, 1.0, 1.0, 0.5);//后面的步骤都是以全亮绘制物体,并且50%的透明度
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
}
void GLWidget::paintGL()
{
//glClear()函数在这里就是对initializeGL()函数中设置的颜色和缓存深度等起作用
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
/*下面开始画立方体,并对其进行纹理映射*/
glLoadIdentity();
glTranslatef(0.0, 0.0, zoom);
glRotatef(rotate_angle, -0.4f, 0.4f, -1.0f);
glBindTexture(GL_TEXTURE_2D, texture[filter]);//这句代码一定要,因为在initializeGL()函数中已绑定一个固定的纹理目标了
glBegin(GL_QUADS);
//上顶面
glNormal3f(0.0, 1.0, 0.0);//该函数指定是法线的方向为向量(x, y, z)方向,在
使用光源且对空间物体进行纹理映射时,每个面都需要指定其法线的方向,否则会出现各种意外的结果。
glTexCoord2f(0.0, 1.0);//将2D的纹理坐标映射到3D的空间物体表面上glVertex3f(-1.0f, 1.0f, -1.0f);
glTexCoord2f(0.0, 0.0);
glVertex3f(-1.0f, 1.0f, 1.0f);
glTexCoord2f(1.0, 0.0);
glVertex3f(1.0f, 1.0f, 1.0f);
glTexCoord2f(1.0, 1.0);
glVertex3f(1.0f, 1.0f, -1.0f);
//下顶面
glNormal3f(0.0, -1.0, 0.0);
glTexCoord2f(0.0, 1.0);
glVertex3f(-1.0f, -1.0f, -1.0f);
glTexCoord2f(0.0, 0.0);
glVertex3f(-1.0f, -1.0f, 1.0f);
glTexCoord2f(1.0, 0.0);
glVertex3f(1.0f, -1.0f, 1.0f);
glTexCoord2f(1.0, 1.0);
glVertex3f(1.0f, -1.0f, -1.0f);
//正前面
glNormal3f(0.0, 0.0, 1.0);
glTexCoord2f(0.0, 1.0);
glVertex3f(-1.0f, 1.0f, 1.0f);
glTexCoord2f(0.0, 0.0);
glVertex3f(-1.0f, -1.0f, 1.0f);
glTexCoord2f(1.0, 0.0);
glVertex3f(1.0f, -1.0f, 1.0f);
glTexCoord2f(1.0, 1.0);
glVertex3f(1.0f, 1.0f, 1.0f);
//右侧面
glNormal3f(1.0, 0.0, 0.0);
glTexCoord2f(0.0, 1.0);
glVertex3f(1.0f, 1.0f, 1.0f);
glTexCoord2f(0.0, 0.0);
glVertex3f(1.0f, -1.0f, 1.0f);
glTexCoord2f(1.0, 0.0);
glVertex3f(1.0f, -1.0f, -1.0f);
glTexCoord2f(1.0, 1.0);
glVertex3f(1.0f, 1.0f, -1.0f);
//背后面
glNormal3f(0.0, 0.0, -1.0);
glTexCoord2f(0.0, 1.0);
glVertex3f(-1.0f, 1.0f, -1.0f);
glTexCoord2f(0.0, 0.0);