您的位置:首页 > 运维架构

glActiveTexture

2015-07-20 19:04 288 查看
GLSL的很多信息都是英文的,即使有中文资料大多都是照搬书或者是直接复制的官方SDK的Google解释。这里给出一些GLSL应用纹理的基础知识

首先是 glActiveTexture(GL_TEXTURE0+i);

glBindTexture(texTarget, texture[i]);

关于glActiveTexture这个函数,在多重纹理当中,最好让他的GL_TEXTUREi和实际纹理数组序号一致,因为一旦你在某个纹理上绑定了glActiveTexture,那么后面要取消掉就非常困难,反正我试了好多次都没有成功。

然后是 texLoc   = glGetUniformLocation(p2, "tex0");  //tex0用于在GLSL中定义采样器名称

glUniform1i(texLoc, 2);//texLoc在获得定位之后,被glUniform1i绑定至GLSL

这里的tex0和你GLSL中的tex0是对应的,如果你有多个纹理,可以将其命名为tex1,tex2..等等,只要保证和GLSL里面的一致就可以。但是如果你在多个FBO中用的话,显然tex12这样的命名会给你的GLSL编写带来烦恼,所以在每个shader program里面,你可以独立的指定。比方说在一个shader program0中的,你要把纹理0和纹理1处理下,那么把他们命名为tex0和tex1;接下来你要在shader program1中,处理纹理3和纹理4,那么也可以把他们也命名为tex0和tex1,和之前的不存在冲突,这个是实测的结果。这样的好处是,不用在编写某个GLSL的时候,还要记得自己用了多少个tex

至于glUniform1i,这个网上也很少有个人理解的解释。其实它是指定了一个一致性变量,具体的含义不说了,重点说说glUniform1i(texLoc, 2)中2的含义。官方SDK说是Specifies the new values to be used for the specified uniform variable.是什么意思呢?其实texLoc这个变量是可以复用的,多个纹理都可以用他作为location传入,但是不同的是,这个type必须保持不一致。你可以把他看成是第一个location,第二个location等等,如果type重复了,那就意味着纹理的入口位置被重叠了,所以在不太理解这个type的含义之前,保持它的递增

做完上面两个步骤,就可以进入GLSL函数编写了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  OpenGL