軟件測試培訓(xùn)一般多少錢長春seo排名優(yōu)化
目錄
一、前言
二、“渲染兩次”
三、本次成品介紹
四、第一次渲染代碼
五、第二次渲染代碼?
六、截止目前的所有代碼
七、調(diào)整代碼
八、總結(jié)?
一、前言
之前一直講的shader文件中,都只寫了一次CG代碼。
為了大家對這部分的整體理解,我們這次渲染兩次。
二、“渲染兩次”
這個詞是我造的~不是定義。
什么叫渲染兩次?
渲染就是畫畫的意思,渲染兩次就是畫兩次。這里用畫畫舉例。
第一次畫畫。(如圖1所示)

這里如果用文字描述一下,就是畫了一個綠色的三角形。
第二次畫畫。(如圖2所示)
?

?如果用語言形容就是,在中間畫了一個橘黃色的圓形。
所以我們一套結(jié)構(gòu)CG結(jié)構(gòu)就是畫了一幅畫。(如圖3所示)
不用太在意具體寫的什么代碼,主要注意一些標志
CGPROGRAM前面是一些準備工作,像之前的模版寫入,深度寫入之類的。
ENDCG就是結(jié)束了繪制
中間就是一些繪制過程,引入一些材料。
這個全過程就是一次畫畫的全過程。

?
?渲染兩次的意思是,我可以在一個shader文件中寫兩套這個東西。
三、本次成品介紹
我們這次先畫一個模型的黑影,但是這個黑影要比模型本身大一點。這個做法參考上節(jié)課的代碼。
Unity | Shader基礎(chǔ)知識(第二十一集:應(yīng)用-怪獸膨脹、頂點著色器和表面著色器合并)_unity 頂點膨脹shader-CSDN博客
然后再正常把模型渲染上去,就可以給模型做一個陰影或者說邊框。(如圖4所示)

?
四、第一次渲染代碼
我們第一次先畫一個模型的黑影(如圖4所示),
備注:模型還是用上節(jié)課的模型。代碼還是用的上節(jié)課的思路。

Properties{//模型的貼圖_MainTex ("Texture", 2D) = "white" {}//邊框的大小(膨脹的大了,邊框就大,反之就小)_Outline ("Outline Width", Range(0.002,0.1)) = 0.005//邊框的顏色,我們要做黑影,所以就先來個黑色_OutlineColor ("Outline Color", Color) = (0,0,0,1)}SubShader{CGPROGRAM//引用,同上一集#pragma surface surf Lambert vertex:vert//承接上面素材,略sampler2D _MainTex;float4 _OutlineColor;float _Outline;void vert(inout appdata_full v){//讓原本的頂點在法線的方向上增加一點位置,這樣影子就會變大v.vertex.xyz += v.normal * _Outline;}//其實目前代碼里都沒用到,但因為用了表面著色器,必須寫struct Input{float2 uv_MainTex;};void surf(Input IN,inout SurfaceOutput o){//我們把顏色直接給到自發(fā)光//備注:這里給到貼圖也是可以的,但自發(fā)光要更亮一點,可以自己試o.Emission = _OutlineColor.rgb;}ENDCG}
這樣我們第一次渲染就畫好了。
五、第二次渲染代碼?
到了ENDCG以后,就是這次畫已經(jīng)畫完了,接下來我們再畫模型真正的樣子。
第二次不需要膨脹,所以頂點那部分就不用加了,直接把顏色上上去。這部分講太多遍了,就不詳解了。
CGPROGRAM#pragma surface surf Lambert struct Input{float2 uv_MainTex;};sampler2D _MainTex;void surf(Input IN, inout SurfaceOutput o){o.Albedo = tex2D(_MainTex, IN.uv_MainTex).rgb;}ENDCG}
六、截止目前的所有代碼
Shader "Unlit/019"
{Properties{_MainTex ("Texture", 2D) = "white" {}_Outline ("Outline Width", Range(0.002,0.1)) = 0.005_OutlineColor ("Outline Color", Color) = (0,0,0,1)}SubShader{//第一套渲染-------------------------------------CGPROGRAM#pragma surface surf Lambert vertex:vertstruct Input{float2 uv_MainTex;};sampler2D _MainTex;float4 _OutlineColor;float _Outline;void vert(inout appdata_full v){v.vertex.xyz += v.normal * _Outline;}void surf(Input IN,inout SurfaceOutput o){o.Emission = _OutlineColor.rgb;}ENDCG//第二套渲染--------------------------------------CGPROGRAM#pragma surface surf Lambert struct Input{float2 uv_MainTex;};sampler2D _MainTex;void surf(Input IN, inout SurfaceOutput o){o.Albedo = tex2D(_MainTex, IN.uv_MainTex).rgb;}ENDCG}
}
到這里我只是想證明給你們,渲染可以在后面加的,并不是只能寫在那一個里面。
七、調(diào)整代碼
到現(xiàn)在為止,我們渲染出來的結(jié)果。(如圖5所示)

這并不是我們想要的樣子,為什么會都是黑色,因為黑色部分是膨脹的,比彩色的大,所以被藏在里面了。(如圖6所示)你可以通過增加膨脹的系數(shù)在縫隙里面看見。

解決方案:把深度寫入關(guān)掉。
不管是你在外面還是里面,都畫出來。
代碼如下。(如圖7所示)

到這里一步我們就可以得到(如圖8所示)?

但是下一步的麻煩就是,我把模型背面也渲染出來了。
解決方案:在渲染黑色自發(fā)光時,關(guān)掉深度寫入,在渲染模型時(第二次畫畫時),打開深度寫入。(如圖9所示)
?
這樣我們就可以得到我們想要的結(jié)果了。
八、總結(jié)?
本節(jié)想表達的重點:
1.渲染可以寫好幾次
2.每次渲染之前,可以去調(diào)節(jié)后面渲染的一些方式。本次案例用深度寫入為例子。