前言
ChatGPT的火熱大家應該都有目共睹,文案工作者、翻譯工作者和畫師等各種行業(yè)都在被嘲即將失業(yè)。不光是這些崗位的員工,作為資深社畜程序猿也能感受到會受到?jīng)_擊。網(wǎng)上很多人都在發(fā)ChatGPT寫的代碼,并開始大肆宣揚AI要取代程序員了,今天測一測使用ChatGPT來生成一些代碼,看看到底AI到底會不會真的直接替程序猿,還是大家炒作的噱頭。當然使用ChatGPT還是需要各種操作,科學上網(wǎng)、注冊和付費等,這里就不進行教學了,如果愿意折騰的請自行查詢折騰吧。這里就以Unity3d的著色器需求進行了測試。
綠幕摳圖
綠幕摳圖功能在視頻交互場景還是很有這方面的需求,在有綠幕攝像頭畫面的場景中,將人物進行摳圖并疊加場景等,這里我讓ChatGPT幫我編寫一個綠幕摳圖的著色器:
其給出的源碼如下:
Shader "Custom/GreenScreen" {
Properties {
_MainTex ("Texture", 2D) = "white" {}
_GreenScreenKeyColor ("Green Screen Key Color", Color) = (0,1,0,1)
}
SubShader {
Tags {"Queue"="Transparent" "RenderType"="Opaque"}
Pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
sampler2D _MainTex;
float4 _GreenScreenKeyColor;
float4 _ScreenParams;
struct appdata {
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f {
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
};
v2f vert (appdata v) {
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = v.uv;
return o;
}
fixed4 frag (v2f i) : SV_Target {
float4 tex = tex2D(_MainTex, i.uv);
float3 key = _GreenScreenKeyColor.rgb;
float3 src = tex.rgb;
float dist = distance(key, src);
if (dist < 0.05) {
discard;
} else {
return tex;
}
}
ENDCG
}
}
}
并給出了簡單的說明:
該shader使用了一個名為“_GreenScreenKeyColor”的屬性,它接受一個顏色值作為輸入,用于指定要去除的顏色。在頂點著色器中,將紋理坐標(uv)傳遞給片段著色器。在片段著色器中,將使用tex2D函數(shù)從_MainTex采樣紋理,并計算像素的顏色是否與關(guān)鍵顏色接近。如果是,則放棄該像素;否則返回原始紋理顏色。
當我將上面的代碼放入Unity工程中新建的shader文件中時,還是不正確的效果,而且編譯有錯誤:
我依次按提示進行了修改,一個是多出的變量定義,另一個錯誤是if – else中有分支無返回的邏輯錯誤。修改后的代碼:
Shader "Custom/GreenScreen" {
Properties{
_MainTex("Texture", 2D) = "white" {}
_GreenScreenKeyColor("Green Screen Key Color", Color) = (0,1,0,1)
}
SubShader{
Tags {"Queue" = "Transparent" "RenderType" = "Opaque"}
Pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
sampler2D _MainTex;
float4 _GreenScreenKeyColor;
struct appdata {
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f {
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
};
v2f vert(appdata v) {
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = v.uv;
return o;
}
fixed4 frag(v2f i) : SV_Target {
float4 tex = tex2D(_MainTex, i.uv);
float3 key = _GreenScreenKeyColor.rgb;
float3 src = tex.rgb;
float dist = distance(key, src);
if (dist < 0.05) {
discard;
}
return tex;
}
ENDCG
}
}
}
這樣我在網(wǎng)上找了個“勇敢勇敢我的朋友”的綠幕素材視頻進行了測試,在設(shè)置了摳圖顏色值的_GreenScreenKeyColor,效果如下:
其實這個著色器基本滿足了我的功能需求,不過因為它的屬性還是單一的顏色摳圖設(shè)置,所以會有邊緣未扣干凈的情況。
輪廓增強
這里我繼續(xù)進行了輪廓增強的shader的對話:
自帶的說明,該shader具有三個屬性:紋理、輪廓顏色和輪廓寬度。在主Pass中,我們獲取輸入像素的顏色,并根據(jù)輪廓寬度計算出alpha值,然后將輸入顏色和輪廓顏色進行插值,從而產(chǎn)生輪廓增強效果。
同樣的這個著色器也是沒法直接使用的:
undeclared identifier '_MainTex’Compiling Fragment program Platform…
‘tex2D’: no matching 2 parameter intrinsic function; Possible intrinsic functions are: tex2D(sampler2D, float2|half2|min10float2|min16float2)…
invalid subscript ‘uv’ Compiling Vertex program Platform…
Output value ‘vert’ is not completely initialized Compiling Vertex program Platform…
按提示修改為如下:
Shader "Custom/Outline" {
Properties{
_MainTex("Texture", 2D) = "white" {}
_OutlineColor("Outline Color", Color) = (0,0,0,1)
_OutlineWidth("Outline Width", Range(0,10)) = 1
}
SubShader{
Tags {"Queue" = "Transparent" "RenderType" = "Opaque"}
Pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
sampler2D _MainTex;
fixed4 _OutlineColor;
float _OutlineWidth;
struct appdata {
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f {
float4 pos : SV_POSITION;
float2 uv : TEXCOORD0;
};
v2f vert(appdata v) {
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
o.uv = v.uv;
return o;
}
fixed4 frag(v2f i) : SV_Target {
fixed4 col = tex2D(_MainTex, i.uv);
float2 d = fwidth(i.uv);
float alpha = 1 - smoothstep(_OutlineWidth - d.x, _OutlineWidth + d.x, col.a);
return lerp(col, _OutlineColor, alpha);
}
ENDCG
}
}
}
但是功能并不是我所需要的:
可能進行多次對話和優(yōu)化,其充分理解了需求能解決這個問題。我讓他繼續(xù)進行了代碼解釋:
以上Shader代碼定義了一個名為"Custom/Outline"的Shader。該Shader有三個屬性:_MainTex(紋理)、_OutlineColor(輪廓顏色)和_OutlineWidth(輪廓寬度)。在實際使用中,這些屬性可以在Material面板上進行設(shè)置。
Shader中的SubShader定義了渲染管線階段,并且使用了Tags指令來指定Shader Queue和RenderType。在這個例子中,我們將隊列設(shè)置為Transparent并將RenderType設(shè)置為Opaque以確保深度測試正常工作。
Pass指令用于定義著色器最終的輸出顏色,包括頂點著色器和片元著色器兩種類型。在這個例子中,我們使用CGPROGRAM指令將Cg/HLSL語言嵌入到Shader中,然后使用#pragma vertex vert和#pragma fragment frag指令分別定義了頂點著色器和片元著色器。
在接下來的代碼中,我們定義了兩個結(jié)構(gòu)體:appdata和v2f。appdata結(jié)構(gòu)體保存了輸入頂點的位置信息,而v2f結(jié)構(gòu)體保存了傳遞給片元著色器的位置信息。
在頂點著色器vert函數(shù)中,我們將輸入位置轉(zhuǎn)換為剪裁空間中的位置,并將其賦值給v2。
賽博朋克風格
之后我再讓其幫忙編寫一個簡單的賽博朋克風格的shaderlab代碼著色器:
其簡單說明了該著色器:
這個shader使用了標準的表面著色模型,在表面著色函數(shù)中對材質(zhì)的屬性進行了設(shè)置和計算。其中,Albedo屬性使用了一個2D紋理和顏色值來確定表面的基礎(chǔ)色,Metallic屬性用于控制金屬感,Smoothness屬性用于控制光滑度,Emission屬性用于添加發(fā)光效果。此外,還添加了一些偽裝置光,使得物體表面呈現(xiàn)出類似賽博朋克風格的效果。
給出的代碼也是沒法直接進行使用的,報錯如下:
invalid subscript ‘worldNormal’
在輸入的結(jié)構(gòu)體內(nèi)添加了參數(shù):
struct Input {
float2 uv_MainTex;
float3 worldNormal : TEXCOORD0;
};
去除了報錯,其效果如下:
感覺效果還行的,不過具體是否是賽博朋克風格我也無法界定了,不過Albedo屬性和Emission屬性其實都是沒有的。文章來源:http://www.zghlxwxcb.cn/news/detail-422102.html
總結(jié)
從上面的測試能看出ChatGPT的強大毋庸置疑,當然它給出的代碼也不是完美無瑕的(從上面的測試可以看出來都是有錯誤的),目前來說它直接平替一個程序員應該說還不現(xiàn)實的,因為它寫的代碼還是需要程序員來走查代碼,并進行修改和優(yōu)化。
當然它還在不斷優(yōu)化,不說干掉所有的程序員,干掉那些很基礎(chǔ)的工作內(nèi)容是完全可能的,到時候可能就涉及到程序猿的大幅縮減了(僅個人看法),雖然“馬斯克們”呼吁暫停,OpenAI創(chuàng)始人:AI需要政府與社會的共同監(jiān)管,但是等發(fā)展和監(jiān)管體系完善后AI的發(fā)展仍然會向前發(fā)展。不過我們現(xiàn)在在使用這個ChatGPT完全是被別人掐這脖子走,不給我們用就不給,目前ChatGPT突遭大面積封號,根據(jù)傳聞,受影響的賬戶已經(jīng)達到了數(shù)百萬,亞洲是重災區(qū),其中不少都是國內(nèi)的賬號。所以我們要正常使用可能還有很長的路走。
當然面臨AI的對我們搬磚人的沖擊,我們應該怎樣面對呢?
說說個人的拙見吧,與其恐懼它,排斥和抵觸AI,不如嘗試駕馭它,讓其成為我們的工具,讓其臣服于我們,而不是敵視它、被它替換。文章來源地址http://www.zghlxwxcb.cn/news/detail-422102.html
到了這里,關(guān)于讓AI臣服,而不是被它替代!讓ChatGPT為我們編寫Unity3d Shaderlab的著色器(shader)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!