我是Android的OpenGl的漂亮初学者。我正在使用Android的GPUImage在图像上应用滤镜。但是,我的片段着色器需要三个输入位图才能产生输出。
uniform sampler2D inputImageTexture;
uniform sampler2D inputImageTexture2;
uniform sampler2D inputImageTexture3;
uniform float intensity;
但是据我所知GPUImage支持GPUImageTwoInputFilter。因此,应该为同一着色器提供三个位图的程序。或者有任何简单的方法可以将OpenGL用于此任务。
您必须将每个纹理对象绑定到不同的纹理单元。可以通过glActiveTexture
选择纹理单位。
这意味着如果您有3个纹理对象glActiveTexture
,t1
和t2
,则(伪代码):
t3
纹理单元的编号必须设置为纹理采样器统一的。制服的编号是纹理对象和采样器制服的绑定点。
通过glActiveTexture(GL_TEXTURE0)
glBindTexture(GL_TEXTURE_2D, t1)
glActiveTexture(GL_TEXTURE1)
glBindTexture(GL_TEXTURE_2D, t2)
glActiveTexture(GL_TEXTURE2)
glBindTexture(GL_TEXTURE_2D, t3)
获取制服的资源(位置)索引,并通过glGetUniformLocation
设置绑定点。例如(伪代码和):
glGetUniformLocation
[
glUniform1i
是着色器程序对象。
glUniform1i
0、1和2是绑定点,它们是纹理单元
GLint loc_t1 = glGetUniformLocation(program, "inputImageTexture") GLint loc_t2 = glGetUniformLocation(program, "inputImageTexture2") GLint loc_t3 = glGetUniformLocation(program, "inputImageTexture3")
,program
和glUniform1i(loc_t1, 0) glUniform1i(loc_t2, 1) glUniform1i(loc_t3, 2)
的编号。