2012-08-09 50 views
3

我在場景上有一個大的Sprite - 例如200x200,在應用程序中我有一個數組[200] [200],其中我爲每個像素存儲0或1精靈。Andengine爲精靈中的每個像素設置了阿爾法

我想繪製一個更多紋理精靈(例如10x10)高於現有的一個,但我想計算eache像素在新的精靈如果它需要繪製它在這個場景取決於提供的數組(如果在相應的位置在數組中的新精靈像素是'1' - 我需要繪製這個像素,如果'0' - 我不想繪製它(也許設置alpha = 0))。

我想我可以爲每個新的精靈使用片段着色器,但我無法理解如何向着色器提供數組數據以計算每個像素的顏色。 我覺得也可以在整個場景中使用片段着色器(如果渲染爲紋理)。

我在opengl中很新,不知道移動方式。

當我創建的場景資源 - 我嘗試創建我的面具:當我在現場繪製新的項目,我使用着色器

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(RadialBlurExample.RadialBlurShaderProgram.sUniformMask, GLES20.GL_TEXTURE1); 
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 1029384756); 
    GLES20.glActiveTexture(GLES20.GL_TEXTURE0); 

,但我不能在場景中查看新項目(maskVal是< 0.5)。

我試圖找到工作方式來傳遞數組作爲紋理,但我找不到它。

回答

3

將您的數組上傳爲與精靈尺寸相同的第二個紋理,然後在繪製精靈時,在同一個texcoord處對第二個紋理進行採樣。

如果第二個紋理不符合面具標準,丟棄片段

uniform sampler2d sprite; 
uniform sampler2d mask; 
in vec2 uv; 
main() { 

    float maskVal = texture2D(mask, uv).r; 
    if(maskVal > 0.5) { 
     gl_FragColor = texture2D(sprite,uv); 
    } else { 
     discard; 
    } 
} 
+0

謝謝你 - 這是一個好主意,但我怎麼知道 - 「如果」是OpenGL的非常繁重的操作,我想在這種情況下,像「step」一樣適用。如果對我來說一切正常,我會試試並標記爲答案。 – dilix 2012-08-10 07:44:31

+1

@dilix那麼如果你不想畫像素,那麼你必須使用'discard'語句,你必須把它放在一個if塊中。 – Tim 2012-08-10 08:01:51

+0

我不能繪製它,但使其透明? – dilix 2012-08-10 08:06:10