2016-06-14 59 views
2

我正在使用Allegro 5編寫遊戲,目前正在研究我的繪圖算法。經過計算,我得到兩個ALLEGRO_BITMAP*-對象,其中一個是我的「場景」,其上繪製地形,另一個是陰影圖。有沒有辦法在Allegro中部分色調位圖?

場景只是在位圖上繪製的遊戲元素的紋理。 陰影貼圖是一種位圖,對於先前呈現的陰影使用淺色和白色的黑色。

爲了在屏幕上繪製這些位圖,我使用al_draw_scaled_bitmap(...)al_set_blender(ALLEGRO_DEST_MINUS_SRC, ALLEGRO_ONE, ALLEGRO_ONE)來減去場景中陰影貼圖的白色元素以使它們可見。

我遇到的問題是,我希望陰影貼圖上的所有像素都被着色爲世界顏色,這已經在以前的每一幀中計算過了,並且所有黑色元素都不會被修改(灰色意味着部分着色)。

對於rgb中的紅色,綠色和藍色通道,最終顏色可以像p.r * c.r + 1 - p.rp = the pixel-color on the scenec = the world-color那樣計算。

有沒有辦法在Allegro 5(可能沒有大量透支)中實現部分着色效果

我想過使用着色器,但我還沒有找到解決方案來實現這些與我的ALLEGRO_BITMAP*對象。

+0

你可以將你的位圖分成子位圖,但我認爲這不是你想要的。你能包括一些照片嗎?兩個將工作,你現在擁有什麼,你想擁有什麼。 – rlam12

回答

3

Allegro的攪拌機相當簡單,所以您需要爲此設置着色器。只需編寫一個着色器,並在完成後繪製陰影貼圖al_use_shader着色器,然後al_use_shader(NULL)。着色器可以使用默認的頂點源,您可以使用al_get_default_shader_source。所以你只需要編寫片段着色器。你的片段着色器應該有一個uniform vec4這是色調。您還將擁有x,y浮點數,它們表示目標的x和y值。它也會有一個採樣器,它是場景位圖(應該是目標,因爲您正在繪製它)。你會從採樣器的x,y(x和y應該是從0到1,你可以通過使用xpixel/width(與y相同))得到這些樣本,然後用輸入顏色進行計算,然後存儲gl_FragColor(本文假定您使用的是GLSL(OpenGL)的結果,同樣的原則適用於Direct3D。)在Allegro源代碼的src/shader_source.inc中查看默認着色器以獲取有關編寫着色器的更多信息。

+0

謝謝,我會試一試! – 0liCom

+0

+1工作正常,即使我已經改變了一點,並使用了一個backbuffer位圖,其中已經繪製了所有內容以計算陰影並將其繪製到顯示器後臺緩衝區。仍然可以改進,但它的工作原理,這是我想要的一切,性能足夠好 – 0liCom

相關問題