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

            最近使用材質節點生成HLSL代碼并開始編譯,也順手開始搭建一個正規的Shader包含及編譯流程,所以用到了D3DXCompileShader及ID3DXInclude

            ID3DXInclude的使用方法在OGRE 1.65(或者類似的版本)的OgreD3D9HLSLProgram.cpp中有源代碼可供參考

                    STDMETHOD(Open)(D3DXINCLUDE_TYPE IncludeType,
                        LPCSTR pFileName,
                        LPCVOID pParentData,
                        LPCVOID *ppData,
                        UINT *pByteLen
                        )

            此函數發生在代碼中有#include XXX時, FileName就是XXX

            ppData需要由用戶提供FileName對應的源碼內容,ANSI格式

            pByteLen是代碼長度

            STDMETHOD(Close)(LPCVOID pData)

            此函數的pData既是Open中提供的ppData, 用戶可以用于自行釋放內存等操作

             

            本來按照正常流程, HLSL代碼應該可以正常編譯,我的HLSL功能大概描述:

            Material.hlsl 提供基礎光照模型函數

            Material_Generated.hlsl 由材質節點生成的代碼,包含Main入口, #include "Material.hlsl"

            結果D3DXCompileShader報了一個莫名其妙的錯誤,找不到Main入口. 找了很久都沒發現代碼有什么問題. 于是開始回看OGRE代碼,發現了大俠們的一句救命留言:

            // copy into separate c-string
            // Note - must NOT copy the null terminator, otherwise this will terminate
            // the entire program string!
            馬上查閱我的代碼,為LoadFileToString函數添加一個參數,是否添加終結符0
                bool LoadFileToString( const char* FileName, AString& Content, bool TerminateString )
                {
                    wchar Buffer[MAX_PATH];
                    FileStream TFile;
                    if ( !TFile.Open(StringConverter::AnsiToUnicode( Buffer, MAX_PATH, FileName), FAM_Read ) )
                    {
                        return false;
                    }
             
                    dword FileSize = TFile.GetSize();
             
                    Content.resize( FileSize + (TerminateString ? 1: 0) );
                    TFile.ReadBuffer( (void*)Content.data(), FileSize * sizeof( char ) );
             
                    if ( TerminateString )
                        Content[FileSize] = 0;
             
                    return true;
                }

            D3DXCompileShader的Source 是需要終結的源碼, 但是在ID3DXInclude的實現類Open函數中,返回給ppData的,堅決不能有終止符0.

             

            總結:

               HLSL的代碼編譯過程是依賴#include將不同的文件碎片組合到一起后才開始解析,因此用戶提供的字符串尾部帶有終結符, 編譯器是沒有理由為你檢查數據的正確性的.去掉包含終結符才是正確的做法

            posted on 2010-06-18 17:01 戰魂小筑 閱讀(1700) 評論(0)  編輯 收藏 引用 所屬分類: 渲染 Shader 引擎
            久久天天躁狠狠躁夜夜2020老熟妇 | 久久精品无码专区免费青青| 亚洲狠狠婷婷综合久久久久| 91精品国产高清久久久久久io| 久久夜色精品国产亚洲| 三级韩国一区久久二区综合| 伊人久久大香线蕉精品不卡| 无码伊人66久久大杳蕉网站谷歌| 一本伊大人香蕉久久网手机| 亚洲国产精品嫩草影院久久| 久久99国产精品尤物| 亚洲国产成人久久一区久久| 久久丫精品国产亚洲av不卡| 精品久久久久久久久久中文字幕| 久久久久se色偷偷亚洲精品av| 亚洲国产精品久久久久婷婷老年| 中文字幕精品久久久久人妻| 国产午夜久久影院| 精品国产乱码久久久久久人妻 | 国内精品久久久久影院薰衣草| 久久国产免费观看精品| 亚洲欧洲中文日韩久久AV乱码| 韩国三级大全久久网站| 亚洲αv久久久噜噜噜噜噜| 久久伊人亚洲AV无码网站| 青青热久久综合网伊人| 国产精品久久久久久久久久影院| 精品久久人人妻人人做精品| 久久久久久久尹人综合网亚洲| 久久精品国产亚洲AV嫖农村妇女 | 亚洲国产精品久久久久网站 | 欧洲国产伦久久久久久久 | 久久久久久精品免费看SSS| 久久e热在这里只有国产中文精品99| 99久久er这里只有精品18| 97久久国产综合精品女不卡 | 综合人妻久久一区二区精品| 久久亚洲精品无码aⅴ大香| 久久综合色老色| 狠狠色狠狠色综合久久| 国产精品乱码久久久久久软件|