Не удается использовать несколько текстур во фрагменте - PullRequest
0 голосов
/ 01 марта 2019

В моем фрагментном шейдере я объявляю массив текстур следующим образом: 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].

Проблема, с которой я сталкиваюсь, состоит в том, что только последняя загруженная текстура дает правильный результат, а все остальные отображаются как черные!

Что я делаю не так?

1 Ответ

0 голосов
/ 01 марта 2019

Ваши более ранние текстуры неполны;Вы определяете параметры фильтрации только после окончания цикла, поэтому фильтрация определяется только для последней текстуры.

Переместите это внутри цикла, где вы устанавливаете каждую текстуру:

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...