2012-07-05 114 views
2

我試圖實現與點精靈的煙花,然後通過將煙花渲染到兩個不同的紋理,然後繪製它們回到對方每隔一次與alpha設置爲< 1,使得以前的每張畫都越來越消失。渲染紋理和路徑不消失

它看起來不錯,並且取決於我繪製之前渲染的紋理時使用的alpha值,路徑變得更長或更短,如預期的那樣。但是,在大多數設備上(並非全部),這些路徑從不會完全消失。他們應該消失後,他們留下了非常透明但仍然明顯的痕跡。

這是我目前做的:

取決於所謂的第二布爾我設置的幀緩衝渲染兩個紋理稱爲BUFF1和buff2之一。

((GL11ExtensionPack)gl).glBindFramebufferOES(GL11ExtensionPack.GL_FRAMEBUFFER_OES, myFBO.get(0)); 
if (second){ 
    ((GL11ExtensionPack)gl).glFramebufferTexture2DOES(GL11ExtensionPack.GL_FRAMEBUFFER_OES, GL11ExtensionPack.GL_COLOR_ATTACHMENT0_OES, GL10.GL_TEXTURE_2D, buff2.texture.textureId, 0); 
} else { 
    ((GL11ExtensionPack)gl).glFramebufferTexture2DOES(GL11ExtensionPack.GL_FRAMEBUFFER_OES, GL11ExtensionPack.GL_COLOR_ATTACHMENT0_OES, GL10.GL_TEXTURE_2D, buff1.texture.textureId, 0); 
} 
gl.glViewport(0, 0, bufferSize, bufferSize); 
gl.glClearColor(0, 0, 0, 0); 
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); 
gl.glBlendFunc(GL10.GL_ONE, GL10.GL_ONE_MINUS_SRC_ALPHA); 

然後我渲染對當前一個先前繪製的質地,使用α值< 1.拋光輪對象只是一個幫手繪製與紋理四邊形。繪圖函數預先將alpha與其他顏色通道相乘。

// a = alpha, higher value = longer trails = more distinct leftovers 
if (second){ 
    buff1.setColor(1, 1, 1, a); 
    buff1.draw(gl); 
    second = false; 
else { 
    buff2.setColor(1, 1, 1, a); 
    buff2.draw(gl); 
    second = true; 
} 

之後,我做了點精靈煙花的繪製。還使用預乘alpha和gl.glBlendFunc(GL10.GL_ONE,GL10.GL_ONE_MINUS_SRC_ALPHA);

最後,我重置幀緩衝區,並讓我的新紋理包含舊的路徑褪色和當前在100%alpha處繪製的煙花。然後,我使用這個紋理將煙花紋理背後和前面的所有其他物體一起繪製到場景中。

正如我所說,幾乎所有的東西都在起作用,除了那些幾乎透明的小徑應該消失後留下。繪製前一個緩衝區的alpha值越高,那些永遠留下的蹤跡「剩飯剩菜」就越顯着。

我一直在嘗試不同的混合模式,預乘和不是預倍乘的alpha等等。但由於這是一個android opengl es 1.1,我認爲混合應該是GL_ONE和GL_ONE_MINUS_SRC_ALPHA,因爲所有的位圖都是默認預乘。

我在做什麼錯?有一個更好的方法嗎?

感謝您的幫助, 安德斯

回答

2

我在做什麼錯?

總結縮小比例(在他們的值)圖像的方式實際上是一個冪級數,指出你的alpha值。這樣的權力系列將減少到零,但從未達到它。

有沒有更好的方法來做到這一點?

其實這是正確的做法。你只是忘了最後一步:你想添加一些閾值,這樣低於某個alpha值的值就會被鉗位到零。最容易的是,添加一個GL_GREATER alpha測試就可以獲得這個測試,閾值略高於您想要移除的路徑的alpha值。

+0

謝謝!這就是訣竅!在某種程度上,是否有可能用一個靜態值來減少先前紋理的alpha值(逐個像素),比如說每個通道都是0.01?這樣,在給定次數的抽籤後,阿爾法應該總是達到零。 – cmbellman 2012-07-05 13:54:52

+0

@您可以通過首先將混合方程式切換爲減法,用黑色四邊形繪製紋理,使用要減去的alpha值和混合方程(GL_SRC_ALPHA,GL_ONE)來完成此操作。然後切換回添加混合。儘管如此,我不得不自己修改一下。 – datenwolf 2012-07-05 19:03:05

+0

嗯..我不是很熟悉不同的blendfunc選項,但真的會減去嗎?那不是src_color * src_alpha + dst_color?當我看着blencfunc選項時,我真的無法真正看到減法的方法,只能乘以(最終會得到與我已有的結果相同的結果)... – cmbellman 2012-07-06 10:30:04