Невозможно запустить две шейдерные программы вместе, однако каждая из них работает нормально, если используется одна - PullRequest
1 голос
/ 16 января 2020

Хорошо, душил с этим в течение 2 дней. У меня есть небольшое приложение GLES2 / Android ... два объекта (оба квадратные, но только один имеет координаты текстуры). У меня есть две шейдерные программы, одна имеет дело с текстурами и их координатами, другая просто использует цвет во фрагментном шейдере.

, когда я пытаюсь только визуализировать один из этих объектов (и компилировать и связывать только одну шейдерную программу) все работает нормально, когда я делаю это для обоих объектов, отображается только 2-й объект (текстурированный квадрат). Да, я переключаю Shader Program перед тем, как рендерить соответствующий объект. Стоит отметить одну вещь. когда я отлаживаю; указатель атрибута vertix в одной программе шейдера = 0 = указатель атрибута текстуры в другой программе ниже - это некоторый код.

1 Ответ

0 голосов
/ 16 января 2020

Проблема в том, что массив данных атрибутов вершин для координат текстуры (индекс TexturePositionHandle) включается при рисовании первого объекта.
Обратите внимание, OpenGL - это механизм состояний, и состояние сохраняется, если оно есть. изменилось снова, даже за пределами фреймов.

Необходимо включить массив атрибутов вершин generi c, необходимый для программы шейдера, и убедиться, что другие массивы атрибутов вершин отключены, когда объект нарисовано:

GLES20.glEnableVertexAttribArray(VertexPositionHandle);
GLES20.glDrawElements(GLES20.GL_TRIANGLES, indices.length, GLES20.GL_UNSIGNED_SHORT, 
                      indicesBuffer);
GLES20.glDisableVertexAttribArray(VertexPositionHandle);
GLES20.glEnableVertexAttribArray(VertexPositionHandle);
GLES20.glEnableVertexAttribArray(TexturePositionHandle);
GLES20.glDrawElements(GLES20.GL_TRIANGLES, 6, GLES20.GL_UNSIGNED_SHORT, 0);
GLES20.glDisableVertexAttribArray(VertexPositionHandle);
GLES20.glDisableVertexAttribArray(TexturePositionHandle);
...