2013-01-06 89 views
3

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

谢谢, 迈克

回答

5

使用你的shader代码中所谓的静态数组正确的方法是把它作为一个统一:

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

如何找出我可以用于阵列的最大尺寸是多少?谢谢 –

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的调用来实现此目的。另一种选择是使用纹理数据将信息传递给着色器。这里,一个纹理元素可以对应一个物体的相机颜色。

+1

感谢例子。它实际上是一个非常大的阵列(约516 * 516),但这会有所帮助! – MikeShiny

相关问题