opengl多重纹理映射

关于多重纹理:
    首先如果一个显卡支持多重纹理,表示它可以将几次渲染合为一次来进行,在这个渲染过程中,你可以在不同的纹理单元分别放入第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 );
   
有了他们 就完成了混合函数的指定了,下面要做的事就是给一个几何图像同时绑上不同的纹理让它们去按上面的公式混合吧 :
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值