`
tiankefeng0520
  • 浏览: 145725 次
  • 性别: 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纹理图opengl纹理图opengl纹理图

    OpenGL纹理图是计算机图形学中的一个关键概念,用于在3D场景中添加视觉细节和真实感。OpenGL(Open Graphics Library)是一种跨语言、跨平台的编程接口,它允许程序员高效地绘制复杂的3D图形和图像。纹理图是OpenGL...

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

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

    OpenGL中纹理应用

    总的来说,OpenGL中的纹理应用是通过创建纹理对象、设置纹理坐标、加载图像数据以及在着色器中采样来实现的。通过熟练掌握这些技术,开发者可以创造出具有高度真实感和视觉吸引力的3D场景。在地球映射到茶壶的例子中...

    openGL学习

    GLAD是一个自动生成OpenGL函数加载代码的工具,可以简化OpenGl函数的获取过程。 **3.5.1 设置GLAD** 设置GLAD包括以下步骤: - 下载并安装GLAD。 - 配置GLAD生成所需的头文件和源文件。 - 将生成的文件包含到项目...

    opengl纹理映射(下)

    在OpenGL中,可以通过glTexGen()函数为纹理生成自动生成的纹理坐标。它是一种自动化的技术,可以按照一定的方式计算出纹理坐标,从而减轻程序员的工作负担。 环境映射(Environment Mapping)是一种特殊的纹理映射...

    opengl纹理贴图源码

    在绘制过程中,OpenGL会自动将纹理坐标与纹理对象结合,完成纹理贴图。 7. **清理资源**:完成渲染后,记得解除纹理绑定并删除纹理对象,以释放GPU资源。 在提供的`Win32Program-VA-Texture`文件中,应该包含了一...

    OpenGL纹理映射

    ### OpenGL纹理映射详解 #### 一、简介 OpenGL 是一种用于渲染 2D 和 3D 图形的标准规范,广泛应用于游戏开发、虚拟现实、科学可视化等领域。纹理映射是 OpenGL 中的一项关键技术,它允许将图像(纹理)贴附在 3D ...

    c语言中使用opengl 贴纹理

    在绘制物体时,使用`glEnable`开启纹理坐标传递,并调用`glTexCoord2f`指定每个顶点的纹理坐标。然后,使用`glDrawArrays`或`glDrawElements`绘制物体,OpenGL会自动完成纹理映射。 在`8textureex1`这个示例中,...

    opengl基本框架带纹理映射

    5. 在着色器中应用纹理:在顶点着色器中定义纹理坐标,片段着色器中采样纹理并计算颜色。 三、OpenGL着色器 GLSL着色器是运行在GPU上的小程序,分为顶点着色器和片段着色器: 1. 顶点着色器:处理每个顶点,计算其...

    OpenGL球体绘制与球体贴图

    5. 绘制球体:在绘制球体时,同时传递顶点坐标和纹理坐标,OpenGL会自动将纹理应用到球体表面。 在实际编程中,我们可能还需要考虑光照、投影和视口变换等问题,以获得更好的视觉效果。光照模型控制着物体表面如何...

    基于OpengL的环境纹理映射实现

    顶点着色器通常会处理位置和纹理坐标,而片段着色器则会根据纹理坐标从环境贴图中采样颜色,并将其应用到像素上。 5. **设置着色器**:使用`glUseProgram`激活着色器程序,并通过`glUniform`传递必要的 uniforms,...

    opengl给旋转的立方体和球体赋予纹理贴图

    1. **加载纹理**:使用库如SOIL或stb_image等加载图像文件,生成OpenGL纹理对象。这个过程包括读取图像数据,分配纹理ID,并设置纹理参数,如过滤模式(minification和magnification filter)和包裹模式(wrapping ...

    opengl实现平移缩放旋转消隐纹理

    OpenGL是计算机图形学中的一种广泛应用的编程接口,用于在各种操作系统和硬件上生成二维和三维图像。本项目涉及的关键知识点包括OpenGL的平移、缩放、旋转操作,以及纹理映射和消隐技术。 首先,平移、缩放和旋转是...

    opengl在MFC中实现纹理映射和平面海浪移动

    总之,这个项目为初学者提供了一个学习OpenGL纹理映射和动态效果的良好起点。通过这个实践,你可以逐步掌握如何在Windows环境下结合MFC进行图形编程,并为未来的三维建模和动画制作打下坚实的基础。同时,与其他爱好...

    qt opengl mipmap纹理

    5. 生成Mipmaps:使用`glGenerateMipmap()`函数自动生成所有缺失的mipmap级别。这是一个方便的函数,可以省去手动创建每个级别的麻烦。 6. 绑定纹理到几何对象:将纹理绑定到OpenGL顶点着色器中定义的纹理坐标,...

    opengl 纹理贴图

    OpenGL会自动根据纹理坐标和已绑定的纹理进行贴图。 在你的例子中,"纹理显示文字"可能是指将文字作为纹理映射到一个四边形面片上。这通常涉及到创建一个包含文字的BMP图像,然后按照上述步骤进行纹理处理。也可以...

    opengl纹理映射

    OpenGL的`glGenerateMipmap()`函数可以自动生成MIP贴图。 总结,OpenGL纹理映射是3D图形渲染的关键技术,它使得我们在六面体或其他3D模型上实现复杂的视觉效果成为可能。通过对纹理的加载、坐标设置、绑定以及各种...

    opengles for android 纹理

    2. **纹理坐标**:每个顶点需要一个对应的纹理坐标,以确定纹理应该如何覆盖在3D模型上。纹理坐标在[0,1]范围内,(0,0)表示纹理左下角,(1,1)表示右上角。 3. **纹理过滤**:为了处理纹理缩放或拉伸时的像素化问题...

Global site tag (gtag.js) - Google Analytics