纹理单元、纹理对象、纹理类型、取样器对象

本文详细介绍了OpenGL中的纹理对象、纹理单元、纹理类型和取样器对象的概念及使用流程。纹理对象包含纹素数据,通过绑定到纹理单元供shader使用。每个纹理单元可以绑定多个纹理对象,不同目标类型的纹理。激活纹理单元后,使用glBindTexture指定使用哪个纹理对象。采样操作在片段着色器中完成,取样器一致变量用于指定纹理单元。此外,取样器对象可以独立配置取样状态,覆盖纹理对象的设置。

纹理对象包含着纹理贴图自身的数据,比如:纹素。

纹理对象并不是直接绑定到shader上的(事实上是采样阶段发生的地方),而是绑定到‘纹理单元’上,‘纹理单元’的索引会被传到shader中,因此shader是通过纹理单元得到纹理对象的。一般可以同时有多个可用的纹理单元,数量上限取决于显卡的容量。为了将一个纹理对象A绑定到纹理单元0上,首先你需要激活纹理单元0然后绑定纹理对象A。

应该是纹理对象直接绑定到shader中的uniform变量上的,参考https://mp.youkuaiyun.com/postedit/88084484

纹理单元有活动之分(glActiveTexture(GL_TEXTURE0)),shader会从当前活动的纹理单元中的纹理对象中取值。

纹理单元一般用GL_TEXTUREi(i是显卡相关的一个数)表示,但是传给着色器的纹理单元一般是i。参考https://mp.youkuaiyun.com/postedit/88084484

glActiveTexture(GL_TEXTURE11);
glGenTextures(1, &m_textureObj);
glBindTexture(m_textureTarget, m_textureObj);
glTexImage2D(m_textureTarget, 0, GL_RGB, m_pImage->width(), m_pImage->height(), -0.5, GL_RGBA, GL_UNSIGNED_BYTE, m_pImage->bits());
glTexParameterf(m_textureTarget, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(m_textureTarget, GL_TEXTURE_MAG_FILTER, GL_LINEAR);


glUniform1i(gSampler, 11);

二维纹理创建流程:创建纹理的过程主要是在GPU的内存中载入纹理图片

1.先使用glGenTextures函数生成一个纹理ID

2.使用glBindTexture(GL_TEXTURE_2D,.)函数绑定此纹理ID到OpenGL的GL_TEXTURE_2D渲染上下文中

3.使用glTexParameterf函数设置此纹理的过滤参数

4.使用glTexImage2D函数将CPU内存图像数据传输到GPU内存中同时也设置当前纹理的纹理id为刚刚生成的纹理id。此步完成了纹理图片在GPU内存中的载入。

5.glBindTexture(GL_TEXTURE_2D, 0); //将2D纹理绑定到默认的纹理,一般用于打破之前的纹理绑定关系,使OpenGL的纹理绑定状态恢复到默认状态,到此一个2维纹理创建完毕。

二维纹理使用流程:

1.先使用glGetUniformLocation函数获取fragmentShader内的uniform纹理变量

2.使用glUniform1i将获取的uniform纹理变量和某个纹理单元(纹理单元从0号纹理单元开始)对应起来

3.使用glActiveTexture函数激活某个纹理单元(例如激活0号纹理单元 0号纹理单元默认已经激活) glActiveTexture激活函数之后最好跟上glBindTexture绑定函数

4.使用glBindTexture函数将纹理绑定到使用glActiveTexture函数激活的那个纹理单元。

注意此步glBindTexture函数的意义和创建纹理时使用的此函数的意义不同,创建纹理时glBindTexture函数的意思是将GPU内的纹理数据和纹理id对应起来,既创建纹理时为载入纹理到此纹理id处,

而此处的glBindTexture函数的意义是绑定当前纹理id到激活的纹理单元。既此处为指定使用哪个纹理,以为一个纹理单元中可能有多个纹理对象,具体使用哪一个,需要通过这个函数进行指明。

在绑定纹理前必须要确保此纹理单元已经激活,0号纹理单元默认激活。

此时OpenGL 的rendering渲染上下文中的纹理就是使用glBindTexture函数绑定的纹理单元了。

 

 

 

 

事实上每个纹理单元可以同时绑定几个纹理对象,纹理又有不同的类型,类型叫做纹理对象的‘目标’。当你绑定一个纹理对象到一个纹理单元的时候,需要定义这个目标(1D,2D等等)。所以你可以将纹理对象A绑定到1D的目标上,同时纹理对象B绑定到同一个纹理单元的2D目标上。

采样操作通常发生在片段着色器中并通过一个特殊的函数来完成。采样函数需要知道从哪个纹理单元取样,因为在片断着色器中是可以从多个纹理单元中取样的,对此有一组特殊的一致变量(取样器一致变量),针对纹理目标:’sampler1D’, ‘sampler2D’, ‘sampler3D’, ‘samplerCube’等等。你可以创建任意数量的这种取样器一致变量,并在应用中将纹理单元的值赋给他们。

最后一个概念是取样器对象。不要和取样器一致变量混淆,他们是不同的东西。纹理对象是同时包含有纹理数据和配置取样操作的参数的,这些参数是取样状态的一部分。然而,你也可以创建一个取样对象,用取样状态来配置它并绑定到纹理单元上,这样取样器对象将覆盖纹理对象中定义的所有取样状态。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值