美文网首页OpenGL ES
第十二节—关于纹理单元

第十二节—关于纹理单元

作者: L_Ares | 来源:发表于2020-09-22 15:50 被阅读0次

本文为L_Ares个人写作,包括图片皆为个人亲自操作,如需转载请表明原文出处。

一、关于纹理采样器Sampler

关于对纹理单元的理解,首先就要知道什么是sampler纹理采样器。在GLSL中,我们经常会在.fsh也即是片元着色器源码文件中使用sampler这个修饰符,它会和一个texture一一对应,从而获取到我们需要的纹理。

他的功能就是辅助texture()函数获取纹理的纹素,而texture()函数有两个参数,一个是纹理坐标,另外一个就是sampler修饰的纹理,由此可见,sampler是通过某些方法获取纹理的修饰符。

sampler之前,会有uniform通道来修饰,也即是说明,纹理采样器对应的采样或者说获取的纹理是不经常发生改变的量。

二、关于纹理单元

首先来明确一个概念,通常情况下,一个纹理的位置,我们通常称其为纹理单元,一个纹理的默认纹理单元是0,通常情况下,这个默认的纹理单元0是激活的。

纹理单元的主要目的是让我们可以在着色器中可以使用多于1个的纹理。

在激活了相应的纹理单元位置以后,我们可以通过把纹理单元赋值给纹理采样器,从而将纹理采样器获取到的纹理赋值到纹理单元上。激活纹理单元的方式是:

glActiveTexture(GL_TEXTURE0);
参数传入我们需要激活的纹理单元。
GL_TEXTURE0默认就是激活状态的。

上面也说了,纹理采样器和纹理是一一对应的,那么纹理和纹理单元也就要一一对应,就需要进行绑定。绑定纹理到对应激活的纹理单元的方法是:

glBindTexture(GL_TEXTURE_2D,texure);
参数第一个是纹理的维度,第二个就是纹理。

OpenGL保证了16个纹理单元供我们选择使用,超过16个的话,就自己想办法吧,即GL_TEXTURE0~GL_TEXTURE15。纹理单元是有顺序定义的,所以在使用连续的纹理单元的时候,可以使用循环的方式,例如:想要获取纹理单元6,可以直接写GL_TEXTURE + 6

三、关于多纹理的混合

如果我们需要使用多个纹理,那么在设置gl_FragColor这个内建变量的时候,可以选择使用mix()这个GLSL的内建函数来达到混合的目的。

如:(提示,不要在.fsh里面写注释,这里是没有办法)

//纹理坐标
varying vec2 varyTextCoord;
//纹理单元1
uniform sampler2D textureUnit1;
//纹理单元2
uniform sampler2D textureUnit2;

void main()
{
    gl_FragColor = mix(texture(textureUnit1,varyTextCoord),texture(textureUnit2,varyTextCoord),0.6);
}

mix函数参数解析:

(1). 第一个参数是获取纹理单元1的纹理采样值
(2). 第二个参数是获取纹理单元2的纹理采样值
(3). 第三个参数是混合比例,按照比例进行线性插值。

比如,如果第三个参数设置的是0.6,那么就会按照纹理单元1的40%和纹理单元2的60%进行线性插值。

如果第三个参数设置为0,则全部使用第一个纹理单元的颜色,如果第三个参数为1,那么全部使用第二个纹理单元的颜色。

另外,因为有两个纹理单元,所以除了第一个默认开启的纹理单元0以外,我们要激活第二个纹理单元,并且绑定纹理和纹理单元。

glBindTexture(GL_TEXTURE2D,0);
glUniform1i(glGetUniformLocation(self.program, "textureUnit1"), 0);

glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE2D,1);
glUniform1i(glGetUniformLocation(self.program, "textureUnit2"),1);

glUniform1i函数则是保证纹理单元和uniform sampler2D互相一一对应。即:
纹理单元0对应着纹理采样器textureUnit1采样的纹理。
纹理单元1对应着纹理采样器textureUnit2采样的纹理。

相关文章

  • 第十二节—关于纹理单元

    本文为L_Ares个人写作,包括图片皆为个人亲自操作,如需转载请表明原文出处。 一、关于纹理采样器Sampler ...

  • 纹理单元

    最近在学习OpenGL,把学习的一些过程写在这里,希望与大家共同分享讨论。欢迎光临我的个人网站Orient一起讨论...

  • 第十八节—关于多纹理单元渲染

    本文为L_Ares个人写作,如需转载请表明原文出处。 关于多纹理单元传入FragmentShader进行渲染的话,...

  • OpenGL ES渲染视频之数据流

    相关概念 纹理纹理(Texture)纹理是一种图形数据,在OpenGL中可以简单理解成是一张图片纹理单元纹理的操作...

  • glTexParameter

    设置纹理参数 指定活动纹理单元的目标纹理,必须是GL_TEXTURE_2D GL_TEXTURE_CUBE_MAP...

  • WEBGL编程指南之纹理

    1.创建纹理对象的步骤 1.创建纹理对象(gl.createTexture())2.开启纹理单元(gl.activ...

  • OpenGL ES《五》,多重纹理

    上一节我们都使用一张图片,如果多张图片,在一个位置显示呢?这时候就需要用到多重纹理,将多张图片开辟多个纹理单元,通...

  • OpenGL 纹理

    纹理常用的函数 纹理只是一种能够应用到场景中的三角形上的图像数据。它经过过滤的纹理单元(texel,相当于基于纹理...

  • OpenGL-基础纹理概览

    纹理是一种能够应用到场景中的三角形上的图像数据 纹理通过经过滤的纹理单元(texel,相当于纹理的像素)填充到实心...

  • 感知身体功课第十二天

    5号玫瑰 第十二天 柚子 拿在手中把玩 观看她细致的纹理 透明 透亮 饱满 慢慢放入口中 舌头触碰划过纹理可以感觉...

网友评论

    本文标题:第十二节—关于纹理单元

    本文链接:https://www.haomeiwen.com/subject/kbsiyktx.html