设为首页 加入收藏

TOP

OpenGL超级宝典学习笔记——纹理高级(三)
2015-02-25 22:43:02 来源: 作者: 【 】 浏览:28
Tags:OpenGL 超级 宝典 学习 笔记 纹理 高级

纹理组合器


OpenGL的纹理组合器可以控制多重纹理的片段是如何组合的。一般情况下,我们可以简单的为每个纹理单元设置一个纹理环境模式(GL_REPLACE,GL_DECAL,GL_ADD和GL_MODULATE),把每个纹理应用的结果添加到下一个纹理单元中。然而纹理组合器提供了一个新的纹理环境GL_COMBINE允许我们显示地控制每一个纹理单元的纹理片段是如何组合的。使用纹理组合器模式代码如下:


glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);


纹理组合器是通过glTexEnv函数来控制的。然后我们需要设置使用哪个纹理组合器的函数。glTexEnv函数的第二个参数是组合器函数的选择器,可以是GL_COMBINE_RGB或GL_COMBINE_ALPHA。第三个参数是你想使用的纹理环境函数。这个参数值如下表:


例如你给RGB值选择GL_REPLACE组合器,你的函数调用如下:


glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_REPLACE);


上表中的Arg0——Arg2通过更多的glTexEnv调用来设置。GL_SOURCEx_RGB和GL_SOURCEx_ALPHA值用于指定RGB和alpha组合器函数的参数,x可以是0,1或者2,这些来源的值如下表:


例:你设置Arg0为纹理单元0


glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_TEXTURE0);


我们还可以对给定的源值施加额外的控制。设置这些操作数,我们可以使用常量GL_OPERANDx_RGB或者GL_OPERANDx_ALPHA,x可以是0,1或者2,可以给这些操作数赋予的值如下表:


例如你已经在两个纹理单元中加载了两个纹理,你在应用纹理时,想要把两个纹理的颜色值相乘,你可以如下设置:


//设置纹理环境为纹理组合


glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);


//告诉OpenGL,对RGB值使用组合函数GL_MODULATE


glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE);


//设置arg0为第0个纹理单元


glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_TEXTURE0);


glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);


//设置arg1为纹理单元1


glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_TEXTURE1);


glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR):


我们还可以为纹理组合器,指定一个RGB或alpha的缩放因子。默认情况下是:


glTexEnvf(GL_TEXTURE_ENV, GL_RGB_SCALE, 1.0f);


glTexEnvf(GL_TEXTURE_ENV, GL_ALPHA_SCALE, 1.0f);


点精灵的特性是OpenGl1.5开始引入的。使用点精灵,我们可以通过绘制一个3D的点来把纹理图像映射的屏幕上。例如原本是一个矩形的几何图元(由四个顶点组成),然后再把2D的纹理映射到这个矩形上才能得到的效果,现在使用点精灵则只需要绘制一个3D的点就可以了。这减少了处理器需要处理的顶点,也减少了顶点传输的带宽,提高了性能。


例如,大量的微粒在屏幕上移动形成魔幻般的视觉效果,可以通过点精灵来实现(常见的屏幕保护程序)。


image


在点精灵之前,要实现这种效果,我们需要在屏幕上绘制大量的纹理多边形,并需要通过对多边形进行旋转,以确保它面对这照相机。而点精灵纹理允许我们绘制一个3D的顶点,来渲染一个完美对齐的纹理2D多边形。


点精灵非常容易使用,开启点精灵GL_POINT_SPRITE,设置纹理环境的目标位GL_POINT_SPRITE 的GL_COORD_REPLACE参数为真,发送3D点。


glBindTexture(GL_TEXTURE_2D, objectID);


glEnable(GL_POINT_SPRITE);


glTexEnvi(GL_POINT_SPRITE, GL_COORD_REPLACE, GL_TRUE);


glBegin(GL_POINTS);



glEnd();


把之前第六章的smooth样例进行修改,使用点精灵的方式来绘制,代码如下:


效果如下:


image


点精灵遵循所有的2D纹理的规则,包括纹理环境为GL_DECAL,GL_REPLACE,GL_MODULATE等,以及mipmapped和多重纹理。如果把GL_COORD_REPLACE设置为加,


glTexEnvi(GL_POINT_SPRITE, GL_COORD_REPLACE, GL_FALSE);


那么顶点指定单个纹理坐标,并应用于整个点。如果为GL_TRUE,则OpenGL根据点的表面对纹理坐标进行插值。当然这些点的大小必须是大于1.0的。


点精灵的特性可以通过glPointParameter来进行微调,下图展示应用点精灵的两个不同纹理坐标的原点位置。


image


通过设置GL_POINT_SPRITE_COORD_ORIGIN为GL_LOWER_LEFT把纹理坐标的原点设置到左下角。


glPointParameteri(GL_POINT_SPRITE_COORD_ORIGIN, GL_LOWER_LEFT);


更多的参数设置参考https://www.opengl.org/sdk/docs/man/xhtml/glPointParameter.xml


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇OpenGL超级宝典学习笔记——纹理.. 下一篇OpenGL超级宝典学习笔记——曲线..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: