Как передать int массив в шейдер Android OpenGl

Я очень новичок в OpenGl и шейдерах в целом. Я хочу использовать статический массив int из моего java-кода в шейдере фрагментов, чтобы манипулировать цветом камеры. Есть ли способ передать в моем массиве int шейдер или просто заставить шейдер иметь доступ к моему массиву?

Спасибо, Майк

Правильный способ использования так называемого статического массива в вашем шейдерном коде – передать его как единое целое:

http://www.opengl.org/wiki/GLAPI/glUniform

В коде вашего шейдера вы указываете, что вам нужен внешний массив:

uniform int colors[3]; // Specify an array of 3 integers 

В вашем java-коде используйте это:

 int array[3] = {0, 1, 2}; int location = GLES20.glGetUniformLocation(program_id, "colors"); GLES20.glUniform1iv(location, 3, array, 0); 

Поскольку вы пытаетесь манипулировать цветом камеры, я предполагаю, что вы пытаетесь передать небольшой массив в шейдер фрагмента (возможно, 3 или 4 целых числа).

Поскольку на всех фрагментах, вероятно, есть только одна камера с одинаковым цветом, самый простой способ передать данные – использовать униформу . В вашем фрагменте объявите форму:

 uniform vec4 cameraColor; 

А затем в вашем Java-коде, получите местоположение униформы и передайте ему данные (это код на C ++, код Java может немного отличаться):

 GLint uniColorLocation = glGetUniformLocation( shaderProgram, "cameraColor" ); glUniform4i( uniColorLocation, array[0], array[1], array[2], array[3] ); 

Если вы хотите передать много цветов в шейдер фрагмента, вы можете использовать атрибуты фрагментов (ins) для передачи данных. В коде Java вы должны использовать такие вызовы, как glVertexAttribPointer и glBufferData чтобы достичь этого. Другой вариант – использовать данные текстуры для передачи информации шейдерам. Здесь один тексель может соответствовать цвету камеры одного объекта.