如何将int数组传递给Android OpenGl片段着色器

时间:2013-01-06 23:53:52

标签: android opengl-es shader

我对OpenGl和着色器一般都很陌生。我想在片段着色器中使用我的java代码中的静态int数组来操作相机的颜色。有没有办法将我的int数组传递给着色器或只是让着色器能够以某种方式访问​​我的数组?

谢谢, 麦克

2 个答案:

答案 0 :(得分:5)

在着色器代码中使用所谓静态数组的正确方法是将其作为Uniform传递:

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);

答案 1 :(得分:3)

由于您试图操纵相机的颜色,我假设您正在尝试将一个小数组传递到片段着色器(可能是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代码中,您可以使用glVertexAttribPointerglBufferData等调用来实现此目的。另一种选择是使用纹理数据将信息传递给着色器。在这里,单个纹素可以对应一个对象的相机颜色。