学了12年英文,可能你还是不会说,唯一的方法就是去一个全英语的环境,那么你一个月的英语水平提高的速度将绝对比你学12年还快,什么时候去最好?怎么才能准备好,答案是,根本不用准备,而且越快越好!
Partice make Perfect
哪怕写错了,也要继续尝试写
不积跬步,无以致千里
最近归纳了一下,Shader有几个重点:
Unity做了“”一些“”改版,并不是原生Shader
Shader是一门程序语言
Shader并没有专门的编辑器和Debugger,
Shader是用来控制GPU渲染的
针对以上几点,重点说说:
第一点:Shader被改的乱七八炸,这有点废话,虚幻不改,大牛不改?你平时写程序不改?就是很多人以为世界上只有一种英语。。。。
Unity用的人不少,学习的,培训的,实战的都一大堆,所以会很乱
第二点:这是一门编*程*语*言哦,这就好办了,shader我不懂,gpu压根没见过,但是编程我擅长哦。。。。
第三点:所有难懂的然后程序员又自认为好用的语言,就是都类似BAT,BASH等脚本,还要什么自行车
碰到的一些错误:
1.错误1
Shader error in 'Unlit/ImageEffect': Did not find shader kernel 'vert' to compile (on d3d11
A:可能原因
1.顶点和片元的函数名不统一
2.定义的时候写了分号
正确写法
CGPROGRAM
#pragma vertex vert
#pragma fragment frag//片元入口函数
#include "UnityCG.cginc"//引用unity里面的CG库
2.错误2
Output variable vert_img contains a system-interpreted value (SV_POSITION) which must be written in every execution path of the shader. Unconditional initialization may help.
Compiling Vertex program
Platform defines: UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_FULL_HDR
Output variable vert_img contains a system-interpreted value (SV_POSITION) which must be written in every execution path of the shader
这句英文的意思是 vert_img这个变量有问题,你可以按变量关键字搜索这个,
应该,就是我下面回复的,我的错在这行:struct app_data{ xxx:sv_position;}
解决方法,同下面错误5
而which must be written in every execution path of shader 里的execution path(shader 执行路径)就是vert() 和frag() 这2个方法
3.错误3
undeclared identifier 'unity_WorldToLight'
这个小哥,解释不错
#include "AutoLight.cginc"
但还必须
#ifdef POINT
或者
#ifdef SPOT
4.问题4
cannot map expression to vs_4_0 instruction set
tex2D(_MainTex, f.uv) 采样函数
采样函数只能在frag函数里使用,没人跟萌新讲过有这回事啊,萌新全都写在vert函数中了,找了好久好久的bug都不知道问题出在哪里.
顺带一提,报错是这个cannot map expression to vs_4_0 instruction set
5.错误5‘vert’: output parameter ‘o’ not completely initialized:
需要添加UNITY_INITIALIZE_OUTPUT(Input, name)来进行初始化。
void vert(inout appdata_full v, out Input o)
{
//对输出进行初始化
UNITY_INITIALIZE_OUTPUT(Input, o);
//采集顶点色
o.vertColor = v.color;
}
6.implicit tuncation of vetor type
就只是一个提示,虽然没有报错,原因可能有很多种,但核心就是错误的类型赋值,例如:vector3 == vector4就会出这个warning
//写这个代码的人,虽然只需要用到第一个R通道,但变量就是变量,该是什么类型就是什么类型
//half scatter = SAMPLE_TEXTURE2D(_Scattering, sampler_Scattering, input.uv);
//改为half4
half4 scatter = SAMPLE_TEXTURE2D(_Scattering, sampler_Scattering, input.uv);
新手如何编程
其实从上面的问题就不难看出,程序,编程的入门其实无他,
无非,就是细心细心再细心(哥完全没有),
很多,问题就是无非有无分号的问题,“;”很重要,如果不是分号问题,那么就是大小写问题
(经验所得,一般要超过2年的程序生涯才有可能避免和及时发现这个问题,编程的过程中充满各种变量定义,方法命名);
其实看一个人能不能区分大小写就知道他的码龄了,和树的年轮一样,贼准!
另外,就是所见即所得,就是你改一行代码,必须马上就能看到结果,对于一些应用类的开发尤其如此,而且新学一个语言确实这样,且不说“”不积跬步无以致远“”,就是一个小问题不处理好,后面大问题,莫名其妙的问题就会让你处理不过来。很多人以为程序员就是一天坐10天一直敲代码,我们还真偷笑,不是敲一行代码,摸鱼一小时吗?但背后逻辑就是所见即所得,大牛可以摸鱼,新手还是得好好锻炼
如何排查问题,大牛就是看一眼就知道什么问题了,是经验问题么?好像也不全是,但好像大部分情况是,如果遇到了经验意外的问题,天才也花半天处理,所以真正的大牛要能“预见问题,避开问题”
解决问题什么的是不可能解决的了