我對OpenGl和着色器一般都很陌生。我想在片段着色器中使用我的java代碼中的靜態int數組來操縱相機的顏色。有沒有辦法將我的int數組傳遞給着色器,或者讓着色器能夠以某種方式訪問我的數組?如何將int數組傳遞給Android OpenGl片段着色器
謝謝, 邁克
我對OpenGl和着色器一般都很陌生。我想在片段着色器中使用我的java代碼中的靜態int數組來操縱相機的顏色。有沒有辦法將我的int數組傳遞給着色器,或者讓着色器能夠以某種方式訪問我的數組?如何將int數組傳遞給Android OpenGl片段着色器
謝謝, 邁克
使用你的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);
既然你試圖操縱攝像機的色彩,我假設你正在試圖通過一個小的數組片段着色器(可能是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
的調用來實現此目的。另一種選擇是使用紋理數據將信息傳遞給着色器。這裏,一個紋理元素可以對應一個物體的相機顏色。
感謝例子。它實際上是一個非常大的陣列(約516 * 516),但這會有所幫助! – MikeShiny
如何找出我可以用於陣列的最大尺寸是多少?謝謝 –