1. 程式人生 > >Shader 學習筆記 20151201

Shader 學習筆記 20151201

Segment 1 閱讀

  • 看了cook book的第六大章

Segment 2 理解

  • 感覺解決這個問題就好了,渲染序列和Ztest Zwrite
  • 渲染序列是一個tag,表示渲染的先後順序。特別注意的是:這個tag表示渲染順序!!!事實上,在Unity裡面,Geo層是優化過的(它不是按照距離camera的距離渲染的),其它層都是按照距離camera的距離,從遠到近的渲染。有些人會問如果一個obj是斜著的,那麼距離從哪裡算?很粗暴,按中心點算
  • 固體、透明體;ZWrite on/off;渲染順序真值表。
    結論是,固體開啟ZWrite,渲染順序隨便搞。而透明體不交叉時,還有的搞,交叉了要死。
    這裡寫圖片描述

  • 於是想到,是否交叉的透明體可以用Ztest去逐點比較depth,然後計算呢?其實這有點複雜。如果你現在srcObj在destiObj後面(也就是新render的點離camera比較近)就好搞,這可以歸結為正常渲染順序一類。但是如果srcObj在destiObj前面,就難了,這時候如果硬要做的話我們不僅需要srcObj的color和depth,還需要srcObj的透明度(這個透明度最難搞,因為如果你是3、4層以上透明物體疊起來的話,需要用演算法先求出前幾層疊過之後的透明度,這個硬體上目前就不支援,除非硬體專門做了,才好弄)。另外亂序之後還有一個最刺激的情況,根本無法操作了,見下圖這裡寫圖片描述
    在這個圖裡,先渲染1、再渲染2、最後渲染3、對於GPU這種流水線buffer方式的硬體來說,根本搞不了。因為在你渲染3的時候,必須完整的知道1和2的完整引數,而這個對於硬體來說不可能開這麼多的空間給你存這些個東西。