青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

劍孤寒的小站

人生的價(jià)值不是用時(shí)間,而是用深度去衡量的!
posts - 75, comments - 290, trackbacks - 0, articles - 0

在現(xiàn)在的3D游戲中有很多非常漂亮的Shader特效,比如爆炸產(chǎn)生的氣浪,水流過玻璃使后面的景物變得扭曲等。這些特效并不是3D游戲的專利,有很多特效其實(shí)也是可以用在2D游戲里的,今天這一節(jié)我們就來學(xué)習(xí)一下如何在Galaxy2D游戲引擎中使用PixelShader制作爆炸氣浪效果。

首先要判斷顯卡是否支持PixelShader,在OnInitiate()函數(shù)中添加:

if (System_GetState(GGE_PSVERSION) < PS_2_0) return false;

然后創(chuàng)建ShaderRenderTarget

m_shaderFx = Shader_Load("shader.fx""ShaderFx", PS_2_0);
m_fxTarget 
= Texture_Create(640480true);
m_targetTex 
= Texture_Create(640480true);

Shader_Load()函數(shù)用于載入Shader文件,第一個(gè)參數(shù)是Shader文件名,第二個(gè)參數(shù)指定Shader入口函數(shù),第三個(gè)參數(shù)指定使用的Shader 版本,這里使用的是PS2.0

RenderTarget就像一個(gè)臨時(shí)的畫布,我們可以將貼圖畫在某個(gè)RenderTarget上而不影響后臺(tái)緩存或其它的RenderTarget,常常用來做一些特殊效果,在這里m_fxTarget用于繪制NormalMap貼圖,m_targetTex用于繪制正常圖像,以便最后進(jìn)行Shader合成。為了使用Shader還必須將m_shaderFx綁定到一個(gè)ggeSprite上:m_targetSpr->SetShader(m_shaderFx);

接下來在OnUpdate(float dt)里添加如下代碼:

if (Input_IsKeyDown(GGEK_SPACE))
{
       m_alpha.a 
= 1;       //氣浪強(qiáng)度
       m_posX = Random_Int(256384);//氣浪中心點(diǎn)位置
       m_posY = Random_Int(176304); //氣浪中心點(diǎn)位置
       m_scale = 1.0f;//氣浪大小
}

Input_IsKeyDown()函數(shù)用于判斷是否有鍵按下,后面的GGEK_SPACE是空格鍵的虛擬鍵值,其他的鍵值可在文檔里找到。在Galaxy2D引擎里提供了一系列Input_*函數(shù),用于鍵盤鼠標(biāo)輸入判斷。

最后在OnRender()添加如下代碼:

 

//如果alpha值大于0才進(jìn)行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();

 好了,現(xiàn)在將下面的Shader代碼復(fù)制到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(000.1));
    float4 tex 
= tex2D(FxTex, texCoord);

    
return tex;
}


 

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

Feedback

# re: Galaxy2D游戲引擎教程4 - 用PixelShader制作華麗的2D特效  回復(fù)  更多評(píng)論   

2010-01-17 18:05 by Davy.xu
問下,怎樣讓RenderTarget的紋理繪制帶alpha通道?

# re: Galaxy2D游戲引擎教程4 - 用PixelShader制作華麗的2D特效  回復(fù)  更多評(píng)論   

2010-01-17 19:23 by 劍孤寒
如果顯卡支持,
Galaxy2D在創(chuàng)建RenderTarget時(shí)優(yōu)先創(chuàng)建帶Alpha通道的紋理,
可用Graph_Clear(0)將RenderTarget的Alpha通道清0并在上面繪制帶Alpha通道的紋理,
但正如前面所說這項(xiàng)功能是依賴顯卡的,
所以并不推薦使用。

# re: Galaxy2D游戲引擎教程4 - 用PixelShader制作華麗的2D特效  回復(fù)  更多評(píng)論   

2012-03-03 23:49 by ljb
實(shí)現(xiàn)原理還是改變坐標(biāo)紋理

# re: Galaxy2D游戲引擎教程4 - 用PixelShader制作華麗的2D特效[未登錄]  回復(fù)  更多評(píng)論   

2015-10-07 00:57 by shepherd
由于種種原因,我準(zhǔn)備自己封裝資源格式。但是這樣文件是直接讀入到內(nèi)存的,音頻、紋理這些G2D是支持內(nèi)存流直接讀取的;但是ini和xml有什么辦法直接讀取內(nèi)存流嗎?要是自己寫語法分析器,就太累了

# re: Galaxy2D游戲引擎教程4 - 用PixelShader制作華麗的2D特效  回復(fù)  更多評(píng)論   

2015-10-07 14:40 by 劍孤寒
@shepherd
xml可以用ggeXmlDocument::Parse()函數(shù)直接讀取內(nèi)存中的數(shù)據(jù),至于ini么,我不知道有了xml,還有啥用ini的理由,至少我已經(jīng)5、6年沒用過這玩意了

# re: Galaxy2D游戲引擎教程4 - 用PixelShader制作華麗的2D特效[未登錄]  回復(fù)  更多評(píng)論   

2015-10-08 01:20 by shepherd
這是我根據(jù)提示修改的代碼。采用讀xml文件的LoadFile方法工作正常。采用加載到內(nèi)存的Parse方法則失敗。是不是我用的不對(duì)啊?
char buffer[256];
long size = 0;
FILE *fp = fopen(resource_name, "rb");
fseek(fp, 0, SEEK_END);
size = ftell(fp);
fseek(fp, 0, SEEK_SET);
fread(buffer, size, 1, fp);
fclose(fp);

ggeXmlDocument *doc = Xml_Create();
//打開xml文件
doc->Parse(buffer);
//doc->LoadFile(resource_name);
//獲取根節(jié)點(diǎn)
ggeXmlNode root = doc->GetRootNode();

ggeXmlNode music = root.GetFirstChild("music");
strcpy_s(name, 100, music.GetName());
ggeXmlNode item = music.GetFirstChild("volume");
hot_volume = atoi(item.GetFirstChild().GetName()); //得到volume
item = music.GetFirstChild("count");
int count = atoi(item.GetFirstChild().GetName()); //得到count

# re: Galaxy2D游戲引擎教程4 - 用PixelShader制作華麗的2D特效  回復(fù)  更多評(píng)論   

2015-10-08 10:01 by 劍孤寒
@shepherd
呃,不知道你為啥不用Resource_Load()函數(shù)載入xml文件到內(nèi)存,如果你非要用fopen的話,需要先把buffer清零,如果還不行的話,把xml文件內(nèi)容貼一下我看看

# re: Galaxy2D游戲引擎教程4 - 用PixelShader制作華麗的2D特效[未登錄]  回復(fù)  更多評(píng)論   

2015-10-08 12:49 by shepherd
fopen那段就是測試用的,目的是把文件讀取到內(nèi)存,用來測試內(nèi)存讀取xml的效果。真正使用的時(shí)候,fopen那段時(shí)沒有的,函數(shù)直接接受一個(gè)void *buffer的指針,其內(nèi)容來自自己的資源讀取函數(shù)。
xml及相關(guān)代碼,發(fā)你郵箱吧。

# re: Galaxy2D游戲引擎教程4 - 用PixelShader制作華麗的2D特效  回復(fù)  更多評(píng)論   

2015-10-09 09:59 by 劍孤寒
@shepherd
你那個(gè)buffer要清零啊

char buffer[256];
memset(buffer, 0, 256);<------加這個(gè)清零
long size = 0;
FILE *fp = fopen(resource_name, "rb");
fseek(fp, 0, SEEK_END);
size = ftell(fp);
fseek(fp, 0, SEEK_SET);
fread(buffer, size, 1, fp);
fclose(fp);

# re: Galaxy2D游戲引擎教程4 - 用PixelShader制作華麗的2D特效[未登錄]  回復(fù)  更多評(píng)論   

2015-10-09 17:21 by shepherd
根據(jù)提示,已經(jīng)OK。正是這個(gè)原因,多謝!
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            激情综合五月天| 亚洲欧美国产三级| 亚洲丝袜av一区| 99精品热视频只有精品10| 亚洲精品影院| 日韩午夜一区| 亚洲欧美精品suv| 欧美在线亚洲在线| 久久久免费精品视频| 男人的天堂亚洲| 亚洲国产成人久久| 亚洲电影在线| 中文亚洲视频在线| 久久精品视频免费观看| 免费中文日韩| 欧美日韩亚洲一区二区三区四区| 国产精品美腿一区在线看| 国产午夜精品一区理论片飘花| 在线观看亚洲精品视频| 中文精品视频一区二区在线观看| 欧美一区二区免费视频| 欧美国产日本韩| 亚洲天堂成人在线观看| 久久亚洲国产成人| 国产精品久久久久久一区二区三区| 激情文学综合丁香| 亚洲免费综合| 亚洲欧洲精品一区二区三区| 欧美在线高清| 国产精品入口麻豆原神| 亚洲乱码国产乱码精品精可以看| 欧美专区在线| 日韩一区二区精品视频| 久久成人精品| 国产精品婷婷| 99精品热视频只有精品10| 噜噜噜久久亚洲精品国产品小说| 亚洲婷婷综合久久一本伊一区| 久久亚洲不卡| 国内久久婷婷综合| 欧美自拍偷拍| 亚洲在线观看免费视频| 欧美日韩亚洲激情| 亚洲精品中文字幕女同| 你懂的视频一区二区| 欧美一区二区高清在线观看| 国产精品久久久久aaaa九色| 亚洲精品日韩欧美| 蜜桃久久精品乱码一区二区| 亚洲一二三四区| 亚洲精品乱码久久久久久日本蜜臀| 久久精品视频在线播放| 久久国产精品一区二区三区| 国产精品久久国产三级国电话系列| 亚洲国产精品福利| 欧美成人亚洲| 狼狼综合久久久久综合网| 国产一区二区三区四区hd| 亚洲欧美视频在线观看| 一区二区三区久久网| 欧美日产在线观看| 亚洲视频综合在线| 中文在线不卡视频| 国产乱码精品1区2区3区| 香蕉久久精品日日躁夜夜躁| 亚洲无亚洲人成网站77777| 欧美色视频在线| 亚洲欧美国内爽妇网| 亚洲欧美清纯在线制服| 国产亚洲成精品久久| 玖玖在线精品| 欧美二区不卡| 亚洲午夜激情网页| 亚洲欧美日韩精品久久亚洲区 | 免播放器亚洲一区| 久久综合九色99| 日韩一二三在线视频播| 99这里有精品| 国产日韩欧美一区二区三区四区| 久久电影一区| 久久综合九色| 亚洲一区二区在线观看视频| 亚洲男人的天堂在线| 影音欧美亚洲| 亚洲国产综合在线| 国产精品区一区二区三| 老司机免费视频久久| 欧美寡妇偷汉性猛交| 午夜国产精品视频| 老鸭窝91久久精品色噜噜导演| 99国产精品久久久久老师| 亚洲欧美国产视频| 日韩视频免费看| 欧美亚洲一区| 一本久久精品一区二区| 亚洲欧美在线网| 亚洲精品在线视频| 性色av一区二区三区在线观看| 亚洲黄色性网站| 亚洲欧美在线另类| 99亚洲一区二区| 欧美一区在线看| 99国产精品视频免费观看一公开| 亚洲欧美日韩中文播放| 日韩性生活视频| 欧美与欧洲交xxxx免费观看 | 一本综合久久| 久久精品国产99国产精品澳门| 一区二区欧美精品| 久久午夜激情| 欧美日韩一区二区在线| 久久久亚洲国产天美传媒修理工| 午夜在线一区二区| 亚洲影音先锋| 欧美国产亚洲视频| 欧美+日本+国产+在线a∨观看| 国产精品欧美风情| 日韩午夜在线观看视频| 亚洲二区视频| 久久福利影视| 久久精品一区二区| 国产美女高潮久久白浆| 在线视频欧美日韩| 亚洲色图综合久久| 欧美日韩a区| 日韩一级不卡| 在线一区二区三区做爰视频网站| 欧美sm重口味系列视频在线观看| 久久综合九色99| 一区二区亚洲精品国产| 欧美在线网址| 久久久成人网| 很黄很黄激情成人| 欧美在线播放视频| 美女图片一区二区| 亚洲第一黄色| 免费成人黄色片| 欧美黑人一区二区三区| 亚洲日本电影| 欧美日韩亚洲91| 一区二区三区黄色| 欧美中文字幕在线播放| 国产视频亚洲| 久久精品视频在线看| 久久综合中文字幕| 亚洲国产精品成人| 欧美日韩1区2区| 亚洲婷婷在线| 久久久国产精品一区二区三区| 国模叶桐国产精品一区| 另类激情亚洲| 日韩视频在线免费观看| 午夜视频久久久| 精品动漫3d一区二区三区免费| 久久九九有精品国产23| 欧美成人一区二区| 亚洲精品四区| 国产精品久久久久久久久免费樱桃| 亚洲一区免费在线观看| 久久婷婷综合激情| 一本色道久久综合精品竹菊| 国产精品久久久久高潮| 久久福利精品| 亚洲美女福利视频网站| 久久国产欧美| 日韩午夜激情电影| 国产视频精品网| 男同欧美伦乱| 亚洲综合色噜噜狠狠| 亚洲电影在线| 久久精品一区二区三区不卡| 久久一区二区精品| 亚洲欧洲精品成人久久奇米网| 午夜在线电影亚洲一区| 亚洲国产第一| 国产精品视频福利| 美女在线一区二区| 亚洲一区亚洲| 亚洲国产一区二区三区在线播| 午夜精品久久久久久久久久久| 影视先锋久久| 国产老女人精品毛片久久| 午夜精品一区二区三区在线视 | 午夜在线观看免费一区| 欧美国产精品中文字幕| 欧美亚洲在线观看| 亚洲精品系列| 国产真实乱偷精品视频免| 欧美视频中文字幕在线| 欧美成人dvd在线视频| 欧美在线视频a| 亚洲天堂免费观看| 亚洲精品视频在线观看网站| 麻豆久久久9性大片| 欧美亚洲三区| 亚洲一区中文| 亚洲视频免费| 亚洲美女在线视频| 最新中文字幕一区二区三区| 国语自产精品视频在线看一大j8 |