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

歲月流轉,往昔空明

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

圖形管線與Shader的交互

入口函數(shù)與非入口函數(shù)

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

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程序的主函數(shù),那么我們稱vs_main為入口函數(shù),稱world_pos為非入口函數(shù)。Shading language的入口函數(shù),其實和C語言的主在概念上沒有什么區(qū)別。但是在SASL中,我們要求一個入口函數(shù)它所有的輸入和輸出都要正確的關聯(lián)到語義上。SM4中這一條件被放寬了,入口函數(shù)也可以提供無語義的uniform參數(shù)。

語義分類

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

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

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

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

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

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

數(shù)據(jù)結構與入口簽名

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減少了不必要的拷貝開銷。

結構體的語義布局與常規(guī)布局

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

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

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
}

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

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>
            国产亚洲一区在线播放| 亚洲国产老妈| 国语自产在线不卡| 国产精品综合久久久| 国产精品久久久久久超碰| 欧美三级不卡| 国产美女搞久久| 一区在线观看视频| 亚洲精品免费网站| 一本久久a久久精品亚洲| 亚洲一区二区三区高清不卡| 在线亚洲精品福利网址导航| 亚洲欧美一区二区三区在线| 久久gogo国模啪啪人体图| 久久夜色精品国产亚洲aⅴ| 你懂的国产精品| 亚洲国产欧美在线人成| 亚洲桃色在线一区| 久久gogo国模裸体人体| 欧美精品久久99久久在免费线| 国产精品第一页第二页第三页| 韩国成人精品a∨在线观看| av成人天堂| 欧美伊久线香蕉线新在线| 欧美激情1区2区| 亚洲午夜三级在线| 欧美激情精品久久久久久| 国产乱码精品一区二区三区忘忧草 | 欧美色精品在线视频| 国产伦精品一区二区三区免费迷 | av不卡免费看| 久久精品一本| 欧美高清不卡在线| 亚洲欧美日韩精品综合在线观看| 久久青草福利网站| 国产精品久久久久久亚洲毛片| 极品日韩av| 午夜视频在线观看一区二区三区 | 亚洲经典在线| 亚洲免费视频观看| 男男成人高潮片免费网站| 国产精品理论片| 亚洲日产国产精品| 久久久久久9999| 一本色道久久加勒比精品| 美女啪啪无遮挡免费久久网站| 国产精品美女久久久久aⅴ国产馆| 亚洲电影在线| 久久久国产精彩视频美女艺术照福利| 日韩视频一区二区三区在线播放| 久久久亚洲欧洲日产国码αv| 国产精品久久一卡二卡| 一本色道久久99精品综合| 蜜桃久久av一区| 午夜欧美理论片| 国产精品va在线播放| 一本色道久久综合狠狠躁的推荐| 欧美a级一区二区| 久久经典综合| 国产最新精品精品你懂的| 欧美在线免费视屏| 亚洲欧美日韩一区二区| 国产欧美日本在线| 欧美一区二区精品久久911| 日韩午夜电影av| 欧美精品18+| 99综合电影在线视频| 亚洲国产精品热久久| 欧美a级片网| 亚洲国产精品激情在线观看| 另类激情亚洲| 久久天堂精品| 亚洲国产色一区| 亚洲第一色在线| 欧美女同在线视频| 亚洲午夜未删减在线观看| 日韩视频在线永久播放| 欧美日韩专区| 欧美一区1区三区3区公司| 亚洲欧美美女| 国产亚洲欧美日韩精品| 久久婷婷国产综合尤物精品| 久久精品国产2020观看福利| 国产精品美女久久久久久2018| 亚洲欧美亚洲| 国产一区二区主播在线| 玖玖精品视频| 欧美经典一区二区三区| 亚洲欧美一区二区三区在线| 翔田千里一区二区| 亚洲国产精品传媒在线观看| 亚洲精品在线视频观看| 久久精品国产成人| 亚洲区第一页| 亚洲综合日韩在线| 亚洲黄色在线| 亚洲免费视频观看| 亚洲激情偷拍| 亚洲欧美另类在线| 亚洲欧洲精品一区二区| 欧美日韩一区二区三区高清| 久久国产精品久久久久久久久久 | 久久综合999| 亚洲天堂成人在线观看| 性做久久久久久久免费看| 亚洲国产片色| 午夜免费电影一区在线观看| 亚洲人成人一区二区三区| 亚洲男女自偷自拍图片另类| 亚洲欧洲在线一区| 欧美在线啊v一区| 一区二区三区欧美激情| 久久精品一区二区三区不卡| 亚洲一区二区三区在线观看视频| 久久久精品午夜少妇| 亚洲欧美激情精品一区二区| 久久久久久久欧美精品| 亚洲综合日本| 蜜臀va亚洲va欧美va天堂| 欧美一乱一性一交一视频| 欧美连裤袜在线视频| 久久躁狠狠躁夜夜爽| 国产精品视区| 在线亚洲高清视频| 亚洲精选成人| 久久亚洲一区| 久久不射中文字幕| 国产精品xvideos88| 亚洲人成人99网站| 亚洲国产精品久久久久婷婷老年| 亚洲欧美亚洲| 欧美一级淫片aaaaaaa视频| 欧美日本高清视频| 亚洲人成久久| 最近中文字幕日韩精品 | 欧美欧美全黄| 欧美成年人在线观看| 国内精品久久久| 午夜日韩在线观看| 欧美在线啊v| 国产麻豆精品视频| 亚洲摸下面视频| 久久国产欧美| 国产无一区二区| 午夜精品久久| 亚洲一区亚洲二区| 午夜精品视频在线| 国产精品视频yy9299一区| 久久嫩草精品久久久精品| 欧美精品v日韩精品v国产精品| 六月婷婷久久| 亚洲激情电影中文字幕| 亚洲在线视频观看| 国产精品成人观看视频免费| 在线综合亚洲| 亚洲精品欧美极品| 亚洲一区二区黄色| 久久精品日产第一区二区三区 | 欧美久久电影| 夜夜嗨av色一区二区不卡| 亚洲亚洲精品在线观看| 国产精品高潮呻吟久久av黑人| 亚洲视频成人| 久久黄色网页| 亚洲高清毛片| 欧美日韩免费一区二区三区| 亚洲视频一区二区| 亚洲一级高清| 国产一区二区视频在线观看| 久久视频一区二区| 亚洲国产精品成人一区二区| 99精品福利视频| 国产精品网站在线| 久久久国产一区二区三区| 欧美成人日本| 99国产精品国产精品久久| 国产欧美日韩免费| 男女精品网站| 亚洲图片激情小说| 免费高清在线视频一区·| 99香蕉国产精品偷在线观看| 国产精品网曝门| 欧美多人爱爱视频网站| 一区二区三区日韩欧美精品| 久久久国产91| 在线视频日韩| 亚洲国产精品久久久久| 国产精品xxx在线观看www| 久久综合狠狠| 亚洲影院一区| 亚洲国产日本| 久久亚洲一区| 亚洲欧美国产日韩中文字幕| 亚洲国产日韩欧美在线动漫| 国产精品女主播在线观看| 欧美韩日一区| 久久久久久亚洲精品中文字幕| 一本大道av伊人久久综合| 欧美福利专区| 久久久青草青青国产亚洲免观|