前面介绍的都是给图元添加颜色,纹理绑定介绍的是如果把图片绑定到图元,主要步骤如下:(这里这是简单介绍,后续详细说明)
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; }
相关推荐
在“opengl基本框架带纹理映射”这个主题中,我们将深入探讨如何构建一个基本的OpenGL应用程序,并了解如何应用纹理映射来增强图形的表现力。 一、OpenGL框架构建 一个基础的OpenGL程序通常包括以下几个步骤: 1. ...
OpenGL是一种强大的图形库,用于在...总的来说,这个压缩包提供了一个学习和实践OpenGL纹理处理的好机会,涵盖了从基本概念到实际编码的全过程,对于任何想要提升OpenGL图形编程技能的人来说都是一份宝贵的学习资料。
首先,我们需要了解OpenGL纹理的基本概念。纹理是由像素数据组成的二维数组,这些数据可以是颜色、透明度或其他图像属性。在OpenGL中,纹理可以被看作是存储在GPU内存中的图像,可以在渲染过程中快速访问。通过将...
OpenGL是一种强大的图形库,用于创建2D和3D图形,被广泛应用于游戏开发、科学可视化、工程设计等领域。在OpenGL中,纹理是图形渲染的重要组成...通过阅读和学习这些代码,你将能够更好地理解OpenGL纹理工作的全过程。
本程序提供了二维纹理生成的代码示例,非常适合初学者学习和理解OpenGL的纹理操作。 首先,要生成二维纹理,你需要了解以下几个关键步骤: 1. **加载纹理图像**:通常,我们从文件中加载图像数据,如.jpg、.png或....
5. **纹理绑定**:在绘制模型之前,你需要将纹理对象绑定到当前的纹理单元。你可以通过`glActiveTexture`选择纹理单元,然后使用`glBindTexture`将纹理对象绑定到目标。 6. **纹理坐标着色**:在顶点着色器中,你...
2. `glBindTexture()`:绑定纹理对象,使其成为当前操作的目标。 3. `glTexImage2D()`:加载二维图像数据到纹理对象。 4. `glTexParameter()`:设置纹理参数,如过滤方式(线性或最近邻)。 5. `glBegin()` 和 `...
在OpenGL中,纹理通常以纹理对象的形式存在,它们可以通过glGenTextures函数生成,并使用glBindTexture绑定到特定的纹理目标,如GL_TEXTURE_2D表示2D纹理。 加载地球纹理,我们首先需要一个地球的图像文件,这通常...
OpenGL ES(Open Graphics Library for Embedded Systems)是OpenGL的精简版本...通过研究这些资源,你可以深入学习如何在OpenGL ES环境中实现这两种纹理技术,并应用于自己的项目中,创建出更为丰富多样的3D图形效果。
学习和理解OpenGL纹理技术对于开发游戏、可视化软件或其他图形密集型应用至关重要。通过实践这样的示例,开发者能够更好地掌握如何在实际项目中高效地利用纹理来提升图形表现力。此外,对于三维纹理的理解,也有助于...
加载成功后,会得到一个纹理ID,然后通过`glGenTextures`和`glBindTexture`将图像数据绑定到一个纹理单元上。使用`glTexParameteri`可以设置纹理过滤模式,比如线性插值或最近邻插值。最后,通过`glTexImage2D`将...
5. **绑定纹理**:使用`glBindTexture()`函数将定义好的纹理绑定到特定的纹理单元上。 6. **绘制带纹理的对象**:最后,通过调用绘制命令(如`glDrawArrays()`)来绘制带有纹理的对象。 #### 5. 总结 纹理贴图...
OpenGL纹理技术是计算机图形学中的一个关键组成部分,它在创建逼真的3D场景时起着至关重要的作用。这篇教程由南京大学计算机系研究生计算机图形学方向提供,旨在深入讲解OpenGL中的纹理技术,包括理论基础、实现方法...
这通常包括使用OpenGL的纹理对象(`glGenTextures()`)创建一个新的纹理,然后通过`glBindTexture()`绑定纹理,并使用`glTexImage2D()`加载纹理图像数据。接着,需要控制纹理参数,例如设置纹理过滤模式(`...
总的来说,OpenGL纹理贴图是提升3D图形质量的重要手段,通过学习和实践,可以创建出更加真实和生动的3D场景。这份"OpenGL纹理贴图的实例+PPT原理介绍"资料,对于理解和掌握这一技术将非常有帮助。通过实验第八课:...
4. **纹理绑定**:在OpenGL中,纹理绑定是指将图像数据与特定的纹理单元关联的过程。这使得可以在3D物体表面上应用复杂的图案或图像。纹理坐标被映射到几何体的表面,从而实现真实感渲染。 5. **着色器**:OpenGL...
通过学习这些资源,开发者可以深入理解OpenGL纹理贴图和镂空效果的实现方法,并将其应用到自己的项目中。 总之,OpenGL的纹理贴图技术和镂空效果是提升3D图形表现力的重要手段。通过理解和掌握这些概念,开发者可以...
OpenGL提供了纹理坐标、纹理单元、过滤模式等概念,以实现纹理的加载、绑定和应用。 5. 鼠标交互:用户可以通过鼠标点击来控制太阳系的运动状态,比如启动或停止自转和公转。这涉及到事件处理和状态管理,通常需要...
3. 创建OpenGL纹理对象:使用`glGenTextures`生成纹理ID,然后使用`glBindTexture`绑定纹理目标。 4. 设置纹理参数:例如过滤模式、包裹模式等,用`glTexParameteri`函数调整。 5. 上传纹理数据:使用`glTexImage2D`...
OpenGL是一种强大的图形编程库,广泛应用于游戏开发、科学可视化等领域。在OpenGL中,为旋转的立方体和球体赋予纹理贴图是...学习和实践OpenGL纹理贴图不仅有助于创建更复杂的3D场景,也是提升图形编程技能的关键一步。