unity shader:初探语义

来源:互联网 发布:linux 断电 丢失 文件 编辑:程序博客网 时间:2024/05/29 04:55

语义简介:实际上就是一个表达参数含义的字符串。

应用阶段到顶点着色器时用常用的语义如下:
POSITION:模型空间中的顶点坐标
NORMAL:模型空间中的法线方向
TANGENT:模型空间中的切线方向
TEXCOORDn:模型空间中第n组纹理坐标
COLOR:模型空间中顶点的颜色

顶点着色器传递数据给片元着色器时常用的语义如下:
SV_POSITION:裁剪空间中的顶点坐标
COLOR0:输出第一组顶点颜色,不是必须
COLOR1:输出第二组顶点颜色,不是必须
TEXCOORDn:输出第n组纹理坐标,不是必须

片元着色器输出数据到unity阶段常用的语义如下:
SV_Target:输出值存储到渲染目标中。

语义使用时注意点:
1.unity中有些语义是必须的,有些不是必须的,而且在不同的阶段,语义的必须性不一样,对于不必须的语义,我们可以自定义使用。
2.SV代表的含义是系统数值,在高版本的渲染引擎中会使用到,虽然低版本的渲染引擎也会有类似语义的字符串,但是最好用高版本的,这样可以向下兼容。
3.不同的shader model支持的语义类型各不相同,默认支持的是2.0版本,如果需要自己指定版本,可以使用”#pragmatarget 版本号”来指定。

shader应该注意的差异性:
1.平台差异:不同的平台,坐标系的轴心是不同的,但是unity内部又帮我们处理了这种差异,除非我们开启了抗锯齿功能,并且同时处理多张纹理时,就会出现主纹理和其他纹理的轴心不一致的问题,此时我们需要对其他纹理进行y轴转换,否则采样变换时,结果会是错的。
2.语法差异:由于DirectX中语法检测比较严格,一些OpenGL中通过的语法在DirectX中可能就不能通过,此时就必须要按照DirectX语法来操作shader。比如:float4类型赋值在OpenGL中可以只赋值一个参数,但是在DirectX中必须每个参数都赋值。
3.语义差异:不同的语义之间可能有相同的含义,但是在别的平台可能就不能表达相同的含义了,比如SV_POSITION和POSITION在DirectX和OpenGL平台上都表示齐次裁剪空间输出坐标,但是在PS4上就不是。

shader编写应该遵循的原则:
1.数据类型应该按照从小到大的使用原则,保证数据大小的最优化。
2.规范的语法,因为DirectX,OpenGL中存在不同的语法,所以应该使用两边都支持的语法。
3.规范的语义,因为DirectX,OpenGL中存在不同的语义,所以应该使用两边都支持的语义。
4.避免不必要的计算,因为着色器中寄存器和指令数是有限的,所以不宜计算过于复杂,可以通过制定shader target model大小来支持不同的指令和寄存器数。
5.慎用分支和循环语句,应该GPU中执行分支和循环语句性能会低。
6.不要除以0,因为这会造成一些未知的结果,有些平台会报错,有些平台不报错,但是取值具有随机性,得到结果不正确。

阅读全文
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 围棋遇到对方不停围堵怎么办? s围棋业余四段想提升怎么办 wps禁止创建分享链接怎么办 驾驶人开车违章不认可怎么办 京东白条退货分期服务费怎么办 新车年检标丢了怎么办 异地违章罚单丢了怎么办 异地现场违章罚单丢了怎么办 新车没有牌照过停车杆怎么办 驾照换证时间过了怎么办 杭州告知单丢了怎么办 电工证过了复审日期怎么办 大人有居住证小孩没有怎么办 异地补办身份证没有暂住证怎么办 挂科了心里难受怎么办 c1升b2考不过怎么办 b2驾照扣了1分怎么办 红绿色盲驾考怎么办 驾驶证忘带被交警查了怎么办 车子被扣45分怎么办 驾照被扣在外省交警支队怎么办 从渭南把驾照转到西安怎么办 a1a2驾驶证扣3分怎么办 车辆累计扣12分怎么办 驾照扣了40分怎么办 驾驶证扣了30分怎么办 b2驾照逾期未审怎么办 c1实习期扣6分怎么办 车子累计扣30分怎么办 实习期间扣满12分怎么办 新手驾照扣6分怎么办 a2驾驶证逾期未审验怎么办 c1驾照扣了6分怎么办 b1驾照被扣12分怎么办 b2驾驶本扣分了怎么办 驾驶本扣9分后怎么办 b1照扣12分怎么办 b2扣了15分怎么办 b2有扣分未年审怎么办 b2驾驶证扣4分怎么办 b2驾驶证扣10分怎么办