第十二节—关于纹理单元

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第十二节—关于纹理单元相关的知识,希望对你有一定的参考价值。

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

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

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

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

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

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

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

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

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

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

mix 函数参数解析:

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

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

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

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

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

以上是关于第十二节—关于纹理单元的主要内容,如果未能解决你的问题,请参考以下文章

vue.js项目实战运用篇之抖音视频APP-第十二节: 用户信息页面功能

vue.js项目实战运用篇之抖音视频APP-第十二节: 用户信息页面功能

《构建之法》第十十二章学习总结

ES6 第十二节 Symbol在对象中的作用

centos mysql 优化 第十二节课

UI第十二节