天天看点

真Unity3D_分享要给卡通海水Shader入门Shader实战的几件事情这里,我用了国外的一个“卡通画”工程

假如你有一点编程基础

假如你有一点高中数理化基础

假如你读过“大学”

假如你工作过几年

假如你用过几个月Unity3d

假如你对计算机渲染有兴趣

假如你知道opengl,shader,图形学等

假如你懂得上面这么多。。。。。

你是不用往下看的。。。。。

Shader实战的几件事情

1.颜色抓取器(可判断Shader值)

2.Shader编辑器(不存在的,能.txt写程序最好)

3.快速获取模型和noise等贴图

4.一个靠谱的项目工程

这里,我用了国外的一个“卡通画”工程

0.Camera需要开深度空间:

camera.xxxx =  xxx.Depth;
           

1.拖几个物件,建立1个小水坑,加上一个水的“平面”物件

2.建立一个空的Unlit Shader,和material,附加到水的“平面”物件

3.Shader,填入

//inside vert struct  //在vert结构声明 写的代码
screenPos: TEXCOORD2

//inside vert shader //再顶点shader部分 写的 
o.screenPos = ComputeScreenPos(o.vertex);
           

4.然后,再frag shader,写

float existingDepth01 = tex2Dproj(_CameraDepthTexture,UNITY_PROJ_COORD(i.screenPos)).r;
float existingDepthLinear = LinearEyeDepth(existingDepth01);
float depthDifference = existingDepthLinear - i.screenPos.w;
           

正文从这里开始(这里只是入门和实战,建议按上面步骤操作一次,不用怕,不会很深讲解理论知识,操作到这里,就只会再操作一两步骤,很快完事)

假如,上面的步骤操作正确,你会看到

真Unity3D_分享要给卡通海水Shader入门Shader实战的几件事情这里,我用了国外的一个“卡通画”工程

5.还是,再frag shader

float waterDepthDfference01 = saturate(depthDifference / _DepthMaxDistance);
           

重点是,一个数再除以一个可以无限大的分量,作用是??

真Unity3D_分享要给卡通海水Shader入门Shader实战的几件事情这里,我用了国外的一个“卡通画”工程

作用就是把1个原来值的最小值,再无限缩小,(0.1 -> 0.01)。计算机图形学,有点意思

//完整工程,相当于上面的靠谱工程项目

继续阅读