无法在片段中成功使用多个纹理
Can't succeed in using multiple textures in a fragment
在我的片段着色器中,我声明了一个纹理数组,如下所示:uniform sampler2D textures[7];
。
这个数组加载了我想使用的 Open GL 纹理索引:GLES31.glUniform1iv(handleOnTextures, 7,new int [] {0,1,2,3,4,5,6);
因为我想用 GL_TEXTURE0
到 GL_TEXTURE6
。
在我的onSurfaceCreated
函数中,我以这种方式加载纹理:
handleOnTextureNames= new int[textureArray.length];
GLES31.glGenTextures(textureArray.length, handleOnTextureNames, 0);
if (handleOnTextureNames[0] != 0) {
options = new BitmapFactory.Options();
options.inScaled = false;
for (t = 0; t < textureArray.length; t++) {
GLES31.glActiveTexture(GLES31.GL_TEXTURE0+t);
GLES31.glBindTexture(GLES31.GL_TEXTURE_2D, handleOnTextureNames[t]);
image = BitmapFactory.decodeResource(getContext().getResources(), textureArray[t], options);
GLUtils.texImage2D(GLES31.GL_TEXTURE_2D, 0, image, 0);
image.recycle();
}
} else {
throw new RuntimeException("Error!");
}
GLES31.glTexParameteri(GLES31.GL_TEXTURE_2D, GLES31.GL_TEXTURE_MIN_FILTER, GLES31.GL_NEAREST);
GLES31.glTexParameteri(GLES31.GL_TEXTURE_2D, GLES31.GL_TEXTURE_MAG_FILTER, GLES31.GL_NEAREST);
为了定义我想在着色器执行过程中使用哪个纹理,我使用 :
向它传输了一个索引
GLES31.glUniform1i(handleOnTextureIndice, idTexture);
idTexture 的范围从 0 到 6,具体取决于我要使用的纹理。
在片段着色器中,为了计算片段颜色,纹理是这样访问的:textures[textureIndice]
。
我面临的问题是,只有最后加载的纹理给出了正确的结果,而所有其他纹理都呈现为黑色!
我做错了什么?
您之前的贴图不完整;您只在循环结束后指定过滤参数,因此只有最后一个纹理定义了过滤。
将其移到设置每个纹理的循环中:
GLES31.glTexParameteri(GLES31.GL_TEXTURE_2D, GLES31.GL_TEXTURE_MIN_FILTER, GLES31.GL_NEAREST);
GLES31.glTexParameteri(GLES31.GL_TEXTURE_2D, GLES31.GL_TEXTURE_MAG_FILTER, GLES31.GL_NEAREST);
在我的片段着色器中,我声明了一个纹理数组,如下所示:uniform sampler2D textures[7];
。
这个数组加载了我想使用的 Open GL 纹理索引:GLES31.glUniform1iv(handleOnTextures, 7,new int [] {0,1,2,3,4,5,6);
因为我想用 GL_TEXTURE0
到 GL_TEXTURE6
。
在我的onSurfaceCreated
函数中,我以这种方式加载纹理:
handleOnTextureNames= new int[textureArray.length];
GLES31.glGenTextures(textureArray.length, handleOnTextureNames, 0);
if (handleOnTextureNames[0] != 0) {
options = new BitmapFactory.Options();
options.inScaled = false;
for (t = 0; t < textureArray.length; t++) {
GLES31.glActiveTexture(GLES31.GL_TEXTURE0+t);
GLES31.glBindTexture(GLES31.GL_TEXTURE_2D, handleOnTextureNames[t]);
image = BitmapFactory.decodeResource(getContext().getResources(), textureArray[t], options);
GLUtils.texImage2D(GLES31.GL_TEXTURE_2D, 0, image, 0);
image.recycle();
}
} else {
throw new RuntimeException("Error!");
}
GLES31.glTexParameteri(GLES31.GL_TEXTURE_2D, GLES31.GL_TEXTURE_MIN_FILTER, GLES31.GL_NEAREST);
GLES31.glTexParameteri(GLES31.GL_TEXTURE_2D, GLES31.GL_TEXTURE_MAG_FILTER, GLES31.GL_NEAREST);
为了定义我想在着色器执行过程中使用哪个纹理,我使用 :
向它传输了一个索引GLES31.glUniform1i(handleOnTextureIndice, idTexture);
idTexture 的范围从 0 到 6,具体取决于我要使用的纹理。
在片段着色器中,为了计算片段颜色,纹理是这样访问的:textures[textureIndice]
。
我面临的问题是,只有最后加载的纹理给出了正确的结果,而所有其他纹理都呈现为黑色!
我做错了什么?
您之前的贴图不完整;您只在循环结束后指定过滤参数,因此只有最后一个纹理定义了过滤。
将其移到设置每个纹理的循环中:
GLES31.glTexParameteri(GLES31.GL_TEXTURE_2D, GLES31.GL_TEXTURE_MIN_FILTER, GLES31.GL_NEAREST);
GLES31.glTexParameteri(GLES31.GL_TEXTURE_2D, GLES31.GL_TEXTURE_MAG_FILTER, GLES31.GL_NEAREST);