- 在openGL中,存在一系列的texture unit,通过 glActiveTexture激活当前的texture unit,默认的unit是0。而当前的texture unit中存在多个texture target,例如GL_TEXTURE_2D, GL_TEXTURE_CUBEMAP。
- 通过glBindTexture将一个texture object绑定到当前激活的texture unit的texture target上。然后通过glTexImage2D, glTexParameteri等函数改变texture object的状态。
- 创建texture object的时候需要指定texture unit吗?
并不需要,无论当前是哪个texture unit,不影响创建texture object。创建好的texture object可以绑定到其他texture unit的texture target上使用。 - 创建texture object后(glCreateTexture),第一次调用glBindTexture,决定了texture object的类型,比如调用的是glBindTexture(GL_TEXTURE_2D),那么这个texture object就是一个2d texture,其内部状态被初始化为2d texture的状态,它不能再被bind到其他类型的texture target上,否则会产生运行时错误。
- 什么时候需要关心texture unit?
当使用多重纹理的时候,也就是说在shader里面要同时使用多于一个sampler的时候。通过glUniform1i将texture unit传给sampler,让sampler知道应该去哪个texture unit中获取texture object,那么应该获取哪个texture target指向的texture object呢?这就要看sampler的类型了。比如sampler2D,就会获取sampler被指向的texture unit中的GL_TEXTURE_2D texture targert。 - 总结:
openGL中纹理的状态分为texture unit和texture object包含的状态。texture unit的状态包括当前激活的unit,每个unit下面的各个target分别指向哪些texture object。texture object的状态包含type, texParam, format等等。什么时候需要调用glActiveTexture以及glBindTexture就要看状态是否会改变。对于shader来说,他可以访问所有的texture unit中指定的texture object。只要你告诉他每个sampler使用哪个unit就行。如果每个unit的内容指定后不需要改变,则即便shader使用了多个sampler也不需要来回切换unit的状态。当然更常见的是渲染完一个pass后,需要改变当前texture unit中某target中的texture object,也就是需要换贴图了。那么标准的操作就是先glActiveTexture,然后glBindTexture。当然如果你只使用unit0,则不需要调用glActiveTexture。
glActiveTexture和glBindTexture
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 1 纹理基础 纹理是一种结构化的存储形式(Textures are a structured form of st...
- http://blog.csdn.net/wangdingqiaoit/article/details/51457...
- 今天在做glsl渲染yuv图像时,因为对glActiveTexture和glBindTexture的不熟,遇到了麻...