关于多重纹理:
首先如果一个显卡支持多重纹理,表示它可以将几次渲染合为一次来进行,在这个渲染过程中,你可以在不同的纹理单元分别放入第0次,第1次,第2次需要渲染的对象.当程序向屏幕绘图时,将这些渲染结果叠加起来,将最终结果显示到屏幕.
每个纹理单元对应有其纹理环境,这个纹理环境指明了渲染的纹理图片、渲染参数、过滤参数等等,其中有一个重要的项目指明了,程序在将渲染结果进行逐个叠加的过程中,当前的纹理单元内的内容如何与前面的内容进行混合.
这个些参数中包含了:
a . 要进行混合的纹理的来源
这个来源要分两步指定:
1. 对象来自哪个纹理单元[例如GL_TEXTURE0, GL_TEXTURE1], 
2.该单元中的什么成分[例如:GL_SRC_COLOR,GL_ONE_MINUS_SRC_COLOR]
b. 混合所使用的函数
例如GL_ADD,GL_MODULATE,GL_INTERPLATE等
通俗一点来说呢, 如果我们要进行一次多重渲染就是要把两个纹理进行一次数学运算把得到的结果投放到屏幕。 
当然这个数学运算是需要你自己指定的这包括运算类型,操作数来源,操作数的值, 就像下面这个简单的代数式一样:
C = A + B
要算出这个结果,那么我们首先要指定要进行什么运算(这里是+),然后指定这个运算的两个操作数(这里是a和b,对于渲染还要知道他们来自哪个纹理单元).
这些参数的指定都是通过用不同的参数来调用glTexEnv 完成的。然后我们就可以运算了。这个C就是我们渲染的最终结果。
具体来说:如果我们要进行一次多重渲染:
那么首先我们要在各个纹理单元里面放入不同的纹理图片
例如在第0号单元 放入texture[0]所对应的图片:
glActiveTextureARB( GL_TEXTURE0_ARB );
glEnable( GL_TEXTURE_2D );
glBindTexture( GL_TEXTURE_2D, texture[0] );
例如在第1号单元 放入texture[1]所对应的图片:
glActiveTextureARB( GL_TEXTURE2_ARB );
glEnable( GL_TEXTURE_2D );
glBindTexture( GL_TEXTURE_2D, texture[1] );
然后 我们开始指定我们的代数运算:
首先告诉OpenGL 我们要把两个单元的纹理进行混合:
glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB );
然后告诉OpenGL我们要进行的运算:
glTexEnvi( GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_INTERPOLATE_ARB );
这里 INTERPOLATE 是指线性插值,它的公式是这样的:
C = Arg0*Arg2 + Arg1*(1-Arg2);
翻译成代数的是这样:
C = a*ω + b*(1-ω) ; 这下大家可以清楚的看到它是一个线性插值表达式了吧
其中: Arg0 是第一个操作数,Arg1是第二个操作数,Arg2 是线性插值的系数就是那个ω了。
这些都要通过下面的函数调用来指定。当然,混合函数还可以是GL_ADD “加”,
GL_SUBTRACT “减”,GL_MODULATE “乘” 等等.
下面来说 Arg0,Arg1,Arg2 的指定:
前面提到过:要指定一个操作数,需要指定它来自于哪个纹理单元,和来自于该纹理单元的哪个部分:
所以我们在下面可以看到,指定一个Arg用了两句话,第一个指定了这个操作数的内容来自哪个纹理单元,第二个指定了来自于纹理单元里的哪个部分:
//前一个 这里指0号单元
glTexEnvi( GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PREVIOUS_ARB );
//0号单元中的COLOR部分即RGB
glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR );
//这个GL_TEXTURE指当前活动的纹理单元也就是1号纹理单元
glTexEnvi( GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_TEXTURE );
glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR );
//由纹理环境变量GL_PRIMARY_COLOR_ARB指定的值
glTexEnvi( GL_TEXTURE_ENV, GL_SOURCE2_RGB_ARB, GL_PRIMARY_COLOR_ARB );
glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND2_RGB_ARB, GL_SRC_COLOR );
有了他们 就完成了混合函数的指定了,下面要做的事就是给一个几何图像同时绑上不同的纹理让它们去按上面的公式混合吧 :

opengl多重纹理映射相关推荐

  1. C++ Opengl 多重纹理源码

    C++ Opengl 多重纹理源码 项目开发环境 项目功能 项目演示 项目源码传送门 项目开发环境 开发语言:C++和IDE:VS2017,操作系统Windows版本windows SDK8.1,三方 ...

  2. OpenGL多重纹理使用与理解

    函数 对于opengl 扩展函数必须在初始化窗口结束后才能使用 wglGetProcAddress 获得 Opengl 没有重载函数,对于功能相同但参数类型和数量不同的函数加上后缀,最长可达4个,第一 ...

  3. 反走样和OpenGL多重采样

    1. 反走样 在计算机图形学中,在屏幕上显示对象时,可能会出现许多的"锯齿",这些锯齿是由顶点数据像素化之后成为片段的方式所引起的,由于将数学意义上的坐标转换到物理的显示器硬件上进 ...

  4. OpenGL:纹理映射bmp图像

    #include <gl/glut.h> #include <opencv2/opencv.hpp> #include <iostream> using names ...

  5. openGL教程 纹理映射

    学习 texture map 纹理映射(贴图)有很多好处.比方说您想让一颗导弹飞过屏幕.根据前几课的知识,我们最可行的办法可能是很多个多边形来构建导弹的轮廓并加上有趣的颜色.使用纹理映射,您可以使用真 ...

  6. OpenGL 有时候纹理映射的部分问题

    1.纹理的颜色不对头..GLCOLOR()设定为白色. 2.纹理有时候无法使用,,要确认当前的OPenGL是否与hDC绑定.

  7. windows下opengl多重纹理贴图

    参考:http://blog.sina.com.cn/s/blog_4a082449010138kt.html 转自:http://www.cnblogs.com/waytofall/archive/ ...

  8. OpenGL一维纹理映射练习

    算是抛开书本自己敲了一个完整的渲染代码. 用漫射光强度在一维纹理中索引纹理颜色.所以从顶点转配之后传给片段着色器的是漫射光强度值即可.过这章之后可以考虑着手glsl方向. 可是导航网格的实现还没搞定, ...

  9. GPGPU基础(二):GPGPU需要用到的OpenGL概念

    在计算机图形学中,纹理映射是实现复杂表面效果的高效方法,即以较小的计算量就可以实现较为逼真的模芯效果.在GPGPU中,纹理映射也是一个至关重要的概念.由图形API实现经典GPGPU的原理可以总结为:用 ...

最新文章

  1. 解决robotframework安装时提示wxPython not found问题
  2. 保存web.config文件(转载)
  3. C#怎么给新建的winform程序添加资源文件夹Resources
  4. 23种设计模式之策略模式
  5. am335x mysql_Ubuntu下编译ARM平台QtEmbedded的MySQL和MySQL插件
  6. ECS启动新“模”法
  7. android studio安装部署及sdk下载_「从零开始Python爬虫」1.7.3 APPium的安装
  8. ts定义数组类型_TypeScript 数组的类型
  9. 完成端口中的单句柄数据结构与单IO数据结构的理解与设计
  10. java 字符串 数字个数_JAVA 统计字符串中中文,英文,数字,空格的个数
  11. 楼主,不知道为什么这么流行
  12. ArrayList源码解析
  13. 连续系统离散化_连续系统转化为离散系统之 z 变换
  14. 【原创】黑群晖向白群晖 DS920+ 迁移
  15. java 加权平均_加权平均值 - 不羁之后的个人空间 - OSCHINA - 中文开源技术交流社区...
  16. 记一次完整的npm包开发 --- 发布过程
  17. (过桥问题)小明一家过一座桥,过桥时是黑夜,所以必须有灯
  18. 第二课 介绍:手绘墙画颜料选择
  19. Spring 注解@Value详解
  20. win7系统下 安装anaconda时报错“failed to create menus”的解决方案

热门文章

  1. JAVA入门级教学之(classpath的配置)
  2. c++ 多态 运行时多态和编译时多态_C++核心编程 第十一节 多态
  3. 教室信息管理系统mysql_教师信息管理系统(方式一:数据库为oracle数据库;方式二:存储在文件中)...
  4. 编辑器eslint格式_ESlint 代码格式大坑vscode vetur,eslint 冲突
  5. 【总结记录】面向对象设计OOP三大特性(封装、继承、多态)、七大基本原则的理解(结合代码、现实实例理解)
  6. 启动java服务时刷新缓存_Spring java项目对外提供服务和java进程启动时bean,内部缓存加载的先后关系?...
  7. 内固定取出术后护理_股骨内固定钢板取出术后护理查房记录范文
  8. java icon动态变换,以编程方式自动更改ImageIcon [Java]
  9. python 文本相似度_【机器学习】使用gensim 的 doc2vec 实现文本相似度检测
  10. java 反射机制 视频_【视频笔记】Java反射机制笔记