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

OpenGL学习十六:纹理绑定

 
阅读更多

前面介绍的都是给图元添加颜色,纹理绑定介绍的是如果把图片绑定到图元,主要步骤如下:(这里这是简单介绍,后续详细说明)

1.生成纹理ID
glGenTextures(1, &texture[0]);
2.创建纹理对象
glBindTexture(GL_TEXTURE_*D, texture[0]);
3.指定纹理内容
glTexImage*D();
4.指定纹理属性
glTexParameteri(…, ......, …)
5.激活纹理功能
glBindTexture(GL_TEXTURE_*D, texture[0]);
6.提供纹理坐标
glTexCoord*()

 

技巧:纹理贴图以逆时针方式进行:
1.左下(0,0)
2.右下(1,0)
3.左上 (0,1)
4.右上(1,1)

#include "header.h"

GLfloat	xrot;				
GLfloat	yrot;				
GLfloat	zrot;				

GLuint	texture[1];			

AUX_RGBImageRec *LoadBMP(char *Filename)			
{
	FILE *File=NULL;									

	if (!Filename)										
	{
		return NULL;								
	}

	File=fopen(Filename,"r");							

	if (File)											
	{
		fclose(File);									
		return auxDIBImageLoad(Filename);				
	}

	return NULL;										
}

int LoadGLTextures()							
{
	int Status=FALSE;									

	AUX_RGBImageRec *TextureImage[1];					

	memset(TextureImage,0,sizeof(void *)*1);           


	if (TextureImage[0]=LoadBMP("Data/NeHe.bmp"))
	{
		Status=TRUE;									

		glGenTextures(1, &texture[0]);				

		
		glBindTexture(GL_TEXTURE_2D, texture[0]);
		glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);
		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
	}

	if (TextureImage[0])									
	{
		if (TextureImage[0]->data)						
		{
			free(TextureImage[0]->data);					
		}

		free(TextureImage[0]);						
	}

	return Status;									
}

void ReSizeGLScene(GLsizei width, GLsizei height)		
{
	if (height==0)										
	{
		height=1;									
	}

	glViewport(0,0,width,height);					

	glMatrixMode(GL_PROJECTION);						
	glLoadIdentity();									

	
	gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);

	glMatrixMode(GL_MODELVIEW);							
	glLoadIdentity();								
}

int InitGL(void)										
{
	if (!LoadGLTextures())							
	{
		return FALSE;									
	}

	glEnable(GL_TEXTURE_2D);							
	glShadeModel(GL_SMOOTH);							
	glClearColor(0.0f, 0.0f, 0.0f, 0.5f);				
	glClearDepth(1.0f);									
	glEnable(GL_DEPTH_TEST);							
	glDepthFunc(GL_LEQUAL);								
	glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);	
	return TRUE;										
}

void DrawGLScene(void)									
{
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);	
	glLoadIdentity();									
	glTranslatef(0.0f,0.0f,-5.0f);

	glRotatef(xrot,1.0f,0.0f,0.0f);
	glRotatef(yrot,0.0f,1.0f,0.0f);
	glRotatef(zrot,0.0f,0.0f,1.0f);

	glBindTexture(GL_TEXTURE_2D, texture[0]);

	glBegin(GL_QUADS);
		// Front Face
		glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);
		glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);
		glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f,  1.0f);
		glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f,  1.0f);
		// Back Face
		glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
		glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);
		glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);
		glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
		// Top Face
		glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);
		glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f,  1.0f,  1.0f);
		glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f,  1.0f,  1.0f);
		glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);
		// Bottom Face
		glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
		glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
		glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);
		glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);
		// Right face
		glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
		glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);
		glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f,  1.0f,  1.0f);
		glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);
		// Left Face
		glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
		glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);
		glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f,  1.0f,  1.0f);
		glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);
	glEnd();

	xrot+=0.3f;
	yrot+=0.2f;
	zrot+=0.4f;
	glFlush();
}

void rotate()
{
	xrot+=0.3f;
	yrot+=0.2f;
	zrot+=0.4f;
	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(640,480);
	glutCreateWindow("纹理绑定");
	glutReshapeFunc(ReSizeGLScene);
	glutDisplayFunc(DrawGLScene);
	glutMouseFunc(mouse);
	InitGL();
	glutMainLoop();
	return 0;
}

 

  • 大小: 18.7 KB
  • 大小: 21.6 KB
分享到:
评论

相关推荐

    opengl纹理图opengl纹理图opengl纹理图opengl纹理图

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

    opengl基本框架带纹理映射

    在“opengl基本框架带纹理映射”这个主题中,我们将深入探讨如何构建一个基本的OpenGL应用程序,并了解如何应用纹理映射来增强图形的表现力。 一、OpenGL框架构建 一个基础的OpenGL程序通常包括以下几个步骤: 1. ...

    OpenGL.rar_OPENGL 纹理_Opengl纹理_opengl添加纹理_opengl纹理贴图

    OpenGL是一种强大的图形库,用于在...总的来说,这个压缩包提供了一个学习和实践OpenGL纹理处理的好机会,涵盖了从基本概念到实际编码的全过程,对于任何想要提升OpenGL图形编程技能的人来说都是一份宝贵的学习资料。

    OPENGL_TEXTURE.zip_OPENGL 纹理_Opengl纹理_opengl 贴图_opengl贴图_贴图

    首先,我们需要了解OpenGL纹理的基本概念。纹理是由像素数据组成的二维数组,这些数据可以是颜色、透明度或其他图像属性。在OpenGL中,纹理可以被看作是存储在GPU内存中的图像,可以在渲染过程中快速访问。通过将...

    在OpenGL中,使用纹理显示图形.rar_OPENGL 纹理_Opengl纹理_纹理OpenGL

    OpenGL是一种强大的图形库,用于创建2D和3D图形,被广泛应用于游戏开发、科学可视化、工程设计等领域。在OpenGL中,纹理是图形渲染的重要组成...通过阅读和学习这些代码,你将能够更好地理解OpenGL纹理工作的全过程。

    openGL中二维纹理的生成

    本程序提供了二维纹理生成的代码示例,非常适合初学者学习和理解OpenGL的纹理操作。 首先,要生成二维纹理,你需要了解以下几个关键步骤: 1. **加载纹理图像**:通常,我们从文件中加载图像数据,如.jpg、.png或....

    openGL关于加载曲面纹理

    在OpenGL中,纹理通常以纹理对象的形式存在,它们可以通过glGenTextures函数生成,并使用glBindTexture绑定到特定的纹理目标,如GL_TEXTURE_2D表示2D纹理。 加载地球纹理,我们首先需要一个地球的图像文件,这通常...

    OpenGL纹理贴图简单例子.zip_OPENGL 纹理_opengl纹理贴图_opengl贴图_纹理贴图_贴图

    5. **纹理绑定**:在绘制模型之前,你需要将纹理对象绑定到当前的纹理单元。你可以通过`glActiveTexture`选择纹理单元,然后使用`glBindTexture`将纹理对象绑定到目标。 6. **纹理坐标着色**:在顶点着色器中,你...

    OpenGL.zip_opengl_site:www.pudn.com_四边形

    2. `glBindTexture()`:绑定纹理对象,使其成为当前操作的目标。 3. `glTexImage2D()`:加载二维图像数据到纹理对象。 4. `glTexParameter()`:设置纹理参数,如过滤方式(线性或最近邻)。 5. `glBegin()` 和 `...

    opengles多重纹理与过程纹理

    OpenGL ES(Open Graphics Library for Embedded Systems)是OpenGL的精简版本...通过研究这些资源,你可以深入学习如何在OpenGL ES环境中实现这两种纹理技术,并应用于自己的项目中,创建出更为丰富多样的3D图形效果。

    Texture_openGL.rar_OPENGL 纹理_Opengl纹理_opengl 贴图_三维纹理_三维纹理贴图

    学习和理解OpenGL纹理技术对于开发游戏、可视化软件或其他图形密集型应用至关重要。通过实践这样的示例,开发者能够更好地掌握如何在实际项目中高效地利用纹理来提升图形表现力。此外,对于三维纹理的理解,也有助于...

    openGl绘制茶壶纹理

    加载成功后,会得到一个纹理ID,然后通过`glGenTextures`和`glBindTexture`将图像数据绑定到一个纹理单元上。使用`glTexParameteri`可以设置纹理过滤模式,比如线性插值或最近邻插值。最后,通过`glTexImage2D`将...

    基于OpenGL的三维物体纹理贴图研究

    5. **绑定纹理**:使用`glBindTexture()`函数将定义好的纹理绑定到特定的纹理单元上。 6. **绘制带纹理的对象**:最后,通过调用绘制命令(如`glDrawArrays()`)来绘制带有纹理的对象。 #### 5. 总结 纹理贴图...

    OpenGL纹理技术教程

    OpenGL纹理技术是计算机图形学中的一个关键组成部分,它在创建逼真的3D场景时起着至关重要的作用。这篇教程由南京大学计算机系研究生计算机图形学方向提供,旨在深入讲解OpenGL中的纹理技术,包括理论基础、实现方法...

    opengl 三维地形 纹理映射

    这通常包括使用OpenGL的纹理对象(`glGenTextures()`)创建一个新的纹理,然后通过`glBindTexture()`绑定纹理,并使用`glTexImage2D()`加载纹理图像数据。接着,需要控制纹理参数,例如设置纹理过滤模式(`...

    OpenGL纹理贴图的实例+PPT原理介绍

    总的来说,OpenGL纹理贴图是提升3D图形质量的重要手段,通过学习和实践,可以创建出更加真实和生动的3D场景。这份"OpenGL纹理贴图的实例+PPT原理介绍"资料,对于理解和掌握这一技术将非常有帮助。通过实验第八课:...

    一个OPENGL的例程 学习素材绑定滤镜照明和雾化效果

    4. **纹理绑定**:在OpenGL中,纹理绑定是指将图像数据与特定的纹理单元关联的过程。这使得可以在3D物体表面上应用复杂的图案或图像。纹理坐标被映射到几何体的表面,从而实现真实感渲染。 5. **着色器**:OpenGL...

    OpenGL.rar_OPENGL 纹理_opengl_opengl 纹理贴图_opengl纹理贴图_镂空效果

    通过学习这些资源,开发者可以深入理解OpenGL纹理贴图和镂空效果的实现方法,并将其应用到自己的项目中。 总之,OpenGL的纹理贴图技术和镂空效果是提升3D图形表现力的重要手段。通过理解和掌握这些概念,开发者可以...

    OpenGL太阳系加纹理

    OpenGL提供了纹理坐标、纹理单元、过滤模式等概念,以实现纹理的加载、绑定和应用。 5. 鼠标交互:用户可以通过鼠标点击来控制太阳系的运动状态,比如启动或停止自转和公转。这涉及到事件处理和状态管理,通常需要...

    opengl动态纹理

    3. 创建OpenGL纹理对象:使用`glGenTextures`生成纹理ID,然后使用`glBindTexture`绑定纹理目标。 4. 设置纹理参数:例如过滤模式、包裹模式等,用`glTexParameteri`函数调整。 5. 上传纹理数据:使用`glTexImage2D`...

Global site tag (gtag.js) - Google Analytics