在m y片段着色器中,我声明了一个像这样的纹理数组:uniform sampler2D textures[7];
。
这个数组加载了我想要使用的Open GL纹理索引:GLES31.glUniform1iv(handleOnTextures, 7,new int [] {0,1,2,3,4,5,6);
因为我想用GL_TEXTURE0
来GL_TEXTURE6
。
在我的onSurfaceCreated
function中,我以这种方式加载纹理:
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);