Shader语法_Unity3d的HLSL之(三)的一些错误提示

学了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天一直敲代码,我们还真偷笑,不是敲一行代码,摸鱼一小时吗?但背后逻辑就是所见即所得,大牛可以摸鱼,新手还是得好好锻炼

如何排查问题,大牛就是看一眼就知道什么问题了,是经验问题么?好像也不全是,但好像大部分情况是,如果遇到了经验意外的问题,天才也花半天处理,所以真正的大牛要能“预见问题,避开问题”

解决问题什么的是不可能解决的了

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

avi9111

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值