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

OpenGL学习十七:纹理贴图

 
阅读更多

纹理贴图的步骤
1.创建纹理对象,并为它指定一个纹理,纹理包含1维,2维,3维。描述纹理的数据由1~4个元素组成,用于表示RGBA四元组。调整常量或者深度成分
glGenTextures(1, &texture[0]);
glBindTexture(GL_TEXTURE_2D, texture[0]);
2.确定纹理如何应用到每个像素上
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
3.启用纹理贴图功能
GL_TEXTURE_1D,GL_TEXTURE_2D,GL_TEXTURE_3D,GL_TEXTURE_CUBE_MAP如果同时启用了2维3维,则以后者为准,如果启用了GL_TEXTURE_CUBE_MAP,则其他被启用的纹理均不在生效
4.绘制场景,提供纹理坐标和几何图形坐标

 

指定纹理

void glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);定义一个2维纹理

 

  GL_TEXTURE_1D
1维纹理
  GL_TEXTURE_2D
2维纹理
  GL_PROXY_TEXTURE_1D
1维代理纹理
  GL_PROXY_TEXTURE_2D 2维代理纹理
  GL_TEXTURE_CUBE_MAP_POSITIVE_X
立方体X轴正方向纹理
target GL_TEXTURE_CUBE_MAP_NEGATIVE_X
立方体X轴负方向纹理
  GL_TEXTURE_CUBE_MAP_POSITIVE_Y
立方体Y轴正方向纹理
  GL_TEXTURE_CUBE_MAP_NEGATIVE_Y
立方体Y轴负方向纹理
  GL_TEXTURE_CUBE_MAP_POSITIVE_Z
立方体Z轴正方向纹理
  GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 立方体Z轴负方向纹理
  GL_PROXY_TEXTURE_CUBE_MAP 立方体代理纹理
level   多重细节层时指定的分辨率,对于普通来说设置为0
    纹理内部数据格式,图像数据转换为纹理数据希望以哪种数据格式存储
  GL_LUMINANCE 只含有亮度成分
interna GL_LUMINANCE_ALPHA 含有亮度和A成分
lformat GL_DEPTH_COMPONENT 深度缓存
  GL_RGB RGB颜色格式
  GL_RGBA RGBA颜色格式
height
width
  必须是2m+2b,其中m是一个非负的整数,b是border值,纹理最大值取决于OPENGL,但它最少是64*64
border   边框,0代表无,1代表有
format   图像数据颜色格式
type GL_BYTE
GL_UNSIGNED_BYTE
GL_SHORT
GL_UNSIGHED_SHORT
……
图像数据数据类型
pixels   图像数据

 

void glCopyTexImage2D (GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);

 

void glTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);

替换当前一幅现有的二维图像的全部或一块连续的区域
和修改原有的纹理对比,创建新纹理的开销更大一些,用新的信息修改一个现有纹理的全部或一部分常常比重头创建一个新纹理和合适

 

void glCopyTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);

使用帧缓冲区的图像数据代替现有的一幅二维纹理图像的一部分或全部

 

纹理代理
由于纹理资源有限,因此来判断是否有足够的纹理空间来存储是十分重要的,纹理代理作用就在于此
1.查询系统支持纹理图像最大宽度和最大高度
 glGetIntegerv(GL_MAX_TEXTURE_SIZE,size);
GL_MAX_3D_TEXTURE_SIZE 3D纹理图像
GL_MAX_CUBE_TEXTURE_SIZE 立方体纹理图像

2.使用纹理代理查询纹理资源


2.1 设置要查询的内容
   glTexImage2D(GL_PROXY_TEXTURE_2D, 0, GL_RGBA, 10240, 10240,
    0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);


2.2 查询纹理资源
 void glGetTexLevelParameteriv (GLenum target, GLint level, GLenum pname, GLint *params);

pname:GL_TEXTURE_WIDTH
       GL_TEXTURE_HEIGHT
       GL_TEXTURE_DEPTH
       GL_TEXTURE_BORDER
       GL_TEXTURE_INTERNAL_FORMAT
       GL_TEXTURE_RED_SIZE
       GL_TEXTURE_BLUE_SIZE
       GL_TEXTURE_GREED_SIZE
       GL_TEXTURE_ALPHA_SIZE
       GL_TEXTURE_LUMINANCE_SIZE
       GL_TEXTURE_INTENSITY_SIZE
如果没有足够的资源容纳这个纹理代理,宽度,高度,边框宽度以及成分分辨率的纹理状态变量都设置为0

创建帧缓冲区的数据来定义纹理单元

 

一维纹理
void glTexImage1D (GLenum target, GLint level, GLint internalformat, GLsizei width,  GLint border, GLenum format, GLenum type, const GLvoid *pixels);
一维纹理可以看成是高度为1的2为纹理

 

三维纹理
void glTexImage3D (GLenum target, GLint level, GLint internalformat, GLsizei width,  GLsizei depth ,GLint border, GLenum format, GLenum type, const GLvoid *pixels);
三维纹理可以看成由一层层的2纹理组成

 

#include "header.h"

#define checkImageWidth 64
#define checkImageHeight 64
#define subImageWidth 16
#define subImageHeight 16
static GLubyte checkImage[checkImageHeight][checkImageWidth][4];
static GLubyte subImage[subImageHeight][subImageWidth][4];

static GLuint texName[2];
float quard=0.0f;
void makeCheckImages(void)
{
   int i, j, c;
    
   for (i = 0; i < checkImageHeight; i++) {
      for (j = 0; j < checkImageWidth; j++) {
         c = ((((i&0x8)==0)^((j&0x8))==0))*255;
         checkImage[i][j][0] = (GLubyte) c;
         checkImage[i][j][1] = (GLubyte) c;
         checkImage[i][j][2] = (GLubyte) c;
         checkImage[i][j][3] = (GLubyte) 255;
      }
   }
   for (i = 0; i < subImageHeight; i++) {
      for (j = 0; j < subImageWidth; j++) {
         c = ((((i&0x4)==0)^((j&0x4))==0))*255;
         subImage[i][j][0] = (GLubyte) c;
         subImage[i][j][1] = (GLubyte) 0;
         subImage[i][j][2] = (GLubyte) 0;
         subImage[i][j][3] = (GLubyte) 255;
      }
   }
}

void init(void)
{    
GLuint size[2];
	glGetIntegerv(GL_MAX_3D_TEXTURE_SIZE,size);
   glClearColor (0.0, 0.0, 0.0, 0.0);
   glShadeModel(GL_FLAT);
   glClearDepth(1.0f);									
   glEnable(GL_DEPTH_TEST);							
   glDepthFunc(GL_LEQUAL);								

   makeCheckImages();
   glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  /* glTexImage2D(GL_PROXY_TEXTURE_2D, 0, GL_RGBA, 1024, 1024, 
	   0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);


   glGetTexLevelParameteriv(GL_PROXY_TEXTURE_2D,0,GL_TEXTURE_DEPTH,size);*/
   glGenTextures(2, &texName[0]);
   glBindTexture(GL_TEXTURE_2D, texName[0]);

   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_MAG_FILTER, GL_NEAREST);
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
   glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, checkImageWidth, checkImageHeight, 
                0, GL_RGBA, GL_UNSIGNED_BYTE, checkImage);

   glBindTexture(GL_TEXTURE_2D, texName[1]);

   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_MAG_FILTER, GL_NEAREST);
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
   glCopyTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,0,0,100,100,0);

}

void display(void)
{
   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
   glLoadIdentity();
   glEnable(GL_TEXTURE_2D);
   glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
   glBindTexture(GL_TEXTURE_2D, texName[0]);
   glRotatef(quard,1,0,0);
   
   glBegin(GL_QUADS);
  glTexCoord2f(0.0, 0.0) ;glVertex3f(0.0, 100, 0);
  glTexCoord2f(0.0, 1.0);  glVertex3f(100, 100, 0);
  glTexCoord2f(1.0, 1.0); glVertex3f(100, 0, 0);
  glTexCoord2f(1.0, 0.0); glVertex3f(0, 0, 0);
     glEnd();
	glBindTexture(GL_TEXTURE_2D, texName[1]);
	glColor3f(1,0,0);
	 glBegin(GL_QUADS);
	 glTexCoord2f(1.0, 0.0) ;glVertex3f(150, 100, 0);
	 glTexCoord2f(1.0, 1.0);  glVertex3f(250, 100, 0);
	 glTexCoord2f(0.0, 1.0); glVertex3f(250, 0, 0);
	 glTexCoord2f(0.0, 0.0); glVertex3f(150, 0, 0);
	 glEnd();

   glFlush();
   glDisable(GL_TEXTURE_2D);
}

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

    glOrtho(-0, (GLdouble) w, -0, (GLdouble) h,-100,100);
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
   glTranslatef(0.0, 0.0, -3.6);
}

void keyboard (unsigned char key, int x, int y)
{
   switch (key) {
      case 's':
      case 'S':
         glBindTexture(GL_TEXTURE_2D, texName[0]);
         glTexSubImage2D(GL_TEXTURE_2D, 0, 12, 44, subImageWidth,
                         subImageHeight, GL_RGBA,
                         GL_UNSIGNED_BYTE, subImage);
         glutPostRedisplay();
         break;
	  case 'a':
	  case 'A':
		  glBindTexture(GL_TEXTURE_2D, texName[1]);
		   glCopyTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,0,0,100,100,0);
		  glutPostRedisplay();
		  break;
	  case 'B':

	  case 'b':
		  glBindTexture(GL_TEXTURE_2D, texName[1]);
		  glCopyTexSubImage2D(GL_TEXTURE_2D,0,10,10,20,20,120,120);
		  glutPostRedisplay();
		  break;
      case 'r':
      case 'R':
         glBindTexture(GL_TEXTURE_2D, texName[0]);
         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, checkImageWidth,
                      checkImageHeight, 0, GL_RGBA,
                      GL_UNSIGNED_BYTE, checkImage);
         glutPostRedisplay();
         break;
      case 27:
         exit(0);
         break;
      default:
         break;
   }
}
void rotate()
{
	quard+=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);
	}else
	{
	   //glutIdleFunc(0);
	}
          break;
      }
}
int main(int argc, char** argv)
{
   glutInit(&argc, argv);
   glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
   glutInitWindowSize(600, 480);
   glutInitWindowPosition(100, 100);
   glutCreateWindow("纹理贴图");
   glewInit();
   init();
   glutDisplayFunc(display);
   glutReshapeFunc(reshape);
   glutKeyboardFunc(keyboard);
   glutMouseFunc(mouse);
   glutMainLoop();
   return 0; 
}

 

 

分享到:
评论

相关推荐

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

    通过学习和理解这个例子,你可以掌握纹理贴图的基本流程,并在此基础上构建更复杂、更真实的3D场景。 在实际项目中,纹理贴图可以用于创建复杂的表面效果,如木纹、砖石、金属等。同时,你还可以利用多纹理、MIP...

    OpenGL加载Obj模型和纹理贴图

    基于Qt+OpenGL 实现的3D模型obj文件加载以及纹理贴图,未使用第三方库,根据obj文件的格式,逐行解析并读取,加载到顶点缓冲区中,适合学习OBJ模型加载的同学参考。

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

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

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

    OpenGL是一种强大的图形编程库,广泛应用于游戏开发、科学可视化等领域。在OpenGL中,为旋转的立方体和球体赋予纹理贴图是...学习和实践OpenGL纹理贴图不仅有助于创建更复杂的3D场景,也是提升图形编程技能的关键一步。

    opengl纹理贴图源码

    在OpenGL中,纹理贴图是给3D模型增添细节和真实感的关键技术。本教程将深入探讨如何使用VA(Vertex Array)模式实现纹理贴图。 纹理贴图是指将2D图像(纹理)映射到3D模型表面,通过这种方式增加模型的视觉信息。在...

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

    “OpenGL纹理贴图”这个标签表明,这个程序可能还包括了如何在立方体的表面正确地贴图,确保纹理正确对齐且无扭曲。 “OpenGL纹理”和“opengl添加纹理”标签则强调了学习如何创建和应用纹理是OpenGL编程的基本技能...

    android opengl-ES 魔方 纹理贴图

    总的来说,这个项目涵盖了Android开发中的3D图形编程、纹理贴图技术和手势识别技术,是学习和实践OpenGL-ES的好例子。通过这个项目,开发者不仅可以提升图形处理能力,还能增强对用户交互设计的理解。

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

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

    易语言源码OPENGL应用中纹理贴图的方法.rar

    通过查看和学习这个源码,你可以深入理解OpenGL纹理贴图的流程,以及如何在易语言环境中操作OpenGL。 `源码使用说明.txt`文件可能包含了一些关于如何编译、运行和理解代码的指南。建议先阅读此文件,以确保正确地...

    Android代码-OpenGL3D立方体多纹理贴图源码.zip

    这个“Android代码-OpenGL3D立方体多纹理贴图源码.zip”文件显然包含了实现3D立方体并应用多纹理贴图的示例代码,对于学习Android平台上的3D图形编程非常有帮助。 1. **OpenGL基础知识**:在OpenGL中,图形是通过...

    纹理贴图,opengl经典例子

    纹理贴图是计算机图形学中的一个关键概念,特别是在使用OpenGL这样的图形库进行3D渲染时。OpenGL是一个跨语言、跨平台的编程接口,用于生成2D、3D图像。在这个"纹理贴图,opengl经典例子"中,我们将深入探讨纹理贴图...

    Opengl纹理贴图详解源码

    在本"OpenGL纹理贴图详解源码"中,我们将深入探讨如何使用OpenGL进行纹理贴图、光照处理以及碰撞检测,这些是游戏开发和可视化应用中的核心概念。 纹理贴图是将图像数据应用到3D模型表面的技术,它为场景添加了细节...

    opengl纹理贴图

    OpenGL纹理贴图是计算机图形学中的一个重要概念,用于在3D模型上添加视觉细节,使得渲染出来的图像更加逼真和丰富。在VC++6.0环境下,结合MFC(Microsoft Foundation Classes)框架来实现OpenGL纹理贴图,可以构建出...

    Android OpenGL 3D 立方体多纹理贴图源码

    这个"Android OpenGL 3D 立方体多纹理贴图源码"是一个很好的学习资源,它涵盖了多个关键的OpenGL ES编程概念。 首先,3D立方体的渲染是OpenGL ES的基本应用之一,它展示了如何构建基本的几何形状。在3D空间中,一个...

    OpenGL绘制八大行星纹理贴图

    OpenGL是计算机图形学中的...通过学习和实践这些知识点,你将能够创建一个展示八大行星的OpenGL程序,每个行星都有其独特的纹理贴图,呈现出逼真的太阳系景象。同时,这也将帮助你深入理解3D图形渲染的核心原理和技术。

    Android应用源码OpenGL 3D立方体多纹理贴图.zip

    在Android应用开发中,OpenGL是一个...通过这个项目,开发者可以学习到如何在Android上构建3D图形应用,理解OpenGL ES的工作原理,以及如何实现多纹理贴图,这对于进行更复杂的3D游戏或视觉效果的开发是非常有价值的。

    OpenGL多纹理贴图

    在OpenGL中,多纹理贴图是一种技术,它允许在同一个像素位置应用多个纹理,为图像添加更丰富的细节和复杂性。这个技术尤其适用于实现光照效果、纹理混合或者创建复杂的表面效果。 在"OpenGL多纹理贴图"的场景中,...

    android opengl es 圆锥纹理贴图

    圆锥纹理贴图是OpenGL ES中的一种技术,用于在三维模型上应用纹理,使得图像更具真实感。这个教程或代码示例可能是为了帮助开发者理解如何在Android平台上使用OpenGL ES为圆锥形几何体添加纹理。 在OpenGL ES中,...

    opengl纹理贴图例子

    总的来说,"opengl纹理贴图例子"是一个很好的学习资源,它涵盖了纹理映射的基本概念,包括纹理对象的创建、纹理数据的加载以及纹理坐标的应用。通过理解和实践这个例子,初学者能够对OpenGL中的纹理映射有一个清晰的...

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

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

Global site tag (gtag.js) - Google Analytics