首页 > 计算机图形学 > Shader > Shader表面着色器示例
2022
01-05

Shader表面着色器示例

示例转自:https://blog.csdn.net/poem_qianmo/article/details/42215079

效果预览

Shader表面着色器示例 - 第1张  | u3d8技术分享

最基本的Surface Shader

先看一个使用内建光照模式的最基本的Surface Shader应该怎么写:

可以发现,一个最基本的Surface Shader,至少需要有光照模式的声明、输入结构和表面着色函数的编写这三部分。

另外,主要注意其中的surf函数的写法,就是把上文讲到的Surface Output结构体中需要用到的成员变量拿来赋值:

注释中已经写得很明白,且之前也已经讲过,o.Albedo = 0.6;等效于写o.Albedo = float3(0.6,0.6,0.6);

来个举一反三,则o.Albedo =1;等效于写o.Albedo= float3(1,1,1);

Shader表面着色器示例 - 第2张  | u3d8技术分享

颜色可调

在最基本的Surface Shader的基础上,加上一点代码,就成了这里的可调颜色的Surface Shader:

Shader表面着色器示例 - 第3张  | u3d8技术分享

基本纹理载入

再来看看如何实现一个基本的纹理载入Surface Shader:

Shader表面着色器示例 - 第4张  | u3d8技术分享

凹凸纹理载入

让我们慢慢添加特性,使得到的Surface Shader的效果与功能越来越强大。接着来看看Surface Shader的凹凸纹理如何实现:

Shader表面着色器示例 - 第5张  | u3d8技术分享

纹理载入+颜色可调

接着看一看纹理如何通过一个finalcolor关键字自定义函数,来达到调色的目的:

Shader表面着色器示例 - 第6张  | u3d8技术分享

凹凸纹理+边缘光照

在之前凹凸纹理的基础上让我们加上喜闻乐见的边缘光照:

其中的viewDir 意为WorldSpace View Direction,也就是当前坐标的视角方向:

Shader表面着色器示例 - 第7张  | u3d8技术分享

关于surf中的两句新加的代码在这里也讲一下。

上面已经提到过,Normalize函数,用于获取到的viewDir坐标转成一个单位向量且方向不变,外面再与点的法线做点积。最外层再用 saturate算出一[0,1]之间的最靠近的值。这样算出一个rim边界。原理可以这样解释:

Shader表面着色器示例 - 第8张  | u3d8技术分享

这里o.Normal就是单位向量。外加Normalize了viewDir。因此求得的点积就是夹角的cos值。因为cos值越大,夹角越小,所以,这时取反来。这样,夹角越大,所反射上的颜色就越多。于是就得到的两边发光的效果。哈哈这样明了吧。

这里再介绍一下这个half。CG里还有类似的float和fixed。half是一种低精度的float,但有时也会被选择成与float一样的精度。先就说这么多吧,后面还会遇到的,到时候再讲。

我们将此Shader编译后赋给材质,得到如下效果,除了凹凸纹理的选择之外,还有边缘发光颜色和强度可供自由定制:

Shader表面着色器示例 - 第9张  | u3d8技术分享

凹凸纹理+颜色可调

接下来我们看看凹凸纹理+颜色可调的Shader怎么写:

Shader表面着色器示例 - 第10张  | u3d8技术分享

细节纹理

接着我们来看一个在屏幕上显示纹理细节的Shader:

Shader表面着色器示例 - 第11张  | u3d8技术分享

凹凸纹理+颜色可调+边缘光照+细节纹理

结合上面的8个Shader,我们可以完成本期文章这个结合了凹凸纹理+颜色可调+边缘光照+细节纹理的稍微复杂一点的Surface Shader:

Shader表面着色器示例 - 第12张  | u3d8技术分享
最后编辑:
作者:网虫虫
网虫虫
分享是一种快乐; 分享是一种美德; 分享是一种幸福!

0 0 votes
Article Rating
Subscribe
提醒
guest
0 评论
Inline Feedbacks
View all comments