Shadow Caster Culling 使用文檔

簡(jiǎn)介:

實(shí)時(shí)渲染(Real-Time rendering)中,陰影映射(Shadow mapping)過程是限制渲染速度的一個(gè)非常重要的環(huán)節(jié),因?yàn)樵诿恳粠秩局埃覀冞€需要對(duì)整個(gè)場(chǎng)景進(jìn)行一次深度緩沖(depth buffer)的渲染(shadow pass),用來檢測(cè)物體是否在陰影中。
本工具的作用是,針對(duì)該過程,對(duì)場(chǎng)景中的物體進(jìn)行離線(off-line)的預(yù)處理,將那些在渲染中投射的陰影沒有意義的物體標(biāo)記出來,這樣,在渲染過程中,就可以通過讀取標(biāo)記,在shadow
pass過程中忽略這些物體,進(jìn)而對(duì)渲染過程進(jìn)行加速。

原理:

之前提到有些物體在陰影映射中,它所投射的陰影是“無意義”的,這種“無意義”主要分以下兩種情況:

  1. 該物體完全被其他物體所遮擋:
    在這種情況下,根據(jù)shadow mapping的原理,任何處于該物體陰影之下的物體同時(shí)也會(huì)完全處于其他物體的陰影之下,因此在shadow pass這種物體可以完全忽略。
  2. 該物體所投射的陰影中并不存在其他物體:
    在這種情況下,在渲染中,并不會(huì)有任何物體的顏色計(jì)算需要該物體所投射的陰影,因此該陰影也是沒有意義的。(這種情況最多發(fā)生在地形(Terrain)上)

使用說明

  • 環(huán)境設(shè)置
    本工具使用Visual Studio 2012編譯,所需要的庫文件以及頭文件均在工具根目錄的include文件夾以及l(fā)ib文件夾中,同時(shí)所需要的.dll文件均在工具根目錄的debug文件夾中。

  • 配置文檔
    程序的可配置文檔是在根目錄下的GlobalSetting.xml,用戶可以通過修改配置文檔來配置工具的輸入與參數(shù),其中可修改的輸入與參數(shù)如下:

    1. 場(chǎng)景管理系統(tǒng)總目錄(Resource_Path):即所使用的場(chǎng)景管理系統(tǒng)BWResource的總目錄,全部chunks,models等信息所保存的目錄。
    2. 區(qū)塊資源目錄(Universe_Path):即區(qū)塊(chunks)等信息所在目錄。
    3. 窗口以及高度映射圖的大小(Window_HMap_size):即窗口以及高度圖的長(zhǎng)和寬。
    4. 鄰近區(qū)塊數(shù)量(Num_Chunks):在檢測(cè)某一區(qū)塊中的物體時(shí),需要將周圍的區(qū)塊全部考慮在內(nèi),因?yàn)楫?dāng)前區(qū)塊的物體可能會(huì)遮擋或被周圍的區(qū)塊的物體所遮擋。在這里可以設(shè)置需要考慮在內(nèi)以當(dāng)前區(qū)塊為中心的鄰近區(qū)塊的行列數(shù)(left, right, top, bottom)。
    5. 光源集合(Light_Set):因?yàn)楣庠纯赡艽嬖诙鄠€(gè)或是一天的光源的位置及角度也會(huì)變化,因此本工具支持多光源輸入,工具會(huì)逐一對(duì)不同光源進(jìn)行檢測(cè),并將不同光源的結(jié)果寫入.chunks文件的shadow字段中。
    6. 光源(Light):對(duì)于多光源輸入,直接可以通過在配置文檔中按照下述樣例格式添加<Light></Light>即可。光源的可配置的屬性如下:
      a. 位置(Position)
      b. 方向(Direction):通過設(shè)置光源的水平夾角(horizontal angle)與垂直夾角(vertical angle)。(關(guān)于方向的設(shè)置可參考下圖)
      c. 投影類型(ProjectionType):目前只支持Directional光(如有需求,很容易修改)
      d. 投影矩陣的參數(shù)(Projection_Parameters): 寬度(Width),高度(Height),近剪裁平面距離(Near),遠(yuǎn)剪裁平面距離(Far)。
    7. 蒙版偏差(Stencil_Bias):該屬性決定了在蒙版寫入時(shí),需要剪裁掉地形高度以上多少偏差的物體。(為了避免地形高度信息保存在的texture精度不足的誤差)
    8. 渲染延遲(Render_Delay):該屬性可以設(shè)置檢測(cè)不同chunk或者不同光源下的渲染的間隔時(shí)間,因?yàn)樵跈z測(cè)結(jié)束后會(huì)渲染出結(jié)果在窗口中,因此可以通過設(shè)置較大的間隔時(shí)間來觀察檢測(cè)結(jié)果(檢測(cè)結(jié)果會(huì)用顏色標(biāo)記),或是設(shè)置為0達(dá)到最快的檢測(cè)速度。(單位為毫秒ms)

    配置文檔的基本格式如下:

 <?xml version="1.0" encoding="gb2312"?>    
<Node>    
  <Header>    
    <EngName>Global Parameters Setting</EngName>    
  </Header>    
  <Parameters>    
    <Resource_Path type="string" describe="BWResource Manager source path">
      res
    </Resource_Path>    
    <Universe_Path type="string" describe="Universe(chunks) source path">
      universes/eg/jd_shuijing
    </Universe_Path>    
    <Window_HMap_size describe="Window and Height Map size">
      <Width type="int">1280</Width>
      <Height type="int">800</Height>    
    </Window_HMap_size>
    <Num_Chunks  describe="Num of the nearby chunks to consider">
      <Left type = "int">1</Left>
      <Right type = "int">1</Right>
      <Top type = "int">1</Top>
      <Bottom type = "int">1</Bottom>
    </Num_Chunks>
    <Light_Set describe="Light Settings">
      <Light> <!--- 光源1 -->
        <Pos describe="Light Pos">
          <World_X type = "double">100.0</World_X>
          <World_Y type = "double">100.0</World_Y>
          <World_Z type = "double">100.0</World_Z>
        </Pos>
        <Direction describe = "Light Direction">
          <Horizontal type = "double">3.92699081699</Horizontal>
          <Vertical type = "double">-0.78539816339</Vertical>
        </Direction>
        <ProjectionType type = "string" describe = "Directional/Point">
          Directional
        </ProjectionType>
        <Projection_Parameters>
          <Width type = "double">300.0</Width>
          <Height type = "double">300.0</Height>
          <Near type = "double">-500.0</Near>
          <Far type = "double">1500.0</Far>
        </Projection_Parameters>
      </Light>
      <Light> <!--- 光源2 -->
        <Pos describe="Light Pos">
          <World_X type = "double">0.0</World_X>
          <World_Y type = "double">100.0</World_Y>
          <World_Z type = "double">0.0</World_Z>
        </Pos>
        <Direction describe = "Light Direction">
          <Horizontal type = "double">0.78539816339</Horizontal>
          <Vertical type = "double">-0.78539816339</Vertical>
        </Direction>
        <ProjectionType type = "string" describe = "Directional/Point">
          Directional
        </ProjectionType>
        <Projection_Parameters>
          <Width type = "double">300.0</Width>
          <Height type = "double">300.0</Height>
          <Near type = "double">-500.0</Near>
          <Far type = "double">1500.0</Far>
        </Projection_Parameters>
      </Light>
    </Light_Set>
    <Stencil_Bias type = "double">
        0.0005
    </Stencil_Bias>
    <Render_Delay type = "int">
      0
    </Render_Delay> 
  </Parameters>    
</Node> 
  • 工具運(yùn)行
    設(shè)置好配置文檔之后,直接運(yùn)行工具即可自動(dòng)處理。在工具運(yùn)行中,將會(huì)出現(xiàn)兩個(gè)窗口,一個(gè)窗口為渲染窗口,在該窗口可以看到從光源角度出發(fā),進(jìn)行渲染的圖像,其中灰色用來標(biāo)記周圍鄰近的chunks,紅色標(biāo)記陰影無意義的物體,綠色標(biāo)記陰影有意義物體。可以通過增大Render_Delay來更長(zhǎng)時(shí)間的觀察結(jié)果。另一個(gè)窗口為控制臺(tái)窗口,這里可以看到chunk處理的結(jié)果,以及從配置文件中讀取成功的參數(shù)信息。

  • 運(yùn)行結(jié)果
    如上述所示,運(yùn)行結(jié)果會(huì)實(shí)時(shí)顯示在渲染窗口中。與此同時(shí),檢測(cè)結(jié)果還會(huì)寫入到場(chǎng)景文件中的.chunk文件的<shadow>字段中

      <terrain>
          <resource>  ffffffffo.cdata/terrain </resource>
          <shadow>    2   </shadow>
      </terrain>
    

 ,同時(shí)對(duì)于model,還會(huì)將結(jié)果寫入model下的<PrimitiveGroup>中

 <model>
    <resource>  objects/area/st/model/rock.model    </resource>
    <dye>
        <name>  com_tex_shiq01  </name>
        <tint>  huang   </tint>
    </dye>
    <uuid>  6055E290-4CC63BB3-1E14A3AE-0DFBE9A0 </uuid>
    <transform>
        <row0>  -0.991167 0.118751 0.820961 </row0>
        <row1>  -0.662710 0.655975 -0.894993    </row1>
        <row2>  -0.498893 -1.107288 -0.442164   </row2>
        <row3>  46.615074 -96.943344 12.009224  </row3>
    </transform>
    <affectByBlend> true    </affectByBlend>
    <specPixelPerMeter> 20.000000   </specPixelPerMeter>
    <shadow>    2
        <RenderSet>
              <Geometry>
                  <PrimitiveGroup>    2   </PrimitiveGroup>
              </Geometry>
              </RenderSet>
      </shadow>
  </model>

寫入格式為32位的int格式,其中每一位代表從一個(gè)光源(Light)出發(fā)的檢測(cè)結(jié)果,同時(shí)model下<shadow>字段。在讀取檢測(cè)信息的時(shí)候,需要按位讀取,其中從右數(shù)第一位開始代表光源1到光源N,例如:僅光源01與光源02,若檢測(cè)結(jié)果為光源02為有意義,01無意義,則寫入<PrimitiveGroup>的結(jié)果為2,即*****0010(前面位數(shù)省略)。
而對(duì)于寫入<shadow>的結(jié)果,如果同一個(gè)model存在多個(gè)RenderSet或PrimitiveGroup,則結(jié)果為其model下所有PrimitiveGroup結(jié)果的位或。

<model>
<resource> objects/area/zw/model/zw_mlqm01_6381.model </resource>
<uuid> BCF2EFBF-46D323BC-204E259B-CB3D47BA </uuid>
<transform>
<row0> -0.327740 -0.027205 0.326609 </row0>
<row1> 0.000000 0.461894 0.038475 </row1>
<row2> -0.327741 0.027205 -0.326609 </row2>
<row3> 10.023972 -88.602753 57.472660 </row3>
</transform>
<affectByBlend> true </affectByBlend>
<dye>
<name> Material #35 </name>
<tint> bai </tint>
</dye>
<shadow> 3
<RenderSet>
<Geometry>
<PrimitiveGroup> 2 </PrimitiveGroup>
<PrimitiveGroup> 3 </PrimitiveGroup>
</Geometry>
</RenderSet>
</shadow>
</model>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,786評(píng)論 6 534
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,656評(píng)論 3 419
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,697評(píng)論 0 379
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,098評(píng)論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,855評(píng)論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,254評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,322評(píng)論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,473評(píng)論 0 289
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,014評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,833評(píng)論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,016評(píng)論 1 371
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,568評(píng)論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,273評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,680評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,946評(píng)論 1 288
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,730評(píng)論 3 393
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,006評(píng)論 2 374

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,787評(píng)論 18 139
  • 在簡(jiǎn)書里偶然看到寫作馬拉松的活動(dòng),興興然參加。報(bào)了半程,一天之內(nèi)要碼兩萬多字。 加入寫作馬拉松的微信群,填寫參賽表...
    吃西瓜閱讀 333評(píng)論 0 1
  • 今天跟老弟聊天,趁著他問我要錢這當(dāng)口,損了他幾句: 其實(shí)有時(shí)候想想,我還是挺羨慕他的,在十五六歲之時(shí)打架斗毆、抽煙...
    晞之閱讀 845評(píng)論 2 17
  • everyone has two sides one is kind and one bad oh the fuc...
    我在那一角落患過傷風(fēng)啊閱讀 215評(píng)論 0 2
  • 4.10《嫌疑人X的獻(xiàn)身》 【day29盈盈】 突然之間很心疼石神,這個(gè)單純,簡(jiǎn)單,固執(zhí),聰明的男人。對(duì)于自己喜歡...
    蘇小盈閱讀 87評(píng)論 0 0