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

OpenGL学习二十三:多重纹理

 
阅读更多

在进行纹理贴图是,一次是把一副图像应用在个一个多边形上,多重纹理允许应用几个纹理,在纹理操作管线上把它们逐个应用到同一个多边形上使用glGetIntegerv(GL_MAX_TEXTURE_UNITS)查询当前OPENGL最多支持纹理数量

 

多重纹理的步骤
1.建立纹理单元
纹理图像glTexImage2D
纹理过滤 glTexParameteri(…, GL_TEXTURE_MAG_FILTER, …);
纹理环境应用glTexParameteri(…, GL_TEXTURE_WRAP_S, …);
纹理坐标自动生成(一般不需要)
顶点数组指定(如果需要的话)
每个纹理单位根据它的纹理状态,把原来的片段颜色与纹理图像进行混合,然后,把上述操作产生的片断颜色传递给以下个纹理单元

2.指定纹理顶点
使用 glMultiTexCoord2f (GL_TEXTURE0, 0.0, 0.0);
GL_TEXTURE0为0号纹理单元,后面的是纹理坐标
有几个纹理需要指定纹理坐标几次,对应不同的纹理坐标
glMultiTexCoord2f (GL_TEXTURE0, 0.0, 0.0);
glMultiTexCoord2f (GL_TEXTURE1, 0.0, 0.0);

使用glTexCoord 相当于使用glMultiTexCoord2f (GL_TEXTURE0,)

 

激活纹理
为了向每个纹理单元分配纹理详细,使用glActiveTexture ();选择要修改的纹理单元,再次之glTexImage,glTexParameteri,glTexEnv,glTexGen,glBindTexture只影响当前纹理

 

#include "header.h"

static GLubyte texels0[32][32][4];
static GLubyte texels1[16][16][4];

void makeCheckImages(void)
{
   int i, j;
    
   for (i = 0; i < 32; i++) {
      for (j = 0; j < 32; j++) {
         texels0[i][j][0] = (GLubyte) i;
         texels0[i][j][1] = (GLubyte) j;
         texels0[i][j][2] = (GLubyte) (i*j)/255;
         texels0[i][j][3] = (GLubyte) 255;
      }
   }

   for (i = 0; i < 16; i++) {
      for (j = 0; j < 16; j++) {
         texels1[i][j][0] = (GLubyte) 255;
         texels1[i][j][1] = (GLubyte) i;
         texels1[i][j][2] = (GLubyte) j;
         texels1[i][j][3] = (GLubyte) 255;
      }
   }
}

void init(void)
{    
   GLuint texNames[2];

   glClearColor (1.0, 1.0, 1.0, 0.0);
   glShadeModel(GL_FLAT);
   glEnable(GL_DEPTH_TEST);

   makeCheckImages();
   glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

   glGenTextures(2, texNames);
   glBindTexture(GL_TEXTURE_2D, texNames[0]);
   glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 32, 32, 0, GL_RGBA, 
		GL_UNSIGNED_BYTE, texels0);
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, 
                   GL_NEAREST);
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, 
                   GL_NEAREST);
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

   glBindTexture(GL_TEXTURE_2D, texNames[1]);
   glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, 
		GL_UNSIGNED_BYTE, texels1);
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
   /*  Use the two texture objects to define two texture units
    *  for use in multitexturing  */
   glActiveTexture (GL_TEXTURE0);
   glEnable(GL_TEXTURE_2D);
   glBindTexture(GL_TEXTURE_2D, texNames[0]);
   glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
   glMatrixMode (GL_TEXTURE);
      glLoadIdentity();
      glTranslatef(0.5f, 0.5f, 0.0f);
      glRotatef(45.0f, 0.0f, 0.0f, 1.0f);
      glTranslatef(-0.5f, -0.5f, 0.0f);
   glMatrixMode (GL_MODELVIEW);
   glActiveTextureARB (GL_TEXTURE1_ARB);
   glEnable(GL_TEXTURE_2D);
   glBindTexture(GL_TEXTURE_2D, texNames[1]);
   glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
}

void display(void)
{
   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
   glBegin(GL_TRIANGLES);
   glMultiTexCoord2fARB (GL_TEXTURE0_ARB, 0.0, 0.0);
   glMultiTexCoord2fARB (GL_TEXTURE1_ARB, 1.0, 0.0);
   glVertex2f(0.0, 0.0);
   glMultiTexCoord2fARB (GL_TEXTURE0_ARB, 0.5, 1.0);
   glMultiTexCoord2fARB (GL_TEXTURE1_ARB, 0.5, 0.0);
   glVertex2f(50.0, 100.0);
   glMultiTexCoord2fARB (GL_TEXTURE0_ARB, 1.0, 0.0);
   glMultiTexCoord2fARB (GL_TEXTURE1_ARB, 1.0, 1.0);
   glVertex2f(100.0, 0.0);
   glEnd();
   glFlush();
}

void reshape(int w, int h)
{
   glViewport(0, 0, (GLsizei) w, (GLsizei) h);
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
   if (w <= h)
      gluOrtho2D(0.0, 100.0, 0.0, 100.0 * (GLdouble)h/(GLdouble)w);
   else
      gluOrtho2D(0.0, 100.0 * (GLdouble)w/(GLdouble)h, 0.0, 100.0);
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
}

void keyboard(unsigned char key, int x, int y)
{
   switch (key) {
      case 27:
         exit(0);
         break;
   }
}

int main(int argc, char** argv)
{
   glutInit(&argc, argv);
   glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
   glutInitWindowSize(250, 250);
   glutInitWindowPosition(100, 100);
   glutCreateWindow(“多重纹理”);
   glewInit();
   init();

   glutReshapeFunc(reshape);
   glutDisplayFunc(display);
   glutKeyboardFunc (keyboard);
   glutMainLoop();
   return 0; 
}

 

分享到:
评论

相关推荐

    opengles多重纹理与过程纹理

    在OpenGL ES中,有两种特殊的纹理处理方式:多重纹理和过程纹理。 **多重纹理** 是指在一个渲染像素时,同时应用多个纹理映射的过程。这在创建复杂的材质效果时非常有用,例如混合不同的贴图,如漫反射、镜面高光和...

    opengl 多重纹理

    OpenGL多重纹理技术是一种在图形渲染中同时应用多个纹理映射到同一个像素点的技术,它可以极大地增强3D场景的视觉效果和复杂性。在本教程中,我们将深入探讨这个主题,了解如何实现多重纹理以及如何利用纹理混合来...

    opengl多重纹理绘制太阳

    在"opengl多重纹理绘制太阳"这个主题中,我们主要探讨的是如何利用OpenGL来实现一个逼真的太阳图像,这涉及到多个重要的知识点。 首先,多重纹理(Multitexturing)是OpenGL提供的一项功能,允许在同一个像素上应用...

    opengles多重纹理动画

    在"opengles多重纹理动画"这个主题中,我们将深入探讨如何在OpenGL ES中实现多重纹理效果,以及如何将这些效果应用到动态动画中。 在OpenGL ES中,多重纹理是一种高级图形技术,它允许在一个像素着色过程中同时使用...

    OpenGL 三维方块多重纹理渲染.zip

    OpenGL 三维方块多重纹理渲染

    OpenGL入门学习之十一——纹理的使用入门.pdf

    2. **多重细节层次**:一般设置为0,除非你需要使用多重纹理细节。 3. **内部格式**:此参数用于指定纹理的数据格式。在早期版本的OpenGL中,可以使用整数(例如3表示RGB);但在后续版本中推荐使用`GL_RGB`或`GL_...

    OpenGL 凸凹纹理实现.rar

    OpenGL是计算机图形学中广泛使用的跨语言、跨平台的应用程序编程接口(API),它提供了丰富的图形绘制功能,包括二维和三维图像的渲染。在给定的压缩包“OpenGL 凸凹纹理实现.rar”中,主要关注的是如何在OpenGL环境...

    glsl shader 多重纹理映射

    多重纹理映射是OpenGL中一种高级纹理合成技术,它允许在一个像素上同时应用多个纹理,通过混合这些纹理来创建更加细腻和丰富的图像。在我们的例子中,我们将看到如何使用GLSL shader来实现一个模拟地球外观的效果,...

    OpenGL六个面添加不同的纹理

    OpenGL是计算机图形学中的一种广泛应用的编程接口,用于在各种操作系统和硬件上生成二维和三维图像。在这个场景中,我们讨论的是如何利用OpenGL为立方体的六个面分别添加不同的纹理,同时实现纹理混合效果。 首先,...

    GLSL 多重纹理示例(源码)

    GLSL,全称为OpenGL Shading Language,是OpenGL图形库中用于编写着色器的语言,它允许程序员在GPU上执行...通过深入学习和实践,可以掌握如何在自己的项目中灵活运用多重纹理技术,创造出更加丰富和真实的视觉体验。

    多重纹理地球月球

    在Android开发中,实现“多重纹理地球月球”这样的3D视觉效果,涉及到多个关键的技术点,主要包括3D渲染、光照处理、纹理映射以及shader编程。下面将详细阐述这些知识点。 首先,3D渲染是整个项目的基石。Android...

    GLSL之多重纹理演示

    在这个"GLSL之多重纹理演示"中,我们将深入探讨如何利用GLSL来实现对多个纹理的混合,以创建丰富多样的图像外观。 首先,我们需要理解纹理贴图的基本概念。在3D图形渲染中,纹理是二维图像,被映射到3D模型表面,为...

    NeHe OPenGL 英文教程

    #### 二十五、凹凸贴图、多重纹理及扩展 本章节深入探讨凹凸贴图、多重纹理以及OpenGL扩展的应用。 **核心概念**: - **凹凸贴图**:了解凹凸贴图的基本原理及其对渲染质量的影响。 - **多重纹理**:掌握多重纹理...

    opengl 一个有光照效果带纹理会旋转的立体茶壶以及相关配置环境

    通过分析和理解代码,可以进一步学习OpenGL的更多高级特性,如深度测试、混合模式、多重采样抗锯齿等。同时,为了更好地运行这个项目,你需要一个支持OpenGL的开发环境,例如Visual Studio或者Code::Blocks,以及...

    OpenGL 1.3 新特性 多重贴图示例

    OpenGL是计算机图形学中的一种广泛应用的编程接口,用于在各种操作系统和硬件上生成二维和三维图像。OpenGL 1.3版本引入了许多新特性,其中一项重要改进就是多重贴图(Multi-Texturing)功能,它从ARB扩展变为官方...

    OpenGL资源.zip

    对于有经验的开发者,可能还会涉及更复杂的技术,如多重采样抗锯齿、帧缓冲对象(Frame Buffer Objects, FBOs)、顶点数组对象(Vertex Array Objects, VAOs)、纹理数组、计算着色器等。 五、资源和社区 压缩包...

    NeHe48个例子

    10. NeHe Productions OpenGL Lessons10.htm:可能是进阶主题,比如多重纹理、混合模式或者模板缓冲等。 每一个HTML文件都对应一个具体的OpenGL程序,它们通过实际的代码演示了OpenGL的强大功能和灵活性。通过逐一...

    openGL_纹理例子

    通过调试和修改代码,你可以进一步了解OpenGL纹理映射的细节,比如添加更多的纹理、改变纹理坐标、调整过滤器设置,甚至实现3D纹理和多重纹理。 总之,OpenGL纹理映射是构建复杂3D场景的关键技术之一,通过它我们...

    OpenGl三维图形设计

    "OpenGL三维图形设计.chm"文件很可能是详细讲解这些概念的参考资料,包含了丰富的实例和代码,可以帮助你深入学习和实践OpenGL编程。 掌握OpenGL需要时间和实践,但一旦熟练,你就能创造出令人惊叹的3D图形和应用,...

    water_6_13.rar_多重纹理

    在IT行业中,尤其是在游戏开发和图形编程领域,多重纹理...通过学习和分析这个项目,开发者不仅可以掌握多重纹理的实现方法,还能了解到如何创建动态且真实的水体效果,这对于提升游戏和可视化应用的品质非常有帮助。

Global site tag (gtag.js) - Google Analytics