昨天群里有個朋友提問,一個場景中只有相機绵脯、平行光和一個Cube,相機的Clear Flags設(shè)置為Skybox蛆挫,Cube給了一個簡單的材質(zhì),Shader名為"Unlit/test":
Shader "Unlit/test"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
Tags { "Queue"="Geometry" }
LOD 100
Cull Off
ZWrite Off //不寫入深度
ZTest Always
Pass
{
...
}
}
}
結(jié)果無法渲染出cube瞧剖,如圖:
然后改為ZWrite On寫入深度可免,可以渲染出來:
這里就有一個疑問了,為什么呢浇借?
群里大家都討論了一番,結(jié)論是因為Cube沒有寫入深度時Skybox將cube覆蓋了逮刨,寫入深度就不會覆蓋,可以渲染出來堵泽,但是我印象中Skybox使用的渲染隊列是"Background","Background"的值是1000迎罗,而這里Cube的渲染隊列是"Geometry",也就是非透明opaque纹安,值是2000砂豌,Unity的渲染順序是按照從小到大渲染的:
Background(1000)-->Geometry(2000)-->AlphaTest(2450)-->GeometryLast(2500)-->Transparent(3000)-->Overlay(4000)
SkyBox使用的材質(zhì)是"Skybox/Procedural"
按照Unity官方的說法光督,應(yīng)該先渲染Skybox,然后渲染Cube筐摘,那么Cube無論是否寫入深度都會被渲染出來船老,為什么沒有渲染出來咖熟,于是又打開Frame Debugger:
可以看到確實是先渲染非透明隊列馍管,再渲染Skybox,這個就比較奇怪了确沸,難道Background在非透明之后嗎躬存?
于是又copy了Cube的Shader张惹,將Shader名改為"Unlit/test1"岭洲,將隊列改為"Background",這次都改為ZWrite On盾剩,將"Unlit/test1"的color乘以紅色fixed(1,0,0,1),忽略Skybox屎暇,只比較"Background"和"Geometry"的渲染先后驻粟,再分別copy一個Cube1和材質(zhì)球根悼,使用渲染隊列為為"Background"的Shader蜀撑,Cube1的x軸偏移一點:
可以看到"Geometry"確實是在Background之后渲染酷麦,那為什么Skybox使用的渲染隊列是"Background",卻在"Geometry"之后呢沃饶?Skybox使用的渲染順序到底是多少轻黑?
于是又做了個測試琴昆,還是使用Cube和"Unilt/test"的Shader氓鄙,關(guān)閉深度寫入ZWrite Off椎咧,嘗試去修改Inspector中材質(zhì)的Render Queue的值,當(dāng)值改為2501時蟋座,Cube渲染出來了:
所以猜測Skybox的渲染順序是2500脚牍,相當(dāng)內(nèi)置的隊列是"GeometryLast",即Skybox是在非透明渲染的最后才渲染诸狭。