2012-07-16 102 views
3

在我的場景中,我有很多對象,我想同時旋轉但在不同的角度。OpenGL着色器。傳遞float數組

我有一個着色器,計算每個對象的位置並繪製整個場景(將頂點數組傳遞到具有頂點數組的着色器中)。

"uniform float uRotation;" + 
    ... 
    " mat4 mz = mat4(1.0);" + 
    " mz[0][0] = cos(rotation);" + 
    " mz[0][1] = sin(rotation);" + 
    " mz[1][0] = -sin(rotation);" + 
    " mz[1][1] = cos(rotation);" + 
    ... 
    gl_Position = uMVPMatrix * (aPosition *mz); 

我有我的所有頂點,索引,在陣列的顏色等(未1個陣列爲每個對象,但1個陣列爲頂點偏移,一個用於顏色等)。

我想在一個float []中傳遞浮點數(每個「對象」的角度),但沒有什麼是happinig。

public void setRotations(float[] rotations) 
    { 
     GLES20.glUniform3fv(muRotation, rotations.length, rotations, 0);  
    } 

如果通過並只使用一個浮子,一切都可以。我想要繪製20個矩形(我有一個vetrex數組:浮點數[20 * 3 * 4]),因爲我知道我必須爲每個頂點浮動:旋轉:float [20 * 4])?

更新:

我嘗試通過陣列作爲紋理。

當我在場景中創建資源 - 我嘗試創建我的陣列(稱爲掩模):在

mask = new float[512*512*4]; 
    for (int i = 0; i < mask.length; i++) 
    { 
     mask[i] = 2f; 
    } 

    GLES20.glActiveTexture(GLES20.GL_TEXTURE1); 
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 1029384756); 
    GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 1, GLES20.GL_RGBA, 512, 512, 0, GLES20.GL_RGBA, GLES20.GL_FLOAT, FloatBuffer.wrap(mask)); 
    GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR); 
    GLES20.glActiveTexture(GLES20.GL_TEXTURE0); 

然後當我在現場,我使用着色器繪製新的項目,並試圖通過我的數組:

setShaderProgram(ShaderProgram.getInstance()); 

    GLES20.glActiveTexture(GLES20.GL_TEXTURE1); 
    GLES20.glUniform1i(ShaderProgram.sUniformMask, GLES20.GL_TEXTURE1); 
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 1029384756); 
    GLES20.glActiveTexture(GLES20.GL_TEXTURE0); 

但是當我試圖從陣列檢查任何價值,如果它> 0.5計算每一個給我

修訂

片段着色器包含:

"uniform sampler2D " + ShaderProgramConstants.UNIFORM_TEXTURE_0 + ";\n" + 
"uniform sampler2D " + ShaderProgramConstants.UNIFORM_TEXTURE_1 + ";\n" + 
"varying mediump vec2 " + ShaderProgramConstants.VARYING_TEXTURECOORDINATES + ";\n" + 

"void main() {\n" + 
"vec4 color = texture2D(" + ShaderProgramConstants.UNIFORM_TEXTURE_0 + ", " + ShaderProgramConstants.VARYING_TEXTURECOORDINATES + ");\n" + 
"vec4 mask = texture2D(" + ShaderProgramConstants.UNIFORM_TEXTURE_1 + ", " + ShaderProgramConstants.VARYING_TEXTURECOORDINATES + ");\n" + 
"float maskVal = mask.r;\n" ... 

顏色和掩碼紋理具有相同的尺寸

+0

你可以通過你的數組作爲一維texture.You也可以通過制服作爲UBO塊,但它不會幫助你多少,如果你的陣列大。最好的方法是填充紋理併發送。 – 2012-07-16 12:53:13

+0

我已經有每個元素的紋理,我不明白你的意思。也許你有一些好的教程鏈接?謝謝。 – dilix 2012-07-17 08:46:03

+0

實際上你應該檢查一下ES是否支持一維紋理。你的數組值是否爲glTexImage1D,並使用GL_TEXTURE_1D類型的目標。然後你可以在着色器中讀取它。我是基於OpenGL桌面API編寫的。檢查你是否可以做它在ES。 – 2012-07-17 09:11:35

回答

2

GLES20.glUniform1i(ShaderProgram.sUniformMask, GLES20.GL_TEXTURE1);

如果這是你的採樣均勻,應改爲:

GLES20.glUniform1i(ShaderProgram.sUniformMask, 1);(不是GL_TEXTURE1)

類似的sampler0:

GLES20.glUniform1i(ShaderProgram.sUniformMask, 0);

+0

我也試過這個,但沒有改變=( – dilix 2012-08-12 09:21:38

+0

也許像glGentexture需要? – dilix 2012-08-12 10:43:59

+1

你檢查glGetError的任何錯誤?@dilix – Tim 2012-08-15 20:33:49