• <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>

            戰魂小筑

            討論群:309800774 知乎關注:http://zhihu.com/people/sunicdavy 開源項目:https://github.com/davyxu

               :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
              257 隨筆 :: 0 文章 :: 506 評論 :: 0 Trackbacks

            image

             

            終于完成了結構最復雜的Shader管理器,特性如下:

            GlobalShader管理:

            也就是傳統的手寫Shader,完成特殊的任務,例如線條繪制,2D繪制等等

                class ElementPixelShader : public ShaderBinder
                {
                    DECLARE_RTTIOBJECT( ElementPixelShader )
                    DECLARE_RTTISERIAL( ElementPixelShader )
                    DECLARE_SHADER_METAINFO(ST_PixelShader, L"Shader\\SimpleElementPixelShader.usf",L"Main")
             
                public:
             
                    virtual void BindShaderParameter( eShaderType ShaderType, const ShaderParameterMap& ParameterMap )
                    {
                        mTexture.Bind( ParameterMap, "Texture" );
                    }
             
                    void SetTexture( RenderTexture* NewTexture )
                    {
                        mShaderRHI->SetTextureParameter( mTexture, NewTexture );
                    }
             
                    virtual void Serialize( BinarySerializer& Ser )
                    {
                        __super::Serialize( Ser );
             
                        Ser << mTexture;
                    }
             
                private:
                    ShaderParameter mTexture;
                };
             
                IMPLEMENT_GLOBAL_SHADER( ElementPixelShader, 1);

            管理器中,是一種類似單件存儲,通過類型可以直接取到實例

            MaterialPixelShader管理

            這種Shader通過材質節點生成的shader代碼來記錄每個Shader信息,每個MaterialVertexShader需要只做MaterialPixelShader需要的信息并在Shader代碼中傳送給它

            MaterialVertexShader管理

            這類Shader最復雜,其中的控制代碼生成的宏需要由材質提供,例如是否使用TangentSpace。還有一些參數就更頭疼了, 不是材質在制作時能決定的,例如:一個材質可以應用給地形,模型,甚至粒子,所以我把這部分參數叫做晚綁定參數(Later Bind Material Parameter)

            MaterialVertexShader本身是抽象的,需要在材質應用到具體對象時,由對象提供其特殊的VertexShader處理Shader,同時根據特性設定晚綁定參數

             

            晚綁定參數:

              MaterialParameter Parameter;
              Parameter.Set( MPT_UseSkin, mSkinned );
              mMaterialInstance->SetVertexShaderProvider( RTTI_CLASS_INFO( ModelMaterialVertexShader),Parameter );

             

            材質緩沖系統

            Shader 動態編譯在很多游戲里都有應用,例如:戰地2。游戲第一次啟動時,就會編譯一次Shader。按照很多文章說的,編譯器會根據你顯卡及配置編譯出最優化的代碼。 我就納悶了, D3D編譯函數根本沒有傳入設備句柄,怎么可能根據機器配置編譯?我也嘗試過,不同機器上編譯出來根本就是一樣的。

            在以后引擎啟動時,Shader系統就會自動從保存好的緩沖內讀取,不用再次編譯。

            這里還要提一個微軟為D3DX做的升級Patch系統很惡心,類似于D3DXCompileShader及Shader相關的函數,在每次調用函數時,會載入一個D3DX9_xx.dll,調用完畢后又會卸載,極大的影響性能。 若不是因為這個,估計我不會寫緩沖系統的

            動態編譯更新Shader

            這個功能是很多引擎都有的,RenderMonkey也一樣,實現起來很簡單,就是一個文件時間戳比較問題,此功能完全是為以后編輯器做準備。

             

            MaterialShader部分終于告一段落,下面終于可以進入材質節點系統的進一步完善了

            posted on 2010-07-02 15:28 戰魂小筑 閱讀(2295) 評論(1)  編輯 收藏 引用 所屬分類: 渲染 Shader 引擎

            評論

            # re: 支持材質Shader的Shader管理器完成,發圖紀念 2010-07-02 22:49 小時候可靚了
            很好很強大。幾個月前我做材質系統的時候,咋沒想過拿個好點的SHADER測試測試呢。。。第一次,又讓給了別人。。。。  回復  更多評論
              

            亚洲中文字幕无码久久2020 | 婷婷综合久久中文字幕蜜桃三电影| 丁香久久婷婷国产午夜视频| 久久精品亚洲精品国产欧美| 国产亚洲美女精品久久久2020| 久久影院综合精品| 国产亚洲成人久久| 日韩AV无码久久一区二区| 品成人欧美大片久久国产欧美...| 久久综合亚洲色HEZYO国产| 久久精品国产久精国产思思| 久久精品国产精品亚洲人人 | 超级97碰碰碰碰久久久久最新| 久久男人Av资源网站无码软件| 国产农村妇女毛片精品久久| 无码伊人66久久大杳蕉网站谷歌| 久久97久久97精品免视看秋霞| 色欲久久久天天天综合网精品 | 精品久久久久久无码中文野结衣 | 亚洲国产一成久久精品国产成人综合| 少妇高潮惨叫久久久久久| 久久露脸国产精品| 国内精品免费久久影院| 久久精品国产99国产电影网| 国内精品人妻无码久久久影院导航| 国产成人精品久久一区二区三区av| 久久国产精品成人片免费| 国内精品综合久久久40p| 精品久久久久成人码免费动漫| 久久国产精品视频| 久久播电影网| 久久久网中文字幕| 亚洲&#228;v永久无码精品天堂久久 | 国产福利电影一区二区三区,免费久久久久久久精 | 狠狠色婷婷久久综合频道日韩 | 久久国产乱子伦精品免费强| 99re久久精品国产首页2020| 精品久久久久久成人AV| 91视频国产91久久久| 国产亚洲精午夜久久久久久 | 久久久精品2019免费观看|