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

劍孤寒的小站

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

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

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

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

然后創建ShaderRenderTarget

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

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(256384);//氣浪中心點位置
       m_posY = Random_Int(176304); //氣浪中心點位置
       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(000.1));
    float4 tex 
= tex2D(FxTex, texCoord);

    
return tex;
}


 

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

Feedback

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

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

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

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

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

2012-03-03 23:49 by ljb
實現原理還是改變坐標紋理

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

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

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

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

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

2015-10-08 01:20 by shepherd
這是我根據提示修改的代碼。采用讀xml文件的LoadFile方法工作正常。采用加載到內存的Parse方法則失敗。是不是我用的不對啊?
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);
//獲取根節點
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特效  回復  更多評論   

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

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

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

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

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

char buffer[256];
memset(buffer, 0, 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);

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

2015-10-09 17:21 by shepherd
根據提示,已經OK。正是這個原因,多謝!
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲一区二区精品视频| 国产一区二区三区在线观看免费 | 国产日韩综合| 欧美 日韩 国产在线| 欧美一区二区网站| 国产真实乱子伦精品视频| 久久亚洲综合色一区二区三区| 久久久99精品免费观看不卡| 亚洲欧洲日本在线| 一区二区三区**美女毛片| 国产精品日韩欧美一区二区三区| 欧美在线观看网站| 久久国产综合精品| 99国产精品自拍| 亚洲综合视频1区| 精品动漫一区| 亚洲精品视频在线看| 国产精品视频免费| 亚洲电影有码| 欧美日韩一区在线观看视频| 欧美在线视频一区二区三区| 久久日韩粉嫩一区二区三区| 中国av一区| 久久精品亚洲乱码伦伦中文| 99re热这里只有精品免费视频| 亚洲欧美成人在线| 亚洲伦伦在线| 欧美主播一区二区三区美女 久久精品人| 亚洲国产精品一区| 亚洲欧美日韩精品久久奇米色影视| 在线看成人片| 午夜伦理片一区| 中文亚洲字幕| 欧美福利电影在线观看| 久久精品国产综合| 欧美性感一类影片在线播放 | 亚洲在线免费观看| 蜜桃av一区二区三区| 欧美一区2区视频在线观看 | 亚洲一区视频在线观看视频| 欧美在线欧美在线| 午夜国产精品视频免费体验区| 久久一区二区三区四区五区| 亚洲视频国产视频| 米奇777超碰欧美日韩亚洲| 午夜精品99久久免费| 欧美99在线视频观看| 亚洲五月六月| 欧美在线91| 久久不见久久见免费视频1| 欧美成人四级电影| 亚洲综合第一页| 欧美国产精品va在线观看| 久久精品国产精品亚洲综合| 欧美日韩一卡| 欧美成人免费播放| 伊人狠狠色j香婷婷综合| 亚洲影院在线观看| 中文在线资源观看视频网站免费不卡| 久久综合九色综合网站| 久久精品国产第一区二区三区| 国产精品电影在线观看| 亚洲蜜桃精久久久久久久| 亚洲黄网站在线观看| 日韩视频免费大全中文字幕| 亚洲视频免费观看| 亚洲成人在线网| 欧美在线黄色| 欧美在线免费观看视频| 国产精品视区| 亚洲图片在线观看| 亚洲欧洲99久久| 国产精品国产三级国产aⅴ浪潮| 亚洲激情偷拍| 亚洲欧洲精品一区二区精品久久久| 欧美在线视频播放| 久久久亚洲精品一区二区三区| 国产亚洲福利社区一区| 性欧美xxxx大乳国产app| 久久精品麻豆| 激情校园亚洲| 久久久久一区二区三区四区| 久久青草久久| 亚洲电影中文字幕| 欧美日韩国产123| 亚洲深夜福利在线| 欧美一区二区私人影院日本| 国产午夜精品视频| 久久久精品tv| 欧美黄网免费在线观看| 日韩视频在线观看一区二区| 欧美日韩国产精品专区| 中日韩男男gay无套| 久久久久网址| 亚洲精品少妇30p| 欧美性猛交一区二区三区精品| 亚洲自拍偷拍色片视频| 久久亚洲欧美国产精品乐播| 亚洲啪啪91| 国产精品久久久久久亚洲调教| 亚洲欧美欧美一区二区三区| 午夜精品久久久久久久99樱桃 | 欧美国产一区二区三区激情无套| 亚洲美洲欧洲综合国产一区| 亚洲一区二区3| 国产主播一区二区三区四区| 久久综合色8888| 亚洲裸体俱乐部裸体舞表演av| 亚洲欧美卡通另类91av| 激情懂色av一区av二区av| 欧美电影在线播放| 亚洲欧美精品在线观看| 亚洲国产cao| 久久精品五月| 亚洲网友自拍| 国产小视频国产精品| 欧美国产视频一区二区| 欧美一区二区三区四区视频| 亚洲国产精品成人va在线观看| 亚洲一区二区三区中文字幕在线| 国产亚洲午夜| 欧美午夜激情小视频| 久久久久久亚洲精品中文字幕| 99国产精品久久久久老师| 久久精品免费电影| 一本大道久久a久久综合婷婷 | 麻豆精品国产91久久久久久| 一区二区欧美亚洲| 欧美激情精品久久久久久大尺度 | 亚洲三级电影在线观看| 欧美在线一二三四区| 最新中文字幕亚洲| 曰韩精品一区二区| 国产精品美女久久久久av超清| 欧美刺激性大交免费视频| 久久成人免费视频| 亚洲精品日本| 99国内精品久久久久久久软件| 牛牛国产精品| 美腿丝袜亚洲色图| 久久精品亚洲乱码伦伦中文| 在线视频欧美日韩精品| 国产永久精品大片wwwapp| 国产精品国产三级国产专播品爱网| 亚洲欧美日韩国产中文| 亚洲欧美国产高清| 亚洲免费在线观看| 一区二区三区久久精品| 99视频精品全部免费在线| 亚洲激情电影在线| 9久草视频在线视频精品| 亚洲黄色高清| 亚洲黄色免费| 亚洲精品字幕| 日韩一区二区福利| 亚洲性图久久| 亚洲欧美999| 欧美亚洲免费电影| 久久免费的精品国产v∧| 久久精品夜色噜噜亚洲a∨| 久久成人精品无人区| 久久免费国产精品| 免费毛片一区二区三区久久久| 蜜桃久久av一区| 欧美大胆a视频| 欧美日韩国产欧| 免费观看日韩av| 欧美日韩高清免费| 国产精品乱码一区二三区小蝌蚪 | 午夜精品视频| 久久久久久久精| 欧美成人精品福利| 欧美日本在线视频| 国产精品久久久久国产a级| 国产精品久久久久久久久免费樱桃 | 欧美在线地址| 免费亚洲网站| 91久久线看在观草草青青| 亚洲精品美女在线| 亚洲视频1区2区| 久久久久久久综合色一本| 欧美成人精品h版在线观看| 欧美日韩另类丝袜其他| 国产日韩精品一区二区| 国产在线视频欧美| 亚洲无限av看| 久久久久久久久久久久久9999| 麻豆精品一区二区综合av| 欧美电影在线观看完整版| 午夜精品福利一区二区蜜股av| 久久一区二区三区四区| 欧美日韩在线亚洲一区蜜芽| 国产日韩在线播放| 一区二区三区**美女毛片| 久久免费视频网| 一本色道久久综合| 蜜乳av另类精品一区二区| 国产九色精品成人porny| 91久久久久久国产精品| 久久精品视频在线观看|