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

歲月流轉,往昔空明

C++博客 首頁 新隨筆 聯系 聚合 管理
  118 Posts :: 3 Stories :: 413 Comments :: 0 Trackbacks

圖形管線與Shader的交互

入口函數與非入口函數

入口函數是Shader的主函數。來看這樣一段程序

float4x4 wvpMat;

struct VS_INPUT{
    float4 pos: SV_Position;
    float4 tex: SV_Texcoord0;
};

struct VS_OUTPUT{
    float4 pos: SV_Position;
    float4 tex: SV_Texcoord0;
};

float4 world_pos( float4 p ){
    return mul(p, wvpMat);
}

VS_OUTPUT vs_main(VS_INPUT in){
    VS_OUTPUT o;
    o.pos = world_pos(in.pos);
    o.tex = in.tex;
    return o;
}

很顯然,vs_main是一個合法的VS程序的主函數,那么我們稱vs_main為入口函數,稱world_pos為非入口函數。Shading language的入口函數,其實和C語言的主在概念上沒有什么區別。但是在SASL中,我們要求一個入口函數它所有的輸入和輸出都要正確的關聯到語義上。SM4中這一條件被放寬了,入口函數也可以提供無語義的uniform參數。

語義分類

對于Shading Language而言,最重要的兩個操作是從圖形管線中獲取數據并將數據寫回到管線中。流水線中的數據是附帶了語義信息的,用于表達這個數據的用途。例如SV_Position就指明了這樣一個數據是表示位置的。用戶輸入的數據、SL輸出的數據,都是依靠語義信息來確保讀取和寫入的正確性。例如SV_Position只能從某個頂點流的特定偏移量獲取,SV_Color的數據才能被寫到color buffer中。

SASL支持的語義集合是HLSL Shader Model 4.0的子集。目前參考的HLSL版本為4.0。

在Shader Model 4.0的所有輸入語義中,一些語義的值直接來自于外部存儲,例如SV_Position的數據來自頂點流,一些語義的值則是來自于管線執行中間計算的結果。輸出語義也是如此。

Shader從設計之初便需要應對每秒百萬到數億的調用,因此一些平常不可見的開銷問題在這里也變得尤為顯著,例如函數參數壓棧的開銷。所以將所有輸入數據均按值或者按地址傳遞到入口函數中是不妥的。為了盡可能的減少內存讀寫的次數,從外部存儲讀入(例如Vertex Buffer)或者寫入的外部存儲(例如Stream Output或者Frame Buffer)的數據,我們一律以指針+偏移的形式將數據傳遞到Shader中,稱之為Stream類型,而臨時的語義變量,如SV_IsFrontFace,我們則暫存到一個臨時的buffer中,稱之為buffer類型。

在SASL中我們將shader的全部語義分為四類,Stream_in,stream_out,buffer_in,buffer_out。

Shader還有一種特有的存儲類型,uniform。這一類型在編譯期的時候是一個變量,在代碼生成期/優化期是一個常量。如果將這一類型的量按照編譯期常量來處理,那么便能獲得更高的運行時性能,比方說一些條件展開可以通過優化而被消除。但是,這也意味著一旦uniform量發生變化后,shader便最少需要重新執行代碼生成乃至于重新編譯。這將會帶來巨大的性能開銷。由于SASL主要執行在CPU上,CPU對于動態代碼的執行優化要遠遠優于GPU,例如間接地址讀取指令和分支預測。因此我們將uniform作為一個普通的變量經由buffer_in來執行輸入,以平衡代碼調用和編譯之間的開銷。

數據結構與入口簽名

SASL最終將生成如下的簽名:

struct stream_in{
    float4* pos;
    float4* tex;
};

struct buffer_in{ float4x4 wvpMat; };
struct stream_out{}; // empty.
struct buffer_out{
    float4 pos;
    float4 tex;
};

float4 world_pos( float4 pos, buffer_in* bi );
void vs_main( stream_in* si, buffer_in* bi, stream_out* so, buffer_out* bo );

通過對語義和常量進行重整,SASL減少了不必要的拷貝開銷。

結構體的語義布局與常規布局

我們注意到,VS_OUTPUT對于返回值和堆棧變量的類型時的意義是不同的。在返回值時,它匹配了語義輸出,而在堆棧變量時,它只是一個普通結構體的內存布局。這就要求,VS_OUTPUT在分析時必須同時產生并保存兩套內存布局信息。

但是實際上由于布局差異僅僅在入口函數才存在,并且只有當結構體作為入口函數參數或返回值的時候才會使用語義布局,其他函數內無論是參數還是變量都是使用普通布局,因此我們運用一個臨時對象,將語義布局的值拷貝成一個普通布局的對象。也就是說,入口函數內的代碼中所有對這個參數值的讀取實際上都是對臨時對象的讀取。其代碼類似于下段:

void vs_main( stream_in* si, buffer_in* bi, stream_out* so, buffer_out* bo ){
    // initialization
    VS_INPUT __tmp_in = {*si->pos, *si->tex};
    VS_OUTPUT __tmp_out;
    // end initialization

    VS_OUTPUT o;
    o.pos = world_pos( __tmp_in.pos, bi );
    o.tex = __tmp_in.tex;

    __tmp_out = o;

    // return
    bo->pos = __tmp_out.pos;
    bo->tex = __tmp_out.tex;
    return;
    // end return
}

那么通過臨時對象的構造,便可以將其余部分的代碼通過常規布局生成,避免了在普通布局和語義布局之間復雜的判斷和邏輯。盡管臨時變量的使用導致了代碼在外觀上看起來很低效,但是實際上這種極為簡單的冗余代碼,是非常適合LLVM這種基于SSA的優化方案的。

posted on 2011-04-14 10:23 空明流轉 閱讀(1593) 評論(0)  編輯 收藏 引用
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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| 伊人久久大香线| 日韩亚洲在线观看| 欧美黄免费看| 欧美激情精品久久久久久大尺度| 国产精品日本欧美一区二区三区| 欧美高清在线观看| 亚洲第一区在线| 免费欧美网站| 亚洲精美视频| 国产人久久人人人人爽| 麻豆久久婷婷| 久久婷婷麻豆| 精品二区久久| a4yy欧美一区二区三区| 欧美日本精品在线| 国产亚洲精品7777| 麻豆成人在线播放| 国产精品一区二区你懂得| 久久精品道一区二区三区| 欧美好骚综合网| 久久久精品久久久久| 久久精品国产一区二区三区免费看 | 在线视频精品一区| 美女脱光内衣内裤视频久久网站| 一区二区三区欧美亚洲| 亚洲乱码国产乱码精品精98午夜| 久久狠狠亚洲综合| 午夜伦理片一区| 黄色成人小视频| 免费久久99精品国产| 亚洲小说欧美另类婷婷| 免费在线看一区| 欧美主播一区二区三区| 亚洲与欧洲av电影| 久久大香伊蕉在人线观看热2| 亚洲欧美在线网| 国产农村妇女精品一区二区| 欧美在线视频全部完| 欧美大色视频| 午夜久久影院| 国产九区一区在线| 亚洲激情在线| 国产精品午夜国产小视频| 亚洲国产精品一区制服丝袜| 欧美99久久| 亚洲精选久久| 国产视频欧美视频| 午夜在线播放视频欧美| 乱中年女人伦av一区二区| 亚洲韩国日本中文字幕| 国产精品欧美经典| 牛夜精品久久久久久久99黑人 | 美女脱光内衣内裤视频久久网站| 亚洲精品国产精品国自产观看| 欧美三级视频在线观看| 欧美精品电影在线| 另类综合日韩欧美亚洲| 久久精品国产99精品国产亚洲性色 | 亚洲高清资源| 亚洲欧洲一区二区三区久久| 亚洲国产精品一区在线观看不卡| 欧美亚洲日本网站| 亚洲视频电影图片偷拍一区| 蜜臀va亚洲va欧美va天堂| 美女脱光内衣内裤视频久久网站| 国产精品久久久久久久久久尿| 欧美国产在线电影| 在线观看欧美| 欧美一区二区三区在线看| 亚洲国产成人精品久久久国产成人一区| 欧美精品一级| 欧美一区二区三区免费观看| 在线综合亚洲| 亚洲视频欧美视频| 亚洲欧美日本视频在线观看| 一区二区三区成人精品| 亚洲午夜在线观看| 亚洲欧美电影在线观看| 久久久夜色精品亚洲| 嫩草国产精品入口| 欧美精品导航| 国产欧美91| 亚洲欧洲日产国产综合网| 亚洲精品在线免费| 久久成人久久爱| 欧美激情视频在线播放| 亚洲欧洲日韩女同| 欧美在线一二三四区| 欧美精品一区二区久久婷婷| 国产欧美日韩免费看aⅴ视频| 国产午夜精品一区二区三区欧美| 在线精品国产成人综合| 亚洲欧美国产精品桃花| 免费亚洲一区| 久久精品系列| 国产一区二区三区无遮挡| 中文国产一区| 亚洲韩日在线| 久久激五月天综合精品| 欧美在线|欧美| 中文在线资源观看视频网站免费不卡| 久久国产直播| 国产亚洲欧美日韩在线一区| 亚洲伊人第一页| 亚洲裸体在线观看| 欧美日韩国产探花| 亚洲精品综合久久中文字幕| 欧美激情国产日韩精品一区18| 久久精品五月| 亚洲国产日韩美| 亚洲国产综合在线看不卡| 欧美激情成人在线| 一区二区三区日韩| 亚洲综合成人在线| 国产亚洲一区在线播放| 老司机精品导航| 欧美日韩国产成人精品| 国产麻豆午夜三级精品| 久久国产精品久久国产精品| 久久不见久久见免费视频1| 在线播放日韩| 一区二区三区产品免费精品久久75 | 亚洲欧美在线一区| 欧美大香线蕉线伊人久久国产精品| 在线视频成人| 夜夜精品视频| 国产在线视频欧美| 99国产精品视频免费观看| 国产一区二区激情| 最新亚洲一区| 国产综合欧美在线看| 亚洲香蕉成视频在线观看| 国产视频不卡| 亚洲免费婷婷| 亚洲免费影院| 欧美日本精品一区二区三区| 免费成人网www| 国产一区二区三区自拍| 亚洲天堂久久| 亚洲午夜未删减在线观看| 欧美风情在线观看| 国产精品极品美女粉嫩高清在线| 欧美激情导航| 99国产精品99久久久久久粉嫩| 久久经典综合| 久久综合狠狠综合久久综合88| 国产精品你懂得| 亚洲在线1234| 欧美在线3区| 国语对白精品一区二区| 欧美在线视频免费观看| 美女脱光内衣内裤视频久久影院 | 国模吧视频一区| 欧美专区18| 亚洲国产成人不卡| 亚洲九九九在线观看| 欧美日韩一区自拍| 亚洲欧美日韩在线不卡| 美女爽到呻吟久久久久| 亚洲图中文字幕| 好看不卡的中文字幕| 欧美日本不卡| 香蕉久久一区二区不卡无毒影院| 久久久亚洲国产美女国产盗摄| 亚洲精品免费一二三区| 国产精品亚洲成人| 米奇777超碰欧美日韩亚洲| 亚洲一区二区av电影| 麻豆av福利av久久av| 亚洲自拍偷拍福利| 亚洲啪啪91| 亚洲第一在线综合网站| 欧美亚日韩国产aⅴ精品中极品| 亚洲天堂网在线观看| 亚洲高清二区| 免费亚洲电影在线| 久久综合色天天久久综合图片| 一区二区三区www| 亚洲欧洲一区二区三区久久| 国产三级精品在线不卡| 国产精品多人| 国产精品久久久久久久午夜| 欧美精品色一区二区三区| 久久久噜噜噜久噜久久 | 久久一区国产| 国产精品久久久久久久9999 | 日韩天堂在线视频| 亚洲人成77777在线观看网| 久久伊人免费视频| 久久综合九九| 欧美激情精品久久久久久黑人| 久久久欧美精品| 巨乳诱惑日韩免费av| 欧美成人一区在线| 亚洲国产国产亚洲一二三| 亚洲精品一区二区网址| 亚洲视频香蕉人妖| 久久久久久久久久久久久9999| 久久九九全国免费精品观看|