【OpenGL画三角形代码】光滑着色(Gouraud)、深度缓存、透明处理、纹理映射

这篇博客介绍了OpenGL编程的基础知识,包括如何绘制实心和镂空的三角形,调整颜色和线条样式。同时,深入探讨了颜色缓存、深度缓存、透明处理和纹理映射等概念,提供了相应的代码示例,展示了如何实现2D和3D图形的混合以及透明效果。此外,还讲解了如何加载和应用纹理,以增强图形的视觉表现力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考学习资料:视频

【三角形】

【类型】:实心,光滑着色的三角形

【代码】:glShadeModel(GL_SMOOTH);

【引入】:纯色填充             代码: glShadeModel(GL_FLAT);

【效果图】

#include <windows.h>
#include <GL\glut.h>



void draw()
{
	glClearColor(0.4, 0.5, 0.9, 0.0); //设置清除颜色为黑色
	glClear(GL_COLOR_BUFFER_BIT); //用当前缓冲区清除值来清楚缓冲区

	glShadeModel(GL_SMOOTH);
	glBegin(GL_TRIANGLES);
	glColor3f(0.1, 0.3, 0.6);
	glVertex3f(0.0f, 0.0f, 0.0f);
	glColor3f(0.4, 0.3, 0.2);
	glVertex3f(0.5f, 0.0f, 0.0f);
	glColor3f(0.5, 0.6, 0.1);
	glVertex3f(0.5f, 0.5f, 0.0f);

	glEnd();

	glFlush(); //将GL命令队列中的命令发送给显卡并清空命令队列,发送完立即返回
}

void redraw(int x, int y)
{
	int dis = x > y ? y : x;
	glViewport(0, 0, dis, dis);

}

int main(int argc, char ** argv)
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); //设置图形显示模式
	glutInitWindowPosition(0, 0); //设置初始窗口的位置(窗口左上角相对于桌面坐标(x,y)
	glutInitWindowSize(500, 500); //设置初始窗口的大小
	glutCreateWindow("OpenGL窗口"); //产生一个顶层窗口,name为窗口的标题
	glutDisplayFunc(draw); //注册当前窗口的显示回调函数
	glutReshapeFunc(redraw);
	glutMainLoop(); //让glut程序进入事件循环.一旦调用, 会直到程序结束才返回
	return 0;
}

【显示模式类型总结】 实心,轮廓,点

【代码】glPolygonMode(GLenum face, GLenum mode)

参数face用于指定多边形哪一面收到模式改变的影响,取GL_FRONT,GL_BACK,GL_FRONT_AND_BACK

参数mode用于指定新的绘图模式,GL_FILLS是默认值,生成填充的多边形,GL_LINE生成多边形的轮廓,GL_POINT只画出顶点

【类型】镂空,边光滑着色三角形

【代码】于是上面的代码加入glPolygonMode(GL_FRONT, GL_LINE);即可

【效果图】

#include <windows.h>
#include <GL\glut.h>



void draw()
{
	glClearColor(0.4, 0.5, 0.9, 0.0); //设置清除颜色为黑色
	glClear(GL_COLOR_BUFFER_BIT); //用当前缓冲区清除值来清楚缓冲区
	glPolygonMode(GL_FRONT, GL_LINE);
	glShadeModel(GL_SMOOTH);

	glLineWidth(2);
	glBegin(GL_TRIANGLES);
	glColor3f(0.1, 0.3, 0.6);
	glVertex3f(0.0f, 0.0f, 0.0f);
	glColor3f(0.4, 0.3, 0.2);
	glVertex3f(0.5f, 0.0f, 0.0f);
	glColor3f(0.5, 0.6, 0.1);
	glVertex3f(0.5f, 0.5f, 0.0f);
	glEnd();

	glFlush(); //将GL命令队列中的命令发送给显卡并清空命令队列,发送完立即返回
}

void redraw(int x, int y)
{
	int dis = x > y ? y : x;
	glViewport(0, 0, dis, dis);

}

int main(int argc, char ** argv)
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); //设置图形显示模式
	glutInitWindowPosition(0, 0); //设置初始窗口的位置(窗口左上角相对于桌面坐标(x,y)
	glutInitWindowSize(500, 500); //设置初始窗口的大小
	glutCreateWindow("OpenGL窗口"); //产生一个顶层窗口,name为窗口的标题
	glutDisplayFunc(draw); //注册当前窗口的显示回调函数
	glutReshapeFunc(redraw);
	glutMainLoop(); //让glut程序进入事件循环.一旦调用, 会直到程序结束才返回
	return 0;
}

【缓存相关理论知识】

1、颜色缓存

2、深度缓存 

代码:开启深度缓存模式,glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

记录每个像素点到视点的距离,可以模拟物体之间的遮挡效果,深度测试的结果就是深度缓存

3、模板缓存

4、累计缓存

清除颜色缓存 glClear(GL_COLOR_BUFFER_BIT),用于清除当前显示缓冲区内容,为开始新的绘制做好准备

设置清除颜色

glClearColor(red, green, blue, alpha).用当前颜色清除当前显示缓冲区

内容,为开始新的图形绘制做好准备

相当于在画画之前准备一个什么颜色的纸

屏蔽颜色缓存:glColorMask() 分别设置红绿蓝alpha的可写属性

选择颜色缓存glDrawBuffer,用于对双缓存中的一个进行选择。

交换颜色缓存,swapBuffer,交换前后缓存中的颜色,以实现动画

【二维变换】

gluOtho2D(xmin,xmax,ymin,ymax)定义二维剪裁窗口 

glglViewPort(xmin,ymin,width,height) 定义视区

【透明处理】

【方法】将物体进行混合后显示

【理论步骤】

【代码】

【混合原理】

例子:

【效果图】

【代码】

#include <gl/glut.h>

void Initialization()
{
	glClearColor(1.0f, 1.0f, 1.0f, 1.0f);

	GLfloat lightSpecular[] = { 1.0, 1.0, 1.0, 1.0 };
	GLfloat lightPosition[] = { 0.5, 0.5, 4.0, 0.0 };

	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); //指定混合函数
	glShadeModel(GL_SMOOTH);

	glMaterialfv(GL_FRONT, GL_SPECULAR, lightSpecular);//材质 镜面光
	glMaterialf(GL_FRONT, GL_SHININESS, 100.0);//材质 镜面反射指数
	glLightfv(GL_LIGHT0, GL_POSITION, lightPosition);//光照方向 法向

	glEnable(GL_BLEND);        //启用混合状态
	glEnable(GL_LIGHTING);        //启用光照
	glEnable(GL_LIGHT0);        //打开光源0
	glEnable(GL_DEPTH_TEST);    //启用深度检测
	glEnable(GL_COLOR_MATERIAL);//材质跟踪当前绘图色
}

void OnDisplay(void)
{
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);  //双缓冲机制 

	glMatrixMode(GL_MODELVIEW);//设置当前操作的矩阵为“模型视图矩阵”
	glLoadIdentity();//变换前把当前矩阵设置为单位矩阵

	glPushMatrix();   //将当前单位矩阵放入队列中
	{
		glTranslatef(0.0f, 0.0f, -3.0f);
		glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
		glutSolidTorus(1.0f, 2.0f, 30.0f, 30.0f);//绘制圆环
	}
	glPopMatrix();  //经过绘制圆环,当前的单位矩阵已经变换了,于是通过装出恢复当前单位矩阵状态


	glPushMatrix();
	{
		glTranslatef(1.0f, 1.0f, 3.0f);
		glColor4f(0.0f, 1.0f, 0.0f, 0.5);
		glutSolidSphere(2.0f, 30.0f, 30.0f);//绘制球体
	}
	glPopMatrix();

	glPushMatrix();
	glTranslatef(-1, -1, 4);
	glColor4f(0.0f, 0.0f, 1.0f, 0.5);
	glBegin(GL_QUADS);  //绘制四边形
	glVertex3f(0, 0, 0);
	glVertex3f(5, 0, 0);
	glVertex3f(5, 5, 0);
	glVertex3f(0, 5, 0);
	glEnd();
	glPopMatrix();

	glPushMatrix();
	glColor4f(0.0f, 1.0f, 1.0f, 0.5);
	glTranslatef(-1, -1, 5);
	glRotatef(60, 0, 0, 1);
	glBegin(GL_QUADS);
	glVertex3f(0, 0, 0);
	glVertex3f(5, 0, 0);
	glVertex3f(5, 5, 0);
	glVertex3f(0, 5, 0);
	glEnd();
	glPopMatrix();

	glutSwapBuffers();
}

void OnReShape(int w, int h)
{
	glViewport(0, 0, w, h);

	glMatrixMode(GL_PROJECTION); //将当前矩阵指定为投影模式
	glLoadIdentity();

	if (h != 0)
	{
		GLfloat aspect = GLfloat(w) / GLfloat(h);

		if (w < h)
		{
			glOrtho(-6.0f, 6.0f, -6.0f * aspect, 6.0f * aspect, -6.0f, 6.0f);//三维正交投影
		}
		else
		{
			glOrtho(-6.0f / aspect, 6.0f / aspect, -6.0f, 6.0f, -6.0f, 6.0f);
		}
	}
	glMatrixMode(GL_MODELVIEW);
}


void main(int argc, char* argv[])
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
	glutInitWindowSize(600, 480);
	glutCreateWindow("OpenGL透明");

	glutReshapeFunc(OnReShape);
	glutDisplayFunc(OnDisplay);

	Initialization();
	glutMainLoop();  //主程序循环
}


【纹理映射相关知识点】

简称,贴图。在开发引擎中贴图是比较简单的,但在OpenGL中可能就需要大量的代码,需要自定义实现Texture Mapping功能

【效果图】

【代码】

#include<Windows.h>
#include<gl/glut.h>

void myinit()
{
	glEnable(GL_DEPTH_TEST);
}

void display()
{
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);	// 清除屏幕和深度缓存
	glLoadIdentity();	// 重置当前的模型观察矩阵
	//添加绘图代码
	glTranslatef(-1.5f, 0.0f, -6.0f);	// 左移 1.5 单位,并移入屏幕 6.0
	glRotatef(15.0f, 0.0f, 1.0f, 0.0f);	// 绕Y轴旋转金字塔
	glBegin(GL_TRIANGLES);	// 绘制三角形
		//开启平滑着色模式
	glColor3f(1.0f, 0.0f, 0.0f);		// 红色
	glVertex3f(0.0f, 1.0f, 0.0f);	// 三角形的上顶点 (前侧面)
	glColor3f(0.0f, 1.0f, 0.0f);		// 绿色
	glVertex3f(-1.0f, -1.0f, 1.0f);	// 三角形的左下顶点 (前侧面)
	glColor3f(0.0f, 0.0f, 1.0f);		// 蓝色
	glVertex3f(1.0f, -1.0f, 1.0f);	// 三角形的右下顶点 (前侧面)

	glColor3f(1.0f, 0.0f, 0.0f);		// 红色
	glVertex3f(0.0f, 1.0f, 0.0f);	// 三角形的上顶点 (右侧面)
	glColor3f(0.0f, 0.0f, 1.0f);		// 蓝色
	glVertex3f(1.0f, -1.0f, 1.0f);	// 三角形的左下顶点 (右侧面)
	glColor3f(0.0f, 1.0f, 0.0f);		// 绿色
	glVertex3f(1.0f, -1.0f, -1.0f);	// 三角形的右下顶点 (右侧面)

	glColor3f(1.0f, 0.0f, 0.0f);		// 红色
	glVertex3f(0.0f, 1.0f, 0.0f);	// 三角形的上顶点 (后侧面)
	glColor3f(0.0f, 1.0f, 0.0f);		// 绿色
	glVertex3f(1.0f, -1.0f, -1.0f);	// 三角形的左下顶点 (后侧面)
	glColor3f(0.0f, 0.0f, 1.0f);		// 蓝色
	glVertex3f(-1.0f, -1.0f, -1.0f);	// 三角形的右下顶点 (后侧面)

	glColor3f(1.0f, 0.0f, 0.0f);		// 红色
	glVertex3f(0.0f, 1.0f, 0.0f);	// 三角形的上顶点 (左侧面)
	glColor3f(0.0f, 0.0f, 1.0f);		// 蓝色
	glVertex3f(-1.0f, -1.0f, -1.0f);	// 三角形的左下顶点 (左侧面)
	glColor3f(0.0f, 1.0f, 0.0f);		// 绿色
	glVertex3f(-1.0f, -1.0f, 1.0f);	// 三角形的右下顶点 (左侧面)
	glEnd();

	glLoadIdentity();	// 重置当前的模型观察矩阵
	glTranslatef(1.50f, 0.0f, -7.0f);	// 右移1.5单位,并移入屏幕6个单位
	glRotatef(30.0f, 1.0f, 1.0f, 1.0f);	// 绕XYZ轴旋转立方体
	glBegin(GL_QUADS);		//  绘制立方体
		//开启单调着色模式,保证立方体的每个面的颜色都不同
	glColor3f(0.0f, 1.0f, 0.0f);		// 一次性将当前色设置为绿色
	glVertex3f(1.0f, 1.0f, -1.0f);	// 四边形的右上顶点 (顶面)
	glVertex3f(-1.0f, 1.0f, -1.0f);	// 四边形的左上顶点 (顶面)
	glVertex3f(-1.0f, 1.0f, 1.0f);	// 四边形的左下顶点 (顶面)
	glVertex3f(1.0f, 1.0f, 1.0f);	// 四边形的右下顶点 (顶面)

	glColor3f(1.0f, 0.5f, 0.0f);		// 颜色改成橙色
	glVertex3f(1.0f, -1.0f, 1.0f);	// 四边形的右上顶点(底面)
	glVertex3f(-1.0f, -1.0f, 1.0f);	// 四边形的左上顶点(底面)
	glVertex3f(-1.0f, -1.0f, -1.0f);	// 四边形的左下顶点(底面)
	glVertex3f(1.0f, -1.0f, -1.0f);	// 四边形的右下顶点(底面)

	glColor3f(1.0f, 0.0f, 0.0f);		// 颜色改成红色
	glVertex3f(1.0f, 1.0f, 1.0f);	// 四边形的右上顶点(前面)
	glVertex3f(-1.0f, 1.0f, 1.0f);	// 四边形的左上顶点(前面)
	glVertex3f(-1.0f, -1.0f, 1.0f);	// 四边形的左下顶点(前面)
	glVertex3f(1.0f, -1.0f, 1.0f);	// 四边形的右下顶点(前面)

	glColor3f(1.0f, 1.0f, 0.0f);		// 颜色改成黄色
	glVertex3f(1.0f, -1.0f, -1.0f);	// 四边形的右上顶点(后面)
	glVertex3f(-1.0f, -1.0f, -1.0f);	// 四边形的左上顶点(后面)
	glVertex3f(-1.0f, 1.0f, -1.0f);	// 四边形的左下顶点(后面)
	glVertex3f(1.0f, 1.0f, -1.0f);	// 四边形的右下顶点(后面)

	glColor3f(0.0f, 0.0f, 1.0f);		// 颜色改成蓝色
	glVertex3f(-1.0f, 1.0f, 1.0f);	// 四边形的右上顶点(左面)
	glVertex3f(-1.0f, 1.0f, -1.0f);	// 四边形的左上顶点(左面)
	glVertex3f(-1.0f, -1.0f, -1.0f);	// 四边形的左下顶点(左面)
	glVertex3f(-1.0f, -1.0f, 1.0f);	// 四边形的右下顶点(左面)

	glColor3f(1.0f, 0.0f, 1.0f);		// 颜色改成紫罗兰色
	glVertex3f(1.0f, 1.0f, -1.0f);	// 四边形的右上顶点(右面)
	glVertex3f(1.0f, 1.0f, 1.0f);	// 四边形的左上顶点(右面)
	glVertex3f(1.0f, -1.0f, 1.0f);	// 四边形的左下顶点(右面)
	glVertex3f(1.0f, -1.0f, -1.0f);	// 四边形的右下顶点(右面)
	glEnd();	// 立方体绘制结束

	
	glFlush();
}

void myReshape(GLsizei w, GLsizei h)
{
	glViewport(0, 0, w, h);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	if (w <= h)
		glOrtho(-1.5, 1.5, -1.5*(GLfloat)h / (GLfloat)w,
			1.5*(GLfloat)h / (GLfloat)w, -10.0, 10.0);
	else
		glOrtho(-1.5*(GLfloat)w / (GLfloat)h,
			1.5*(GLfloat)w / (GLfloat)h, -1.5, 1.5, -10.0, 10.0);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
}

int main(int argc, char **argv)
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
	glutInitWindowPosition(100, 100);
	glutInitWindowSize(500, 500);
	glutCreateWindow("this is my test OpenGL project");
	myinit();//光源信息、材质初始化
	glutDisplayFunc(display);
	glutReshapeFunc(myReshape);// 改变窗口大小时保持图形比例
	glutMainLoop();
}

使用贴图的效果:

【效果图】

注意将图片像素弄成100*100的

功能借鉴来自 博客1 博客2

 

【代码】

#define WindowWidth  400
#define WindowHeight 400
#define WindowTitle  "OpenGL纹理测试"

#include <gl/glut.h>
#include <stdio.h>
#include <stdlib.h>

//定义两个纹理对象编号
GLuint texGround;
GLuint texWall;

#define BMP_Header_Length 54  //图像数据在内存块中的偏移量
static GLfloat angle = 0.0f;   //旋转角度

// 函数power_of_two用于判断一个整数是不是2的整数次幂
int power_of_two(int n)
{
	if (n <= 0)
		return 0;
	return (n & (n - 1)) == 0;
}

/* 函数load_texture
* 读取一个BMP文件作为纹理
* 如果失败,返回0,如果成功,返回纹理编号
*/
GLuint load_texture(const char* file_name)
{
	GLint width, height, total_bytes;
	GLubyte* pixels = 0;
	GLuint last_texture_ID = 0, texture_ID = 0;

	// 打开文件,如果失败,返回
	FILE* pFile = fopen(file_name, "rb");
	if (pFile == 0)
		return 0;

	// 读取文件中图象的宽度和高度
	fseek(pFile, 0x0012, SEEK_SET);
	fread(&width, 4, 1, pFile);
	fread(&height, 4, 1, pFile);
	fseek(pFile, BMP_Header_Length, SEEK_SET);

	// 计算每行像素所占字节数,并根据此数据计算总像素字节数
	{
		GLint line_bytes = width * 3;
		while (line_bytes % 4 != 0)
			++line_bytes;
		total_bytes = line_bytes * height;
	}

	// 根据总像素字节数分配内存
	pixels = (GLubyte*)malloc(total_bytes);
	if (pixels == 0)
	{
		fclose(pFile);
		return 0;
	}

	// 读取像素数据
	if (fread(pixels, total_bytes, 1, pFile) <= 0)
	{
		free(pixels);
		fclose(pFile);
		return 0;
	}

	// 对就旧版本的兼容,如果图象的宽度和高度不是的整数次方,则需要进行缩放
	// 若图像宽高超过了OpenGL规定的最大值,也缩放
	{
		GLint max;
		glGetIntegerv(GL_MAX_TEXTURE_SIZE, &max);
		if (!power_of_two(width)
			|| !power_of_two(height)
			|| width > max
			|| height > max)
		{
			const GLint new_width = 256;
			const GLint new_height = 256; // 规定缩放后新的大小为边长的正方形
			GLint new_line_bytes, new_total_bytes;
			GLubyte* new_pixels = 0;

			// 计算每行需要的字节数和总字节数
			new_line_bytes = new_width * 3;
			while (new_line_bytes % 4 != 0)
				++new_line_bytes;
			new_total_bytes = new_line_bytes * new_height;

			// 分配内存
			new_pixels = (GLubyte*)malloc(new_total_bytes);
			if (new_pixels == 0)
			{
				free(pixels);
				fclose(pFile);
				return 0;
			}

			// 进行像素缩放
			gluScaleImage(GL_RGB,
				width, height, GL_UNSIGNED_BYTE, pixels,
				new_width, new_height, GL_UNSIGNED_BYTE, new_pixels);

			// 释放原来的像素数据,把pixels指向新的像素数据,并重新设置width和height
			free(pixels);
			pixels = new_pixels;
			width = new_width;
			height = new_height;
		}
	}

	// 分配一个新的纹理编号
	glGenTextures(1, &texture_ID);
	if (texture_ID == 0)
	{
		free(pixels);
		fclose(pFile);
		return 0;
	}

	// 绑定新的纹理,载入纹理并设置纹理参数
	// 在绑定前,先获得原来绑定的纹理编号,以便在最后进行恢复
	GLint lastTextureID = last_texture_ID;
	glGetIntegerv(GL_TEXTURE_BINDING_2D, &lastTextureID);
	glBindTexture(GL_TEXTURE_2D, texture_ID);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
	glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0,
		GL_BGR_EXT, GL_UNSIGNED_BYTE, pixels);
	glBindTexture(GL_TEXTURE_2D, lastTextureID);  //恢复之前的纹理绑定
	free(pixels);
	return texture_ID;
}


void display(void)
{
	// 清除屏幕
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	// 设置视角
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluPerspective(75, 1, 1, 21);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
	gluLookAt(-4, 7, 7, 0, 0, 0, 0, 0, 1);
	glRotatef(angle, 0.0f, 0.0f, 1.0f); //旋转
	glDisable(GL_TEXTURE_2D);    // 启用纹理
	glBegin(GL_QUADS);		//  绘制立方体
	glColor3f(0.0f, 1.0f, 0.0f);		// 一次性将当前色设置为绿色
	glVertex3f(1.0f, 1.0f, -1.0f);	// 四边形的右上顶点 (顶面)
	glVertex3f(-1.0f, 1.0f, -1.0f);	// 四边形的左上顶点 (顶面)
	glVertex3f(-1.0f, 1.0f, 1.0f);	// 四边形的左下顶点 (顶面)
	glVertex3f(1.0f, 1.0f, 1.0f);	// 四边形的右下顶点 (顶面)

	glColor3f(1.0f, 0.5f, 0.0f);		// 颜色改成橙色
	glVertex3f(1.0f, -1.0f, 1.0f);	// 四边形的右上顶点(底面)
	glVertex3f(-1.0f, -1.0f, 1.0f);	// 四边形的左上顶点(底面)
	glVertex3f(-1.0f, -1.0f, -1.0f);	// 四边形的左下顶点(底面)
	glVertex3f(1.0f, -1.0f, -1.0f);	// 四边形的右下顶点(底面)

	glColor3f(1.0f, 0.0f, 0.0f);		// 颜色改成红色
	glVertex3f(1.0f, 1.0f, 1.0f);	// 四边形的右上顶点(前面)
	glVertex3f(-1.0f, 1.0f, 1.0f);	// 四边形的左上顶点(前面)
	glVertex3f(-1.0f, -1.0f, 1.0f);	// 四边形的左下顶点(前面)
	glVertex3f(1.0f, -1.0f, 1.0f);	// 四边形的右下顶点(前面)

	glColor3f(1.0f, 1.0f, 0.0f);		// 颜色改成黄色
	glVertex3f(1.0f, -1.0f, -1.0f);	// 四边形的右上顶点(后面)
	glVertex3f(-1.0f, -1.0f, -1.0f);	// 四边形的左上顶点(后面)
	glVertex3f(-1.0f, 1.0f, -1.0f);	// 四边形的左下顶点(后面)
	glVertex3f(1.0f, 1.0f, -1.0f);	// 四边形的右下顶点(后面)

	glColor3f(0.0f, 0.0f, 1.0f);		// 颜色改成蓝色
	glVertex3f(-1.0f, 1.0f, 1.0f);	// 四边形的右上顶点(左面)
	glVertex3f(-1.0f, 1.0f, -1.0f);	// 四边形的左上顶点(左面)
	glVertex3f(-1.0f, -1.0f, -1.0f);	// 四边形的左下顶点(左面)
	glVertex3f(-1.0f, -1.0f, 1.0f);	// 四边形的右下顶点(左面)

	glColor3f(1.0f, 0.0f, 1.0f);		// 颜色改成紫罗兰色
	glVertex3f(1.0f, 1.0f, -1.0f);	// 四边形的右上顶点(右面)
	glVertex3f(1.0f, 1.0f, 1.0f);	// 四边形的左上顶点(右面)
	glVertex3f(1.0f, -1.0f, 1.0f);	// 四边形的左下顶点(右面)
	glVertex3f(1.0f, -1.0f, -1.0f);	// 四边形的右下顶点(右面)
	glEnd();	// 立方体绘制结束




	// 绘制底面以及纹理
	glEnable(GL_TEXTURE_2D);    // 启用纹理
	glBindTexture(GL_TEXTURE_2D, texGround);
	glBegin(GL_QUADS);
	glTexCoord2f(0.0f, 0.0f); glVertex3f(-8.0f, -8.0f, 0.0f);
	glTexCoord2f(0.0f, 3.0f); glVertex3f(-8.0f, 8.0f, 0.0f);
	glTexCoord2f(3.0f, 3.0f); glVertex3f(8.0f, 8.0f, 0.0f);
	glTexCoord2f(3.0f, 0.0f); glVertex3f(8.0f, -8.0f, 0.0f);
	glEnd();


	glutSwapBuffers();
}

void myIdle(void)
{
	angle += 0.1f;
	if (angle >= 360.0f)
		angle = 0.0f;
	display();
}

void myReshape(GLsizei w, GLsizei h)
{
	glViewport(0, 0, w, h);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	if (w <= h)
		glOrtho(-1.5, 1.5, -1.5*(GLfloat)h / (GLfloat)w,
			1.5*(GLfloat)h / (GLfloat)w, -10.0, 10.0);
	else
		glOrtho(-1.5*(GLfloat)w / (GLfloat)h,
			1.5*(GLfloat)w / (GLfloat)h, -1.5, 1.5, -10.0, 10.0);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
}

int main(int argc, char* argv[])
{
	// GLUT初始化
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
	glutInitWindowPosition(100, 100);
	glutInitWindowSize(500, 500);
	glutCreateWindow(WindowTitle);
	glEnable(GL_DEPTH_TEST);
	glEnable(GL_TEXTURE_2D);    // 启用纹理
	texGround = load_texture("cat_1.bmp");  //加载纹理
	texWall = load_texture("cat_1.bmp");
	glutDisplayFunc(&display);   //注册函数 
	glutIdleFunc(&myIdle);
	glutReshapeFunc(myReshape);// 改变窗口大小时保持图形比例
	glutMainLoop(); //循环调用
	return 0;
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

长沙大学ccsu_deer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值