CG語言入門一輸入輸出和語義
阿新 • • 發佈:2019-02-11
一、頂一個簡單的shader
shader程式碼:
Shader "Custom/surface_shader_custom" { SubShader { //surface shader是對頂點和片段的封裝,所以不需要pass通道,但是片段著色器必須有pass通道 //在CGPROGRAM與ENDCG之間可以嵌入CG程式碼斷 pass{ CGPROGRAM //vertex後面可以指定頂點的函式名 //要求頂點和片段程式都必須要編寫,否則缺一個就不能得到正確的執行 #pragma vertex vert #pragma fragment frag //頂點程式必須對資料進行處理,並輸出 //頂點程式,冒號後面需要加語義 void vert(in float2 objPos:POSITION,out float4:POSITION){ pos= float4(objPos,0,1) } //片段程式拿到頂點程式中的輸入結果,然後再進行最終結果的計算 void frag(){ col=float4(1,0,0,1) } ENDCG } } FallBack "Diffuse" }
新增一個球體,一個材質material,新增一個shader,將shader新增到材質上,並將材質賦給球體
二、在頂點程式中進行輸出
Shader "Custom/surface_shader_custom" { SubShader { //surface shader是對頂點和片段的封裝,所以不需要pass通道,但是片段著色器必須有pass通道 //在CGPROGRAM與ENDCG之間可以嵌入CG程式碼斷 pass{ CGPROGRAM //vertex後面可以指定頂點的函式名 //要求頂點和片段程式都必須要編寫,否則缺一個就不能得到正確的執行 #pragma vertex vert #pragma fragment frag //頂點程式必須對資料進行處理,並輸出 //頂點程式,冒號後面需要加語義 void vert(in float2 objPos:POSITION,out float4 pos:POSITION,out float4 col:COLOR){ pos= float4(objPos,0,1); //賦值,給藍色 col=float4(0,0,1,1); } //片段程式拿到頂點程式中的輸入結果,然後再進行最終結果的計算 //inout的意思是既是從頂點程式中輸入進來的,也會進行輸出 void frag(inout float4 col:COLOR){ //col=float4(1,0,0,1); } ENDCG } } FallBack "Diffuse" }
賦的是藍色的值,不知道為什麼會是黑色,不管在輸入的地方顏色改成什麼都顯示是黑色
三、在片段程式中將顏色改為綠色
在片段程式中將顏色改為了綠色,但是不知道為什麼球體的顏色是紅色,不管輸出改成什麼顏色都是顯示成紅色Shader "Custom/surface_shader_custom" { SubShader { //surface shader是對頂點和片段的封裝,所以不需要pass通道,但是片段著色器必須有pass通道 //在CGPROGRAM與ENDCG之間可以嵌入CG程式碼斷 pass{ CGPROGRAM //vertex後面可以指定頂點的函式名 //要求頂點和片段程式都必須要編寫,否則缺一個就不能得到正確的執行 #pragma vertex vert #pragma fragment frag //頂點程式必須對資料進行處理,並輸出 //頂點程式,冒號後面需要加語義 void vert(in float2 objPos:POSITION,out float4 pos:POSITION,out float4 col:COLOR){ pos= float4(objPos,0,1); //賦值,給藍色 col=float4(0,0,1,1); } //片段程式拿到頂點程式中的輸入結果,然後再進行最終結果的計算 //inout的意思是既是從頂點程式中輸入進來的,也會進行輸出 void frag(inout float4 col:COLOR){ //在片段程式中將顏色改為綠色 col=float4(1,0,0,1); } ENDCG } } FallBack "Diffuse" }
四、座標
計算機的圖形硬體,想要對3d場景中的物體進行正確的顯示的時候,需要經過一系列座標系的變換。比如說,輸入的是一個物體的座標系,那麼物體的座標系是沒有參考價值的,最終要放到世界座標系中,與其它物體有一個相對位置,同時還被攝像機進行照射,擺在不同的位置,攝像機最終取景的位置不一樣,通過這一系統的變化,會有一個被稱作c v v的裁剪立方體,c v v實際上就是我們在進行攝像機透視投影在其次空間當中的一個裁剪立方體,它的值總是取決於x從-1到+1,y也是-1到+1。對於預設建立的一個cube,unity在這個cube當中的網格資料的頂點資訊當中儲存的最大的x是0.5,最小的x是-0.5,最大的y是0.5,最小的y是-0.5,而模型的中心處於(0,0)位置。