ChatGPT的火热大家应该都有目共睹,文案工作者、翻译工作者和画师等各种行业都在被嘲即将失业。不光是这些岗位的员工,作为资深社畜程序猿也能感受到会受到冲击。网上很多人都在发ChatGPT写的代码,并开始大肆宣扬AI要取代程序员了,今天测一测使用ChatGPT来生成一些代码,看看到底AI到底会不会真的直接替程序猿,还是大家炒作的噱头。当然使用ChatGPT还是需要各种操作,科学上网、注册和付费等,这里就不进行教学了,如果愿意折腾的请自行查询折腾吧。这里就以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函数从_MainTex采样纹理,并计算像素的颜色是否与关键颜色接近。如果是,则放弃该像素;否则返回原始纹理颜色。
当我将上面的代码放入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
}
}
}
这样我在网上找了个“勇敢勇敢我的朋友”的绿幕素材视频进行了测试,在设置了抠图颜色值的_GreenScreenKeyColor,效果如下:

其实这个着色器基本满足了我的功能需求,不过因为它的属性还是单一的颜色抠图设置,所以会有边缘未扣干净的情况。
这里我继续进行了轮廓增强的shader的对话:

自带的说明,该shader具有三个属性:纹理、轮廓颜色和轮廓宽度。在主Pass中,我们获取输入像素的颜色,并根据轮廓宽度计算出alpha值,然后将输入颜色和轮廓颜色进行插值,从而产生轮廓增强效果。
同样的这个着色器也是没法直接使用的:
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
}
}
}
但是功能并不是我所需要的:

可能进行多次对话和优化,其充分理解了需求能解决这个问题。我让他继续进行了代码解释:
以上Shader代码定义了一个名为"Custom/Outline"的Shader。该Shader有三个属性:_MainTex(纹理)、_OutlineColor(轮廓颜色)和_OutlineWidth(轮廓宽度)。在实际使用中,这些属性可以在Material面板上进行设置。
Shader中的SubShader定义了渲染管线阶段,并且使用了Tags指令来指定Shader Queue和RenderType。在这个例子中,我们将队列设置为Transparent并将RenderType设置为Opaque以确保深度测试正常工作。
Pass指令用于定义着色器最终的输出颜色,包括顶点着色器和片元着色器两种类型。在这个例子中,我们使用CGPROGRAM指令将Cg/HLSL语言嵌入到Shader中,然后使用#pragma vertex vert和#pragma fragment frag指令分别定义了顶点着色器和片元着色器。
在接下来的代码中,我们定义了两个结构体:appdata和v2f。appdata结构体保存了输入顶点的位置信息,而v2f结构体保存了传递给片元着色器的位置信息。
在顶点着色器vert函数中,我们将输入位置转换为剪裁空间中的位置,并将其赋值给v2。
之后我再让其帮忙编写一个简单的赛博朋克风格的shaderlab代码着色器:

其简单说明了该着色器:
这个shader使用了标准的表面着色模型,在表面着色函数中对材质的属性进行了设置和计算。其中,Albedo属性使用了一个2D纹理和颜色值来确定表面的基础色,Metallic属性用于控制金属感,Smoothness属性用于控制光滑度,Emission属性用于添加发光效果。此外,还添加了一些伪装置光,使得物体表面呈现出类似赛博朋克风格的效果。
给出的代码也是没法直接进行使用的,报错如下:
invalid subscript ‘worldNormal’
在输入的结构体内添加了参数:
struct Input {
float2 uv_MainTex;
float3 worldNormal : TEXCOORD0;
};
去除了报错,其效果如下:

感觉效果还行的,不过具体是否是赛博朋克风格我也无法界定了,不过Albedo属性和Emission属性其实都是没有的。
从上面的测试能看出ChatGPT的强大毋庸置疑,当然它给出的代码也不是完美无瑕的(从上面的测试可以看出来都是有错误的),目前来说它直接平替一个程序员应该说还不现实的,因为它写的代码还是需要程序员来走查代码,并进行修改和优化。
当然它还在不断优化,不说干掉所有的程序员,干掉那些很基础的工作内容是完全可能的,到时候可能就涉及到程序猿的大幅缩减了(仅个人看法),虽然“马斯克们”呼吁暂停,OpenAI创始人:AI需要政府与社会的共同监管,但是等发展和监管体系完善后AI的发展仍然会向前发展。不过我们现在在使用这个ChatGPT完全是被别人掐这脖子走,不给我们用就不给,目前ChatGPT突遭大面积封号,根据传闻,受影响的账户已经达到了数百万,亚洲是重灾区,其中不少都是国内的账号。所以我们要正常使用可能还有很长的路走。
当然面临AI的对我们搬砖人的冲击,我们应该怎样面对呢?
说说个人的拙见吧,与其恐惧它,排斥和抵触AI,不如尝试驾驭它,让其成为我们的工具,让其臣服于我们,而不是敌视它、被它替换。
我想用ruby编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序
我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b
英文版英文链接关注公众号在“亚特兰蒂斯的回声”中踏上一段难忘的冒险之旅,深入未知的海洋深处。足智多谋的考古学家AriaSeaborne偶然发现了一件古代神器,揭示了一张通往失落之城亚特兰蒂斯的隐藏地图。在她神秘的导师内森·兰登教授的指导和勇敢的冒险家亚历克斯·默瑟的帮助下,阿丽亚开始了一段危险的旅程,以揭开这座传说中城市的真相。他们的冒险之旅带领他们穿越险恶的大海、神秘的岛屿和充满陷阱和谜语的致命迷宫。随着Aria潜在的魔法能力的觉醒,她被睿智勇敢的QueenNeria的幻象所指引,她让她为即将到来的挑战做好准备。三人组揭开亚特兰蒂斯令人惊叹的隐藏文明,并了解到邪恶的巫师马拉卡勋爵试图利用其古
本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01 客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02 数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit
我使用rails3.1+rspec和factorygirl。我对必填字段(validates_presence_of)的验证工作正常。我如何让测试将该事实用作“成功”而不是“失败”规范是:describe"Addanindustrywithnoname"docontext"Unabletocreatearecordwhenthenameisblank"dosubjectdoind=Factory.create(:industry_name_blank)endit{shouldbe_invalid}endend但是我失败了:Failures:1)Addanindustrywithnona
我正在尝试用Ruby(Rails)编写一个正则表达式,以便用户名的字符仅包含数字和字母(也没有空格)。我有这个正则表达式,/^[a-zA-Z0-9]+$/,但它似乎没有用,我在Rails中收到一个错误,说“The如果正则表达式使用多行anchor(^或$),这可能会带来安全风险。您是要使用\A和\z,还是忘记添加:multiline=>true选项?"我的user.rb模型中此实现的完整代码是:classUser我做错了什么以及如何修复此正则表达式,使其仅对数字和字母有效而不对空格有效?谢谢。 最佳答案 简短回答:使用/\A[a-z
为了减少我的小Rails应用程序中的代码重复,我一直致力于将我的模型之间的通用代码放入它自己的单独模块中,到目前为止一切顺利。模型的东西相当简单,我只需要在开头包含模块,例如:classIso这工作正常,但是现在,我将有一些Controller和View代码,这些代码也将在这些模型之间通用,到目前为止,我有这个用于我的可发送内容:#Thisisamodulethatisusedforpages/formsthatarecanbe"sent"#eitherviafax,email,orprinted.moduleSendablemoduleModeldefself.included(kl
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭11年前。Ruby是一种美丽的语言,但有一个我讨厌写很多次的关键词“结束”。有什么方法可以写出简洁的代码而不用每次都写“end”吗?
写在之前Shader变体、Shader属性定义技巧、自定义材质面板,这三个知识点任何一个单拿出来都是一套知识体系,不能一概而论,本文章目的在于将学习和实际工作中遇见的问题进行总结,类似于网络笔记之用,方便后续回顾查看,如有以偏概全、不祥不尽之处,还望海涵。1、Shader变体先看一段代码......Properties{ [KeywordEnum(on,off)]USL_USE_COL("IsUseColorMixTex?",int)=0 [Toggle(IS_RED_ON)]_IsRed("IsRed?",int)=0}......//中间省略,后续会有完整代码 #pragmamulti_c
2022年底,OpenAI的预训练模型ChatGPT给人工智能领域的爱好者和研究人员留下了深刻的印象和启发,他展现的惊人能力将人工智能的研究和应用热度推向高潮,网上也充斥着和ChatGPT的各种聊天,他可以作诗、写小说、写代码、讨论疫情问题等。下面就是一些他的神回复:人命关天的坑: 写歌,留给词作者的机会不多了。。。 回答人类怎么样面对人工智能: 什么是ChatGPT?借用网上的一段介绍,ChatGPT是由人工智能研究实验室OpenAI在2022年11月30日发布的全新聊天机器人模型,一款人工智能技术驱动的自然语言处理工具。它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动