纹理对象包含着纹理贴图自身的数据,比如:纹素。
纹理对象并不是直接绑定到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’等等。你可以创建任意数量的这种取样器一致变量,并在应用中将纹理单元的值赋给他们。
最后一个概念是取样器对象。不要和取样器一致变量混淆,他们是不同的东西。纹理对象是同时包含有纹理数据和配置取样操作的参数的,这些参数是取样状态的一部分。然而,你也可以创建一个取样对象,用取样状态来配置它并绑定到纹理单元上,这样取样器对象将覆盖纹理对象中定义的所有取样状态。


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

被折叠的 条评论
为什么被折叠?



