计算机图形学 光照及纹理报告

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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);

相关文档
最新文档