`
tiankefeng0520
  • 浏览: 143052 次
  • 性别: Icon_minigender_1
  • 来自: 长春
社区版块
存档分类
最新评论

OpenGL学习二十二:纹理坐标自动生成

 
阅读更多

可以让OpenGL自动生成纹理坐标,而不是使用glTexCoord*()函数显示地分配纹理坐标
void glTexGeni (GLenum coord, GLenum pname, GLint param);

 

 

coord pname param
{GL_S,GL_T}或{GL_R,GL_Q} GL_TEXTURE_GEN_MODE GL_OBJECT_LINEAR
GL_EYE_LINEAR
GL_SPHERE_MAP
GL_NORMAL_MAP
GL_REFLECTION_MAP
  GL_OBJECT_PLANE 浮点型数值
  GL_EYE_PLANE 浮点型数值

 

GL_OBJECT_LINEAR:物体模式,纹理会跟随物体的转动而转动(左图)
GL_EYE_LINEAR:视觉模式,纹理部会跟随物体的转动而转动,始终保持原状(右图)

         

 

GL_SPHERE_MAP:环境纹理(球体贴图)具有很好的反射效果
GL_REFLECTION_MAP:环境纹理(反射纹理)可替换GL_SPHERE_MAP
GL_NORMAL_MAP:常用于立方体贴图,或者散射与反射的场景

 

              

      GL_NORMAL_MAP球体贴图                          GL_REFLECTION_MAP球体贴图

 

纹理贴图做法
1设置纹理环绕模式
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
2.设置纹理生成模式
 glTexGeni(GL_S,GL_TEXTURE_GEN_MODE,GL_OBJECT_LINEAR);
 glTexGeni(GL_T,GL_TEXTURE_GEN_MODE,GL_OBJECT_LINEAR);
3.启用自动生成纹理
 glEnable(GL_TEXTURE_GEN_S);
 glEnable(GL_TEXTURE_GEN_T);

 

立方图纹理
立方图纹理是一种比较特殊的纹理技术,它用6幅二维图像构成一个以原点为中心的纹理立方体,对于每个片段,纹理坐标(S,T,R)被当做方向向量看待,每个纹理单元都表示从原点所看到的纹理立方体上的图像
可以调用glTexImage2D函数6次,分别使用他target参数表示立方体的各个面(+X,-X,+Y,-Y,+Z,-Z)从而创建一个立方体

glTexParameteri(GL_TEXTURE_CUBE_MAP_EXT, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT, 0, GL_RGBA, imageSize,
imageSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, image1);
glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT, 0, GL_RGBA, imageSize,
imageSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, image4);
glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT, 0, GL_RGBA, imageSize,
imageSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, image2);
glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT, 0, GL_RGBA, imageSize,
imageSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, image5);
glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT, 0, GL_RGBA, imageSize,
imageSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, image3);
glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT, 0, GL_RGBA, imageSize,
imageSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, image6);
glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP_EXT);
glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP_EXT);
glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP_EXT);

 

 

#include "header.h"
#define	stripeImageWidth 16
#define	checkImageWidth 16
#define	checkImageHeight 16
#define	imageSize 4
static GLubyte image1[imageSize][imageSize][4];
static GLubyte image2[imageSize][imageSize][4];
static GLubyte image3[imageSize][imageSize][4];
static GLubyte image4[imageSize][imageSize][4];
static GLubyte image5[imageSize][imageSize][4];
static GLubyte image6[imageSize][imageSize][4];
static GLubyte checkImage[checkImageWidth][checkImageHeight][4];
static GLubyte stripeImage[4*stripeImageWidth];
static GLuint texName;


static GLfloat xequalzero[] = {1.0, 0.0, 0.0, 0.0};
static GLfloat slanted[] = {1.0, 1.0, 1.0, 0.0};
static GLfloat *currentCoeff;
static GLenum currentPlane;
static GLint currentGenMode;
double angle=0.0;

enum Shape
{
	CUBE,
	SPHERE,
	TEAPOT,
	CONE
}shape;
shape=TEAPOT;
void makeImage()
{
	int i,j,c;
	for ( i=0;i<checkImageWidth;i++)
	{
		for (j = 0; j < checkImageHeight; j++)
		{
			if(j%4==0)
			{
				checkImage[i][j][0]=0;
				checkImage[i][j][1]=255;
				checkImage[i][j][2]=0;
				checkImage[i][j][3]=255;;
				j++;
				if(j>=checkImageHeight)
				{
					break;
				}
				checkImage[i][j][0]=0;
				checkImage[i][j][1]=255;
				checkImage[i][j][2]=0;
				checkImage[i][j][3]=255;;

			}else
			{
				checkImage[i][j][0]=255;
				checkImage[i][j][1]=0;
				checkImage[i][j][2]=0;
				checkImage[i][j][3]=255;
			}

		}
	}
	for (i = 0; i < imageSize; i++) {
		for (j = 0; j < imageSize; j++) {
			//c = ((((i&0x1)==0)^((j&0x1))==0))*255;
			image1[i][j][0] = (GLubyte) 255;
			image1[i][j][1] = (GLubyte) 0;
			image1[i][j][2] = (GLubyte) 0;
			image1[i][j][3] = (GLubyte) 255;

			image2[i][j][0] = (GLubyte) 0;
			image2[i][j][1] = (GLubyte) 255;
			image2[i][j][2] = (GLubyte) 0;
			image2[i][j][3] = (GLubyte) 255;

			image3[i][j][0] = (GLubyte) 0;
			image3[i][j][1] = (GLubyte) 0;
			image3[i][j][2] = (GLubyte) 255;
			image3[i][j][3] = (GLubyte) 255;

			image4[i][j][0] = (GLubyte) 255;
			image4[i][j][1] = (GLubyte) 255;
			image4[i][j][2] = (GLubyte) 0;
			image4[i][j][3] = (GLubyte) 255;

			image5[i][j][0] = (GLubyte) 255;
			image5[i][j][1] = (GLubyte) 0;
			image5[i][j][2] = (GLubyte) 255;
			image5[i][j][3] = (GLubyte) 255;

			image6[i][j][0] = (GLubyte) 0;
			image6[i][j][1] = (GLubyte) 255;
			image6[i][j][2] = (GLubyte) 255;
			image6[i][j][3] = (GLubyte) 255;
		}
	}
}

void display(void)
{
	glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
	glLoadIdentity();


		//glRotated(-90,1,0,0);
	glRotated(angle,0,1,1);


	glDisable(GL_TEXTURE_2D);
	glDisable(GL_TEXTURE_CUBE_MAP_EXT);
	glBindTexture(GL_TEXTURE_2D,texName);
	if(shape==TEAPOT)
	{
		glEnable(GL_TEXTURE_2D);  
		glutSolidTeapot(100);
	}else if(shape==SPHERE)
	{
		glEnable(GL_TEXTURE_2D);  
		glutSolidSphere(100,50,32);
	}else if(shape==CUBE)
	{
		glEnable(GL_TEXTURE_CUBE_MAP_EXT);  
		glutSolidCube(100);
	
	}else if(shape==CONE)
	{
		glEnable(GL_TEXTURE_2D); 
		glutWireCone(200,200,16,16);

	}
	glutSwapBuffers();
	glFlush();

}

void init()
{
	makeImage();
	glClearColor(0,0,0,0);
	glClearDepth(1.0);
	
	glEnable(GL_DEPTH_TEST);					
	glDepthFunc(GL_LEQUAL);	
	glShadeModel(GL_SMOOTH);

	glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

	glEnable(GL_TEXTURE_GEN_S);
	glEnable(GL_TEXTURE_GEN_T);

	glEnable(GL_LIGHTING);
	glEnable(GL_LIGHT0);

	glGenTextures(1,&texName);
	glBindTexture(GL_TEXTURE_2D,texName);

	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, checkImageWidth, checkImageHeight,0,GL_RGBA, GL_UNSIGNED_BYTE, checkImage);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
	glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
	glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
	glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
	glTexGeni(GL_S,GL_TEXTURE_GEN_MODE,GL_OBJECT_LINEAR);
	glTexGeni(GL_T,GL_TEXTURE_GEN_MODE,GL_OBJECT_LINEAR);





}
void reshape(int w, int h)
{
	glViewport(0, 0, (GLsizei) w, (GLsizei) h);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();

	glOrtho(-400,400,-300,300,-1000,1000);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
}

void keyboard(unsigned char key,int x,int y)
{
	switch (key)
	{
	case 't':
		shape=TEAPOT;
		//glTexGeni(GL_S,GL_TEXTURE_GEN_MODE,GL_OBJECT_LINEAR);
		//glTexGeni(GL_T,GL_TEXTURE_GEN_MODE,GL_OBJECT_LINEAR);
		glutPostRedisplay();
		break;
	case 's':
		shape=SPHERE;
		glTexGeni(GL_S,GL_TEXTURE_GEN_MODE,GL_SPHERE_MAP);
		glTexGeni(GL_T,GL_TEXTURE_GEN_MODE,GL_SPHERE_MAP);
		glutPostRedisplay();
		break;
	case 'c':
		shape=CUBE;


		glTexParameteri(GL_TEXTURE_CUBE_MAP_EXT, GL_TEXTURE_WRAP_S, GL_REPEAT);
		glTexParameteri(GL_TEXTURE_CUBE_MAP_EXT, GL_TEXTURE_WRAP_T, GL_REPEAT);
		glTexParameteri(GL_TEXTURE_CUBE_MAP_EXT, GL_TEXTURE_WRAP_R, GL_REPEAT);
		glTexParameteri(GL_TEXTURE_CUBE_MAP_EXT, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
		glTexParameteri(GL_TEXTURE_CUBE_MAP_EXT, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
		glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT, 0, GL_RGBA, imageSize, 
			imageSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, image1);
		glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT, 0, GL_RGBA, imageSize, 
			imageSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, image4);
		glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT, 0, GL_RGBA, imageSize,
			imageSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, image2);
		glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT, 0, GL_RGBA, imageSize,
			imageSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, image5);
		glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT, 0, GL_RGBA, imageSize,
			imageSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, image3);
		glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT, 0, GL_RGBA, imageSize,
			imageSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, image6);
		glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP_EXT);
		glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP_EXT);
		glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP_EXT); 
		glEnable(GL_TEXTURE_GEN_S);
		glEnable(GL_TEXTURE_GEN_T);
		glEnable(GL_TEXTURE_GEN_R);

		//glTexGeni(GL_S,GL_TEXTURE_GEN_MODE,GL_SPHERE_MAP);
		//glTexGeni(GL_T,GL_TEXTURE_GEN_MODE,GL_SPHERE_MAP);

	
		glutPostRedisplay();
		break;
	case 'n':

		shape=CONE;
		//glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);

		//glTexGeni(GL_T,GL_TEXTURE_GEN_MODE,GL_OBJECT_LINEAR);

		glutPostRedisplay();
		break;
	case 'e':
		glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);

		glTexGeni(GL_T,GL_TEXTURE_GEN_MODE,GL_EYE_LINEAR);

		glutPostRedisplay();
		break;
	case 'o':
		glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);

		glTexGeni(GL_T,GL_TEXTURE_GEN_MODE,GL_OBJECT_LINEAR);

		glutPostRedisplay();
		break;
	}
	

}
void rotate()
{
	angle+=0.1;
	glutPostRedisplay();
}
void mouse(int button,int state,int x,int y)
{ 
	switch(button)
	{
	  case GLUT_LEFT_BUTTON:
		  if(GLUT_DOWN==state)
		  {
			  glutIdleFunc(rotate);
		  }
		  break;
	  case GLUT_RIGHT_BUTTON:
		  if(GLUT_DOWN==state)
		  {
			  glutIdleFunc(0);
		  }
		  break;
	}
}

int main(int argc,char **argv)
{
	glutInit(&argc,argv);
	glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB|GLUT_DEPTH);
	glutInitWindowSize(800,600);
	glutInitWindowPosition(100,100);
	glutCreateWindow("纹理坐标自动生成");
	glewInit();
	init();
	glutDisplayFunc(display);
	glutKeyboardFunc(keyboard);
    glutReshapeFunc(reshape);
 	glutMouseFunc(mouse);
	glutMainLoop();
}

 

 

 

  • 大小: 9.5 KB
  • 大小: 8.2 KB
  • 大小: 8.5 KB
  • 大小: 10 KB
  • 大小: 4.4 KB
分享到:
评论

相关推荐

    纹理坐标自动产生

    opengl 纹理坐标自动产生 自动产生纹理坐标 标准opengl

    自动生成纹理坐标的小茶壶

    自动生成纹理坐标的小茶壶,由VC++6.0 opengl完成的

    计算机图形学 OpenGL实验源码+实验文档

    实验一 OpenGL+GLUT开发平台搭建 5 小实验1: 开发环境设置 5 小实验2: 控制窗口位置和大小 6 小实验3:默认的可视化范围 6 小实验4:自定义可视化...小实验14:纹理映射—纹理坐标的自动生成(基于参考面距离) 61

    OpenGL基础图形编程

     第十二章 OpenGL纹理  12.1 基本步骤  12.2 纹理定义  12.3 纹理控制  12.3.1 滤波  12.3.2 重复与约简  12.4 映射方式  12.5 纹理坐标  12.5.1 坐标定义  12.5.2 坐标自动产生  第十三章 OpenGL复杂...

    opengl期末复习

    纹理坐标和纹理都可以通过程序计算出来,自动生成纹理的原理是什么?6、.帧缓存有几种,什么叫片元。片元的测试和操作有哪些?7. 采用GPU编程,请说明Vertex Shader 和 Fragment Shader 的输入输出坐标系是什么? ...

    OpenGL 基础教程

     第十二章 OpenGL纹理  12.1 基本步骤  12.2 纹理定义  12.3 纹理控制  12.3.1 滤波  12.3.2 重复与约简  12.4 映射方式  12.5 纹理坐标  12.5.1 坐标定义  12.5.2 坐标自动产生  第十三章 OpenGL复杂...

    OpenGL图形开发指南(0fen)

    12.2 纹理定义 12.3 纹理控制 12.3.1 滤波 12.3.2 重复与约简 12.4 映射方式 12.5 纹理坐标 12.5.1 坐标定义 12.5.2 坐标自动产生 第十三章 OpenGL复杂物体建模 13.1 图元扩展 13.1.1 点和线 13.1.2 ...

    opengl 期末复习资料

    纹理坐标和纹理都可以通过程序计算出来,自动生成纹理的原理是什么? 第10章 帧缓存有几种,什么叫片元,片元的测试和操作有哪些? 明白stencilbuffer的使用。 用stencilbuffer编程实现一个功能。 5、 采用GPU...

    实战OpenGL三维可视化系统开发与源码精解.part09

     第8章 主要对线路方案的主要参数设计方法和程序实现、设计交点信息输入实现、线路中心线定位方法、设计方案的保存、平面方案的自动生成和程序设计、纵断面设计模块的实现、边坡模型的生成算法、线路路基三维建模...

    实战OpenGL三维可视化系统开发与源码精解.part07.rar

     第8章 主要对线路方案的主要参数设计方法和程序实现、设计交点信息输入实现、线路中心线定位方法、设计方案的保存、平面方案的自动生成和程序设计、纵断面设计模块的实现、边坡模型的生成算法、线路路基三维建模...

    实战OpenGL三维可视化系统开发与源码精解.part08

     第8章 主要对线路方案的主要参数设计方法和程序实现、设计交点信息输入实现、线路中心线定位方法、设计方案的保存、平面方案的自动生成和程序设计、纵断面设计模块的实现、边坡模型的生成算法、线路路基三维建模...

    实战OpenGL三维可视化系统开发与源码精解.part10

     第8章 主要对线路方案的主要参数设计方法和程序实现、设计交点信息输入实现、线路中心线定位方法、设计方案的保存、平面方案的自动生成和程序设计、纵断面设计模块的实现、边坡模型的生成算法、线路路基三维建模...

    实战OpenGL三维可视化系统开发与源码精解.part01.rar

     第8章 主要对线路方案的主要参数设计方法和程序实现、设计交点信息输入实现、线路中心线定位方法、设计方案的保存、平面方案的自动生成和程序设计、纵断面设计模块的实现、边坡模型的生成算法、线路路基三维建模...

    实战OpenGL三维可视化系统开发与源码精解.part02.rar

     第8章 主要对线路方案的主要参数设计方法和程序实现、设计交点信息输入实现、线路中心线定位方法、设计方案的保存、平面方案的自动生成和程序设计、纵断面设计模块的实现、边坡模型的生成算法、线路路基三维建模...

    OpenGLMFCSDI

    个人所写OpenGL在MFC下开发的框架,OpenGL配置、初始化、场景管理都封装在Scene类里面,用了索引顶点,显示列表,自动纹理坐标生成,光照,旋转重绘。茶壶,立方体,四面体,八面体,十二面体,球体,还在程序启动时...

    实战OpenGL三维可视化系统开发与源码精解.part03.rar

     第8章 主要对线路方案的主要参数设计方法和程序实现、设计交点信息输入实现、线路中心线定位方法、设计方案的保存、平面方案的自动生成和程序设计、纵断面设计模块的实现、边坡模型的生成算法、线路路基三维建模...

    实战OpenGL三维可视化系统开发与源码精解.part05.rar

     第8章 主要对线路方案的主要参数设计方法和程序实现、设计交点信息输入实现、线路中心线定位方法、设计方案的保存、平面方案的自动生成和程序设计、纵断面设计模块的实现、边坡模型的生成算法、线路路基三维建模...

    实战OpenGL三维可视化系统开发与源码精解.part06.rar

     第8章 主要对线路方案的主要参数设计方法和程序实现、设计交点信息输入实现、线路中心线定位方法、设计方案的保存、平面方案的自动生成和程序设计、纵断面设计模块的实现、边坡模型的生成算法、线路路基三维建模...

    实战OpenGL三维可视化系统开发与源码精解.part04.rar

     第8章 主要对线路方案的主要参数设计方法和程序实现、设计交点信息输入实现、线路中心线定位方法、设计方案的保存、平面方案的自动生成和程序设计、纵断面设计模块的实现、边坡模型的生成算法、线路路基三维建模...

Global site tag (gtag.js) - Google Analytics