OGL纹理颜色组合函数glTexEnvf

原创 2016年08月30日 10:53:54
OGL纹理函数就是对纹理颜色,多边形片段本身的颜色(指定的,或是来自光照得到的多边形顶点颜色),环境颜色 等颜色进行组合的函数。在OGL 2.0以后基本用Fragment Shader可编程来实现颜色的组合。但是了解传统的固定管线的纹理颜色组合函数对于正确的编写Fragment Shader是很有好处的。
可以通过glTexEnvf函数来指定纹理函数。
函数原型:
glTexEnvf (GLenum target, GLenum pname, GLfloat param);
例如:glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
target可以是:GL_TEXTURE_ENV, GL_TEXTURE_FILTER_CONTROL

1.如果target是GL_TEXTURE_FILTER_CONTROL ,pname必须是GL_TEXTURE_LOD_BIAS

param是一个浮点值作为mipmap时候纹理层级的定位用的偏移参数。

2.如果target是GL_TEXTURE_ENV,且pname是GL_TEXTURE_ENV_MODE

那么param必须是GL_REPLACE,GL_DECAL,GL_MODULATE; GL_ADD, GL_BLEND,GL_COMBINE颜色组合操作类型之一,或者GL_TEXTURE_ENV_COLOR直接提供一个色调进行组合颜色。

1)颜色操作的格式:

纹理数据有6种基本格式,GL_ALPHA,GL_LUMINANCE,GL_LUMINANCE_ALPHA,GL_INTENSITY, GL_RGB, GL_RGBA,或者其它格式类似GL_LUMINANCE6_ALPHA2,GL_R3_G3_B2为纹理成分指定分辨率,但是纹理计算最终是在RGBA模式下进行的,会对上述颜色成分进行提取,提取规则见OGL RED BOOK page 282.

纹理颜色组合主要是两方面的颜色,Cf来自fragment的颜色(主要来自顶点指定的颜色,或顶点指定的法向量得到的光照颜色,或者来自光照贴图的颜色),Cs来自纹理插值映射后的纹理单元的颜色。
还有一个来自GL_TEXTURE_ENV_COLOR指定的环境颜色,该颜色主要是环境色调也属于Cf。

2)颜色的组合方法:

1)替换GL_REPLACE ,主要用途有GL_DECAL地表贴花,绘制不透明的物体。
2)标量乘以颜色各个分量, 主要用途有绘制透明度的物体。
3)颜色加法,各个分量的颜色分别对应相加,主要用途有高光效果,容易太强烈。
4)颜色乘法,各个分量的颜色分别对应相乘,主要用途有光照后和纹理颜色的混合。
GL_DECAL是贴花,GL_RGB模式下是直接用纹理颜色替换, GL_RGBA模式下:Cs*As+Cf*(1-As),alpha值是As。

3)纹理组合函数:

target是GL_TEXTURE_ENV下,使用了GL_COMBINE,那么启用了纹理组合函数。例如:
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
那么就可以为混合设置混合函数,设置混合函数的参数,还可以对参数进行过滤选择。
设置可编程纹理组合器函数
在启用了纹理组合器后,glTexEnvf(GL_TEXTURE_ENV, pname, param)中设置的纹理组合函数,pname可以是GL_COMBINE_RGB表示对颜色成分进行操作,也可以是GL_COMBINE_ALPHA表示对alpha成分进行操作。
参数类型为arg0, arg1, arg2:
// arg0
glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_REPLACE);
// arg0 + arg1
glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_ADD);
// arg0 + arg1 - 0.5
glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_ADD_SIGNED);
// arg0 - arg1
glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_SUBTRACT);
// arg0*arg2 + arg1*(1-arg2)
glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_INTERPOLATE);
设置混合函数参数来源和过滤操作:
GL_SOURCEi_Color, 其中i代表上述混合函数的参数,Color代表RGB或ALPHA;说明第几个参数的颜色成分的来源。
参数来源的类型parameter:
GL_PREVIOUS是当前片段内的颜色(也就是之前光照,Color或是多重纹理映射前面级别的纹理混合后得到的结果),
GL_TEXTURE说明颜色来源于当前纹理,GL_TEXTUREi多重纹理映射下指定是第i层级的纹理,GL_CONSTANT是GL_TEXTURE_ENV_COLOR指定的颜色。
GL_PRIMARY_COLOR是指进行纹理处理之前的光栅化片断得到的颜色。

GL_OPERANDi_Color,其中i代表上述混合函数的参数,Color代表RGB或ALPHA;说明对传入的颜色成分进行的过滤操作。
参数操作类型parameter:
GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR, GL_SRC_ALPHA或GL_ONE_MINUS_SRC_ALPHA。
例如:
static GLfloat constColor[4] = {0.0, 0.0, 0.0, 0.0};
constColor[3] = 0.2; // alpha值赋值了0.2
glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, constColor);
glBindTexture(GL_TEXTURE_2D, texName[0]);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB);
// 插值模式的混合函数
glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_INTERPOLATE_ARB);

glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_TEXTURE);
glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR);
// 多级纹理中的前一个操作中fragmentColor, 这里只有一个层级纹理,所以是
// fragmentColor
glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_PREVIOUS_ARB);
glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR);

// 用常量颜色,但是这里取alpha值为颜色值
glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE2_RGB_ARB, GL_CONSTANT_ARB);
glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND2_RGB_ARB, GL_SRC_ALPHA);
混合操作的含义是:
texColor*(0.2, 0.2, 0.2) + fragmentColor*(0.8, 0.8, 0.8);

对颜色进行缩放:
glTexEnvf(GL_TEXTURE_ENV, GL_RGB_SCALE, 1.0);
glTexEnvf(GL_TEXTURE_ENV, GL_ALPHA_SCALE, 1.0);

3.如果target是GL_POINT_SPRITE,并且pname是GL_COORD_REPLACE

那么把param参数设置为GL_TRUE那么可以启用围绕一个点块纹理的坐标进行迭代。
使用点块纹理:
glPointSize(10.0);
glTexEnvi(GL_POINT_SPRITE, GL_COORD_REPLACE, GL_TRUE);
// 点块纹理的的s坐标规定从左向右为[0,1], t坐标可以设置,这里设置为左下角为0,右上角1.
glPointParameter(GL_POINT_SPRITE_COORD_ORIGIN, GL_LOWER_LEFT);
glEnable(GL_POINT_SPRITE);
版权声明:本文为博主原创文章,转载请注明出处http://blog.csdn.net/blues1021。

Opengl纹理映射(转)

9.4 纹理对象 使用纹理对象来存储纹理数据的步骤: 1) 生成纹理对象名称 2) 将纹理对象绑定到纹理数据(包括图像数据数组和纹理属性), 即创建纹理对象. 3) 如果OpenGL实现高性能纹...
  • cs_lht
  • cs_lht
  • 2010年06月11日 19:02
  • 12898

OpenGL学习三十:深度缓冲区与掩码

深度缓冲区与掩码的理解
  • tiankefeng19850520
  • tiankefeng19850520
  • 2014年01月22日 09:45
  • 1019

纹理映射mipmap

Mipmapping Mipmap是一个功能强大的纹理技术,它可以提高渲染的性能以及提升场景的视觉质量。它可以用来解决使用一般的纹理贴图会出现的两个常见的问题: 闪烁,当屏幕上被渲染物体的表面与它所...
  • yiting52
  • yiting52
  • 2016年09月01日 16:45
  • 1076

opengl渲染管线 不能再详细了

http://www.cnblogs.com/liangliangh/p/4116164.html 转载自上面的网址,总有可以令人膜拜的文章 还有一个综合的网址 http://www.progr...
  • cjneo
  • cjneo
  • 2016年01月18日 17:26
  • 11525

glTexEnv

1. 简介 glTexEnv用来设置纹理的环境参数,纹理环境参数主要控制纹理如何与片元颜色进行计算的。 2. 函数原型 void glTexEnvf( GLenum target, GL...
  • zxzzt119
  • zxzzt119
  • 2016年12月26日 09:28
  • 468

《高效学习OpenGL》 之 纹理函数(设置绘图模式) glTexEnv()

设置当前的纹理函数: glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); void glTexEnvf (GLenum ...
  • huangbangqing12
  • huangbangqing12
  • 2014年02月28日 14:26
  • 1970

OpenGL学习二十:纹理函数

通过纹理函数(glTexEnv*())可以把纹理图像的颜色与物体表面的原先的颜色进行混合 当我们指定纹理数据时,其第三个参数internalformat可以简化为6种格式 基本内部格式 所提...
  • tiankefeng19850520
  • tiankefeng19850520
  • 2014年01月21日 19:03
  • 1728

深入了解OpenGL——纹理基础

在前几讲,我们介绍了OpenGL基本的图元绘制方法、顶点线性变换、光照以及其它着色技巧,现在我们将讲述OpenGL中一个非常大的话题——纹理(texture)。 有些教材喜欢在一开始就把纹理贴图带一...
  • nogodoss
  • nogodoss
  • 2014年05月29日 09:35
  • 11254

OGL program

  • 2008年08月29日 14:47
  • 421KB
  • 下载

OGL混合

所有Blend混合在索引颜色模式下是非法的。混合所在的阶段是图形drawcall最后帧写入时候和之前drawcall写入的像素进行blend,如果前面检查如 sissortest, alphatest...
  • Blues1021
  • Blues1021
  • 2016年08月08日 08:16
  • 413
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:OGL纹理颜色组合函数glTexEnvf
举报原因:
原因补充:

(最多只允许输入30个字)