OpenGL图像纹理和和函数纹理

在三维空间中,实现物体表面纹理的绘制,通过菜单完成:

  1. 图像纹理
  2. 函数纹理
  3. 退出

#include <iostream>
#include <cmath>
#include<windows.h>
#include<stdlib.h>
#include<gl/glut.h>
#include<stdio.h>
#include<math.h> //X86
#include<glaux.h>
#pragma comment(lib, "glaux")

#define Width 32
#define Height 32
GLubyte texImage[Height][Width][3];

float rot = 0;
GLuint texture[6];
GLuint texture2[1];
int yourselect;

void Init();
void Reshape(int w, int h);
void LoadGLTextures();
void Loadfunctt();
void makeTexture();
void myDisplay();
void idle();
void menu(int menultem);


void Init()
{
	glClearColor(0.0f, 0.0f,0.1f, 0);//清除颜色函数。会清除(即绘制)的背景色。
	glCullFace(GL_BACK);//背面不可见
	glEnable(GL_CULL_FACE);//裁剪
	glEnable(GL_TEXTURE_2D);//开启纹理
}

void Reshape(int w, int h)
{
	glViewport(0, 0, w, h);
	glMatrixMode(GL_PROJECTION);
	//glMatrixMode设置接下来的矩阵操作为投影矩阵或模型视图矩阵
	//GL_PROJECTION参数用于设置接下来的操作为投影矩阵,GL_MODELVIEW参数则用于设置接下来的操作为模型视图矩阵。
	//投影矩阵定义了从视点到裁剪平面的映射,决定了哪些物体可以被渲染以及它们在窗口中的位置。
	//	模型视图矩阵则定义了物体在空间中的位置、旋转和缩放。
	glLoadIdentity();

	glOrtho(-w / 2, w / 2, -h / 2, h / 2, -300, 300);//设置一个二维的正交投影矩阵。void glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
}


void LoadGLTextures()
{
	AUX_RGBImageRec* someImage[6];//几幅图
	memset(someImage, 0, sizeof(void*) * 6);
	someImage[0] = auxDIBImageLoad("picture_of_bmp\\bzh.bmp");
	someImage[1] = auxDIBImageLoad("picture_of_bmp\\bzhs.bmp");
	someImage[2] = auxDIBImageLoad("picture_of_bmp\\bzhh.bmp");
	someImage[3] = auxDIBImageLoad("picture_of_bmp\\bzhc.bmp");
	someImage[4] = auxDIBImageLoad("picture_of_bmp\\bzhc.bmp");
	someImage[5] = auxDIBImageLoad("picture_of_bmp\\bzhh.bmp");
	/*for (int i = 0; i < 6; i++) {
		someImage[i] = auxDIBImageLoad("picture_of_bmp\\bzhbzh.bmp");
	}*/
	
	for (int i = 0; i < 6; i++) {
		if (someImage[i])                         //纹理是否存在********
		{
			/*printf("times of for :%d\n",i);///ttt
			printf("2\n");///ttttt*/
			glGenTextures(1, &texture[i]);           //创建纹理
			glBindTexture(GL_TEXTURE_2D, texture[i]); //绑定纹理
			glTexImage2D(GL_TEXTURE_2D, 0, 3, someImage[i]->sizeX, someImage[i]->sizeY, 0,GL_RGB, GL_UNSIGNED_BYTE, someImage[i]->data);//GL_TEXTURE_2D用于渲染2D图像或贴图到3D模型上。//纹理对象的类型,分辨率级别,3代表rgb,长,款,边框,数据格式和数据类型,一个指向内存中图像数据的指针。
			
			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);//设置纹理参数//纹理对象的类型,纹理参数的名称,
			free(someImage[i]); //someImage[i] = NULL;//释放图像结构变量占用的内存
		}//glGenTextures函数创建纹理对象,然后使用glBindTexture函数将纹理对象绑定到当前的纹理单元上。接着使用glTexImage2D函数将图像数据传递给纹理对象,其中包括图像的分辨率、格式和数据。//最后使用glTexParameteri函数设置纹理参数,例如纹理过滤器和纹理环绕方式。最后使用free函数释放图像结构变量占用的内存。
		else {
			printf("不存在");
		}
	}
}

void makeTexture() {
	int c;
	for (int i = 0; i < Height; i++)
	{
		for (int j = 0; j < Width; j++) {
			c = (((i & 0x32) == 0) ^ ((j & 0x32)) == 0) * 255;
			texImage[i][j][0] = (GLubyte)c;
			texImage[i][j][1] = (GLubyte)c;
			texImage[i][j][2] = (GLubyte)c;
		}
	}
}
void Loadfunctt() {  //函数纹理
	makeTexture();
	glPixelStorei(GL_UNPACK_ALIGNMENT, 1);//像素传输
	glGenTextures(1, &texture2[0]);
	glBindTexture(GL_TEXTURE_2D, texture2[0]); //绑定纹理
	glTexImage2D(GL_TEXTURE_2D, 0, 3, Width, Height, 0, GL_RGB, GL_UNSIGNED_BYTE, texImage);//贴图
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
	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);
}

void myDisplay()
{
	glClear(GL_COLOR_BUFFER_BIT);
	glLoadIdentity();
	glRotatef(rot, 1, 0, 0);
	glRotatef(rot, 0, 1, 0);
	glRotatef(rot, 0, 0, 1);

	glutWireCube(200);

	if (yourselect == 1) {
		LoadGLTextures();
		glBindTexture(GL_TEXTURE_2D, texture[0]);//front
		glBegin(GL_QUADS);
		glTexCoord2f(0.0f, 0.0f); glVertex3f(-100, -100, 100);
		glTexCoord2f(1.0f, 0.0f); glVertex3f(100, -100, 100);
		glTexCoord2f(1.0f, 1.0f); glVertex3f(100, 100, 100);
		glTexCoord2f(0.0f, 1.0f); glVertex3f(-100, 100, 100);
		glEnd();

		glBindTexture(GL_TEXTURE_2D, texture[1]);//back
		glBegin(GL_QUADS);
		glTexCoord2f(1.0f, 0.0f); glVertex3f(-100, -100, -100);
		glTexCoord2f(1.0f, 1.0f); glVertex3f(-100, 100, -100);
		glTexCoord2f(0.0f, 1.0f); glVertex3f(100, 100, -100);
		glTexCoord2f(0.0f, 0.0f); glVertex3f(100, -100, -100);
		glEnd();

		glBindTexture(GL_TEXTURE_2D, texture[2]);//top
		glBegin(GL_QUADS);
		glTexCoord2f(0.0f, 1.0f); glVertex3f(-100, 100, -100);
		glTexCoord2f(0.0f, 0.0f); glVertex3f(-100, 100, 100);
		glTexCoord2f(1.0f, 0.0f); glVertex3f(100, 100, 100);
		glTexCoord2f(1.0f, 1.0f); glVertex3f(100, 100, -100);
		glEnd();

		glBindTexture(GL_TEXTURE_2D, texture[3]);//bottom
		glBegin(GL_QUADS);
		glTexCoord2f(1.0f, 1.0f); glVertex3f(-100, -100, -100);
		glTexCoord2f(0.0f, 1.0f); glVertex3f(100, -100, -100);
		glTexCoord2f(0.0f, 0.0f); glVertex3f(100, -100, 100);
		glTexCoord2f(1.0f, 0.0f); glVertex3f(-100, -100, 100);
		glEnd();

		glBindTexture(GL_TEXTURE_2D, texture[4]);//right
		glBegin(GL_QUADS);
		glTexCoord2f(1.0f, 0.0f); glVertex3f(100, -100, -100);
		glTexCoord2f(1.0f, 1.0f); glVertex3f(100, 100, -100);
		glTexCoord2f(0.0f, 1.0f); glVertex3f(100, 100, 100);
		glTexCoord2f(0.0f, 0.0f); glVertex3f(100, -100, 100);
		glEnd();

		glBindTexture(GL_TEXTURE_2D, texture[5]);//left
		glBegin(GL_QUADS);
		glTexCoord2f(0.0f, 0.0f); glVertex3f(-100, -100, -100);
		glTexCoord2f(1.0f, 0.0f); glVertex3f(-100, -100, 100);
		glTexCoord2f(1.0f, 1.0f); glVertex3f(-100, 100, 100);
		glTexCoord2f(0.0f, 1.0f); glVertex3f(-100, 100, -100);
		glEnd();
		glFlush();
		glutSwapBuffers();
	//glutWireSphere(100, 16, 16);
		//LoadGLTextures();
		//for (int i = 0; i < 6; i++) {
		//	glClear(GL_COLOR_BUFFER_BIT);
		//	//printf("5\n");
		//	if (i <= 1) {
		//		printf("6\n");
		//		glBindTexture(GL_TEXTURE_2D, texture[i]);//绑定
		//		glBegin(GL_QUADS);//平面四边形
		//		glTexCoord2f(0, 0);//z=+-100的面
		//		glVertex3f(-100, -100, pow(-1, i) * 100);
		//		glTexCoord2f(1, 0);
		//		glVertex3f(100, -100, pow(-1, i) * 100);
		//		glTexCoord2f(1, 1);
		//		glVertex3f(100, 100, pow(-1, i) * 100);
		//		glTexCoord2f(0, 1);
		//		glVertex3f(-100, 100, pow(-1, i) * 100);
		//		glEnd();
		//		//glFlush();
		//		//glutSwapBuffers();//在双缓冲窗口系统中交换前缓冲区和后缓冲区
		//	}
		//	else if (i > 1 && i <= 3) {
		//		glBindTexture(GL_TEXTURE_2D, texture[i]);
		//		printf("7\n");
		//		glBegin(GL_QUADS);//平面四边形
		//		glTexCoord2f(1, 0);//x=100的面
		//		glVertex3f(pow(-1, i) * 100, -100, 100);
		//		glTexCoord2f(0, 0);//
		//		glVertex3f(pow(-1, i) * 100, -100, -100);
		//		glTexCoord2f(1, 1);
		//		glVertex3f(pow(-1, i) * 100, 100, -100);
		//		glTexCoord2f(0, 1);
		//		glVertex3f(pow(-1, i) * 100, 100, 100);

		//		glEnd();
		//		//glFlush();
		//		//glutSwapBuffers();//在双缓冲窗口系统中交换前缓冲区和后缓冲区
		//	}
		//	else if (i > 3 && i <= 5) {
		//		glBindTexture(GL_TEXTURE_2D, texture[i]);
		//		printf("8\n");
		//		glBegin(GL_QUADS);//平面四边形
		//		glTexCoord2f(1, 0);//y=100的面
		//		glVertex3f(-100, 100, pow(-1, i) * 100);
		//		glTexCoord2f(0, 0);//
		//		glVertex3f(-100, -100, pow(-1, i) * 100);
		//		glTexCoord2f(1, 1);
		//		glVertex3f(100, -100, pow(-1, i) * 100);
		//		glTexCoord2f(0, 1);
		//		glVertex3f(100, 100, pow(-1, i) * 100);

		//		glEnd();
		//		//glFlush();
		//		//glutSwapBuffers();//在双缓冲窗口系统中交换前缓冲区和后缓冲区
		//	}
		//	//在双缓冲窗口系统中交换前缓冲区和后缓冲区
		//}
		//glFlush();
		//glutSwapBuffers();
	}
	else if (yourselect == 2) {
		//glClear(GL_COLOR_BUFFER_BIT);
		
		Loadfunctt();//函数纹理
		glutSolidTeapot(200);
		//glutWireCube(200);
		
		glutSwapBuffers();
	}
	else if (yourselect == 3) {
		exit('End');
		
	}
//		glScalef(1.5*k, 1.5*k, 1.5*k);
//		glutWireSphere(100, 16, 16);
//		glRotatef(10*k, 0.0, 0.0, 1.0);
		
	//printf("9\n");

}
void idle()
{
	rot += 1;
	glutPostRedisplay();//
	Sleep(50);
}
void menu(int menultem) {
	yourselect = menultem;
	glutPostRedisplay();
}

int main(int argc, char* argv[])
{
	glutInit(&argc, argv);

	// 在这里设置双缓冲区。        
	glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
	glutInitWindowPosition(100, 100);
	glutInitWindowSize(600, 600);
	glutCreateWindow("TEXTURE");
	//glutMouseFunc(myMouse);
	Init();
	int menuld = glutCreateMenu(menu);
	glutAddMenuEntry("picture_grain", 1);
	glutAddMenuEntry("functon_grain", 2);
	glutAddMenuEntry("End", 3);
	glutAttachMenu(GLUT_RIGHT_BUTTON);
	
	
	//glutIdleFunc(RenderScene);
	glutDisplayFunc(myDisplay);
	glutReshapeFunc(Reshape);

	glutIdleFunc(idle);
	glutMainLoop();//
	return 0;
}

结果展示:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值