Posted on 2010-01-17 17:32
劍孤寒 閱讀(3740)
評論(10) 編輯 收藏 引用 所屬分類:
Galaxy2D 游戲引擎教程
在現在的3D游戲中有很多非常漂亮的Shader特效,比如爆炸產生的氣浪,水流過玻璃使后面的景物變得扭曲等。這些特效并不是3D游戲的專利,有很多特效其實也是可以用在2D游戲里的,今天這一節我們就來學習一下如何在Galaxy2D游戲引擎中使用PixelShader制作爆炸氣浪效果。
首先要判斷顯卡是否支持PixelShader,在OnInitiate()函數中添加:
if (System_GetState(GGE_PSVERSION) < PS_2_0) return false;
然后創建Shader和RenderTarget:
m_shaderFx = Shader_Load("shader.fx", "ShaderFx", PS_2_0);
m_fxTarget = Texture_Create(640, 480, true);
m_targetTex = Texture_Create(640, 480, true);
Shader_Load()函數用于載入Shader文件,第一個參數是Shader文件名,第二個參數指定Shader入口函數,第三個參數指定使用的Shader 版本,這里使用的是PS2.0。
RenderTarget就像一個臨時的畫布,我們可以將貼圖畫在某個RenderTarget上而不影響后臺緩存或其它的RenderTarget,常常用來做一些特殊效果,在這里m_fxTarget用于繪制NormalMap貼圖,m_targetTex用于繪制正常圖像,以便最后進行Shader合成。為了使用Shader還必須將m_shaderFx綁定到一個ggeSprite上:m_targetSpr->SetShader(m_shaderFx);
接下來在OnUpdate(float dt)里添加如下代碼:
if (Input_IsKeyDown(GGEK_SPACE))



{

m_alpha.a = 1; //氣浪強度

m_posX = Random_Int(256, 384);//氣浪中心點位置

m_posY = Random_Int(176, 304); //氣浪中心點位置

m_scale = 1.0f;//氣浪大小

}
Input_IsKeyDown()函數用于判斷是否有鍵按下,后面的GGEK_SPACE是空格鍵的虛擬鍵值,其他的鍵值可在文檔里找到。在Galaxy2D引擎里提供了一系列Input_*函數,用于鍵盤鼠標輸入判斷。
最后在OnRender()添加如下代碼:
//如果alpha值大于0才進行Shader合成
if (m_alpha.a > 0)

{
//開始在m_fxTarget上畫東西
Graph_BeginScene(m_fxTarget);
Graph_Clear();
m_fxSpr->SetColor(m_alpha.GetColor());
m_fxSpr->SetPositionEx(m_posX, m_posY, 0, m_scale);
m_fxSpr->Render();
Graph_EndScene();
}

//開始畫正常圖像
Graph_BeginScene(m_targetTex);
Graph_Clear(0);
m_bgSpr->Render();
Graph_EndScene();

Graph_BeginScene();
if (m_alpha.a > 0)

{
//綁定Shader要使用的紋理
Graph_SetCurrentShader(m_shaderFx);
m_shaderFx->SetTexture("FxTex", m_targetTex, true, TEXADDRESS_BORDER, 0);
m_shaderFx->SetTexture("NormalMapTex", m_fxTarget);
}
else

{
Graph_SetCurrentShader(0);
}

m_targetSpr->Render();
Graph_SetCurrentShader(0);
Graph_EndScene();
好了,現在將下面的Shader代碼復制到shader.fx文件中就大功告成了:
sampler2D FxTex:register(s0);
sampler2D NormalMapTex:register(s1);

float4 ShaderFx(float2 texCoord:TEXCOORD0):COLOR0


{
float3 normal = tex2D(NormalMapTex, texCoord);
texCoord += dot(normal, float3(0, 0, 0.1));
float4 tex = tex2D(FxTex, texCoord);

return tex;
}


最后上一張最終效果圖,由于gif只有256色所以不大清楚,不過大致的效果還是可以看出來的,自己覺得還是比較華麗的^_^,當然Shader能做的不僅如此,只要大家發揮想象力一定能作出更Cool更華麗的特效。