`
tiankefeng0520
  • 浏览: 143103 次
  • 性别: 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多重纹理与过程纹理

    opengles绘制多重纹理与过程纹理

    opengl 多重纹理

    opengl 多重纹理 纹理混合 超详细 看了不会后悔哦!

    opengl多重纹理绘制太阳

    opengl使用多重纹理绘制太阳,实现半透明效果,可以键盘控制拉近视点,拉远视点,改变纹理的绘制方式。

    opengles多重纹理动画

    opengles多重纹理

    glsl shader 多重纹理映射

    简单glsl shader 自己编写,实现太空看地球效果 白天、黑夜、云彩多重纹理混合 参见opengl shading language第二版

    OpenGL 凸凹纹理实现.rar

    利用OpenGL通过VC实现的凹凸纹理,已经多重纹理,及其个各种滤波效果的演示

    GLSL 多重纹理示例(源码)

    本人学习OpenGL及GLSL后写的一个多重纹理的程序,通过这个程序可以帮助初学者很好地理解GLSL的多重纹理机制,代码注释清晰,重用性强!

    OpenGL_参考手册.rar

    3.3.1 多重纹理 26 3.3.2 绘图子集 26 3.4 GLU例程 28 3.4.1 纹理图像 28 3.4.2 坐标转换 29 3.4.3 多边形镶嵌分块 29 3.4.4 二次对象 30 3.4.5 NURBS曲线和曲面 30 3.4.6 状态查询 31 3.5 GLX例程 31 3.5.1 初始化 ...

    OpenGL编程指南

    OpenGL编程 包括:立方图纹理映射 深度纹理和阴影 多重纹理 高级纹理应用模式 通过多重采样实现反走样

    OpenGL编程参考手册

    此外,本章还包含了有关OpenGL的 ARB扩展—多重纹理和绘图子集的参考说明。需要说明的是并非所有的OpenGL的环境都支持ARB扩展。 第6章 GLU参考说明 本章包含了所有的GLU命令的参考说明。 第7章 GLX参考说明 ...

    Nehe的OpenGL教程电子书

    凹凸映射,多重纹理扩展 这是一课高级教程,请确信你对基本知识已经非常了解了。这一课是基于第六课的代码的,它将建立一个非常酷的立体纹理效果。 23.球面映射 这一个将教会你如何把环境纹理包裹在你的3D模型...

    OpenGL 参考手册

    3.3.1 多重纹理 26 3.3.2 绘图子集 26 3.4 GLU例程 28 3.4.1 纹理图像 28 3.4.2 坐标转换 29 3.4.3 多边形镶嵌分块 29 3.4.4 二次对象 30 3.4.5 NURBS曲线和曲面 30 3.4.6 状态查询 31 3.5 GLX例程 31 3.5.1 初始化 ...

    openGL 参考手册

    此外,本章还包含了有关OpenGL的 ARB扩展—多重纹理和绘图子集的参考说明。需要说明的是并非所有的OpenGL的环境都支持ARB扩展。 ?第6章 GLU参考说明 本章包含了所有的GLU命令的参考说明。 ?第7章 GLX参考说明...

    OpenGL ES 3.0编程指南第2版[中文][PDF]

    第9章和第10章介绍片段着色器,包括多重纹理、雾化、Alpha测试和用户裁剪平面等;第11章讨论片段操作,包括剪裁测试、模板测试、深度测试、多重采样、混合和抖动;第12章介绍使用帧缓冲区对象渲染屏幕外表面;第13章...

    太空中的自转地球(带多重纹理,光照)

    太空中的自转地球(带多重纹理,光照)根据android3d游戏开发技术宝典的教程改成ndk版

    OpenGL参考手册

    命令和例程一览 18 3.1 注释 18 3.2 OpenGL命令 19 3.2.1 图元 19 3.2.2 顶点数组 19 3.2.3 坐标转换 20 3.2.4 着色与光照 20 3.2.5 剪切 21 3.2.6 光栅化 21 3.2.7 像素操作 ...

    OpenGL ES 3.0

    多重纹理、雾化、Alpha测试和用户裁剪平面的例子都使用片段着色器实现。  第11章——片段操作  第11章讨论可以适用于整个帧缓冲区或者在OpenGL ES 3.0片段管线中执行片段着色器后适用于单个片段的操作。这些操作...

    OpenGL 系统开发的源代码

    6.6 多重纹理 第7章 帧缓存技术与动画 7.1 OpenGL中的各种缓存 7.1.1 颜色缓存 7.1.2 深度缓存 7.1.3 模板缓存 7.1.4 累积缓存 7.2 缓存操作技术 7.2.1 清除缓存 7.2.2 选择绘图颜色缓存 7.2.3 ...

    OpenGL 参考手册1-4章

    3.3.1 多重纹理 26 3.3.2 绘图子集 26 3.4 GLU例程 28 3.4.1 纹理图像 28 3.4.2 坐标转换 29 3.4.3 多边形镶嵌分块 29 3.4.4 二次对象 30 3.4.5 NURBS曲线和曲面 30 3.4.6 状态查询 31 3.5 GLX例程 31 3.5.1 初始化 ...

Global site tag (gtag.js) - Google Analytics