前言
通过shader实现一个波光粼粼的鱼的效果,效果如下图所示,鱼的游动是用的animator,我们也可以用shader通过模型vertex偏移来实现鱼儿的游动。
学无止境
在游戏开发中实时阴影是比较常见的需求,我们最常见的方法是实时光照,但是这个会带来性能的问题,如果场景中模型比较多,例如我最近在做的3D足球游戏,场景中22个球员,如果采用实时光照DC会增加好几百,会造成渲染的压力,就有必要采用关照贴图的方案,比关闭掉实时光,但这种方案就降低了DC,减轻了渲染压力,这就要求阴影必须采用其他方案,我这里介绍Shader来现在的方案,貌似是王者荣耀采用的一种方案,专门用一个pass来渲染球员的阴影。
会看到模型有实时阴影效果。
纹理坐标也叫UV坐标,UV坐标都是0~1,并不是我们所理解的像素坐标,相当于是一个百分比。
将纹理的颜色取代漫反射的颜色
1 | Shader "AladdinShader/11 Single Texture Shader" |
我们找一个纹理贴图
然后将贴图赋值给_MainTex属性,调整一下高光颜色和整体贴图颜色属性并且查看效果
第一组效果:
第二组效果:
Specular=直射光颜色*pow(max(cosθ,0),10) θ:是发现和x的夹角 x是平行光和视野方向的平分线
1 | Shader "AladdinShader/09 Specular Fragment Blinn Phong Shader" |
会发现高光部分会显得更大了,这也是平时用的比较多的高光反射模型。
光照模型就是一个公式,使用这个公式来计算在某个点的光照效果。
在标准光照模型里面,我们把进入摄像机的光分为下面四个部分:
以上都是模拟生活中的光照效果,并不等同于实际生活中的光照计算,实际生活中的光照会更加复杂。
漫反射计算放在顶点函数里面就是逐顶点光照
Disffuse = 直射光颜色*max(0,cosθ) (θ是法线跟光照的夹角) 如果夹角小于0的话就是背光面就直接取黑色
理论知识:
光照模型就是一个公式,使用这个公式来计算在某个点的光照效果。
在标准光照模型里面,我们把进入摄像机的光分为下面四个部分:
自发光
类似生活中的萤火虫等自己能够发光
高光反射
类似生活中的镜子,近似认为百分百反射出去
漫反射
类似生活中的光照射到墙壁上、桌子上的反光不会百分百反射出去,各个方向都会反射。
环境光
类似生活中的光照照射在某个物体上,物体漫反射然后反射到其他物体上这些过程的光是环境光。
以上都是模拟生活中的光照效果,并不等同于实际生活中的光照计算,实际生活中的光照会更加复杂。
漫反射计算放在顶点函数里面就是逐顶点光照
Disffuse = 直射光颜色*max(0,cosθ) (θ是法线跟光照的夹角) 如果夹角小于0的话就是背光面就直接取黑色
理论知识:
a*b=|a||b|cosθ
a*b=c c的一个向量,值是|a||b|sinθ
more >>
顶点着色器是流水线的第一个阶段,它的输入来自于CPU。顶点着色器的处理单位是顶点,也就是说输入进来的每个顶点都会调用一次顶点着色器。
顶点着色器需要完成的工作主要有:坐标变换和逐顶点光照。当然,除了这两个主要任务外,顶点着色器还可以输出后续阶段所需的数据。
坐标变换,顾名思义,就是对顶点的坐标进行某种变换。例如我们可以通过改变顶点位置来模拟水面,布料等。