Я очень новичок в 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
чтобы достичь этого. Другой вариант – использовать данные текстуры для передачи информации шейдерам. Здесь один тексель может соответствовать цвету камеры одного объекта.