OpenGL光照纹理

这篇文章介绍了如何使用OpenGL编程语言在3D环境中创建一个具有多光源和多实体的模型,并展示了如何初始化材质、灯光和纹理,以实现逼真的光照效果。

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

绘制多光源、多实体的三维光照模型;

#include<windows.h>
#include <iostream>
#include <cmath>
#include<stdlib.h>
#include<gl/glut.h>
#include<stdio.h>
#include<math.h> //X86
#include<glaux.h>
#pragma comment(lib, "glaux")
using namespace std;
#define Width 32
#define Height 32
GLubyte texImage[Height][Width][3];

float rot = 0;
GLuint texture2[1];
int yourselect;
GLint dx = 0;
GLint dy = 0;

//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);//开启纹理

	glDepthFunc(GL_LEQUAL);
	glEnable(GL_DEPTH_TEST);
	glShadeModel(GL_SMOOTH);
}

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 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 InitMaterial() {//设置物体表面属性
	//cout<< "InitMaterial"<<endl;
	float mat_ambient[] = { 0.135000, 0.222500, 0.157500, 0.95000};
	float mat_diffuse[] = { 0.540000, 0.890000, 0.630000, 0.950000 };
	float mat_specular[] = { 0.316228, 0.316228, 0.316228, 0.950000 };
	float mat_shininess[] = { 12.800000};
	//face应用在哪个面,pname说明材质,param材质指针
	glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, mat_ambient);//环境光
	glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mat_diffuse);//漫反射
	glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_specular);//镜面反射率
	glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, mat_shininess);//镜面反射指数
	//glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, mat_shininess);
}
void InitLight() {
	//cout << "InitLight" << endl;
	float lig_pstion0[] = { 600,0,0,0 };
	glLightfv(GL_LIGHT0, GL_POSITION,lig_pstion0);
	
	float lig_pstion1[] = { -600,0,0,0 };
	GLfloat lig_ambient[] = { 0.247250, 0.224500, 0.064500, 1.000000 };
	GLfloat lig_diffuse1[] = { 0.346150, 0.314300, 0.090300, 1.000000 };
	GLfloat lig_specular1[] = { 0.797357, 0.723991, 0.208006, 1.000000 };
	GLfloat lig_shininess[] = { 83.199997 };

	glLightfv(GL_LIGHT1, GL_POSITION, lig_pstion1);
	glLightfv(GL_LIGHT1, GL_DIFFUSE, lig_diffuse1);
	glLightfv(GL_LIGHT1, GL_SPECULAR, lig_specular1);
	glLightfv(GL_LIGHT1, GL_AMBIENT, lig_ambient);
	glLightfv(GL_LIGHT1, GL_SHININESS, lig_shininess);
	
	glEnable(GL_LIGHTING);
	glEnable(GL_LIGHT0);
	glEnable(GL_LIGHT1);
}
void myDisplay()
{
	//glClear(GL_COLOR_BUFFER_BIT);
	glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
	
	
	//glutSolidSphere(100, 64, 64);
	glLoadIdentity();
	glRotatef(rot, 1, 0, 0);
	glRotatef(rot, 0, 1, 0);
	glRotatef(rot, 0, 0, 1);
	Sleep(10);
	if (yourselect == 1) {

		//函数纹理
		InitLight();
		InitMaterial();
		//Loadfunctt();
		glutSolidTeapot(200);

		glutSwapBuffers();
	}
	else if (yourselect == 2){
		exit('End');
	}
	glFlush();
	
}
void idle()
{
	rot += 1;
	glutPostRedisplay();//
	Sleep(50);
}
//void mouse(GLint button,GLint state,GLint x,GLint y) {
//	if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) {
//		dx = x;
//		dy = 600 - y;
//		glutPostRedisplay();
//	}
//}
//void keyboard(unsigned char key, int x=0, int y=0) {
//	save = countf;
//	switch (key) {
//	case'S':
//	case's':
//		x += dx;
//		break;
//	case'Z':
//	case'z':
//		break;
//	case'X':
//	case'x':
//		break;
//	}
//	glutPostRedisplay();
//}
void menu(int menultem) {
	yourselect = menultem;
	glutPostRedisplay();
}
int main(int argc, char* argv[])
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE | GLUT_DEPTH);     
	//glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
	//glutInitDisplayMode(AUX_SINGLE | AUX_RGBA|AUX_DEPTH);//设置窗口的显示模式,单缓冲模式,rgb颜色模式,深度缓存模式
	glutInitWindowPosition(100, 100);
	glutInitWindowSize(600, 600);
	glutCreateWindow("Light");

	//glutMouseFunc(mouse);//鼠标
	//glutKeyboardFunc(keyboard);

	int menuld = glutCreateMenu(menu);//菜单
	glutAddMenuEntry("动感茶壶", 1);
	//glutAddMenuEntry("functon_grain", 2);
	glutAddMenuEntry("End",2);
	glutAttachMenu(GLUT_RIGHT_BUTTON);

	Init();
	/*InitMaterial();
	InitLight();*/
	//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、付费专栏及课程。

余额充值