此文是基于之前的一篇:Unity Shader - 使用Noise噪点图生成简单山脉(使用tex2Dlod控制顶点高度)写的,这篇使用tex2Dlod的,虽然将控制顶点的高度逻辑放到了vertex shader(顶点着色器)中读取高度图来控制了,但是却丢失了实时的法线控制,因为之前在CSharp脚本控制山脉顶点高度时有调用:Mesh.RecalculateNormals();
,所以运行后,可以看到山脉可以与灯光有正常的交互。
那么这儿重新写的这篇就是既能在vertex shader中控制高度,也能保留实时调整顶点法线,让山脉与灯光能正常交互。
效果材质有个:Rebuild Normal 的下拉列表项:On就是开启重构法线,Off就是关闭。 可以看到Off时,整个山脉就如同一个Quad的光照一下,没有立体感。On之后,可以看到山脉可以与方向光有交互了。
先大概看看代码,后面会将到思路。 主要在vertex shader处理就好了。 其他代码不变:
请详细查看注释,该说明的都说了。
// jave.lin 2020.03.14 - vertex shader重构法线核心逻辑
v2f vert (appdata v) {
v2f o;
...
#if _REBUILD_NORMAL_ON // 开始重构法线
// reconstruct normals
// 这个4x4数据也可以通过外部传入,可以节省顶点着色器ALU的计算量与L1 caches缓存量。
const float4x4 offset_xz = {
{+1,+0, /* gap **/ +1,-1}, // 右下
{+0,-1, /* gap **/ -1,-1}, // 左下
{-1,+0, /* gap **/ -1,+1}, // 左上
{+0,+1, /* gap **/ +1,+1} // 右上
};
// gridGap是没个顶点上下左右的距离(在CSharp端生成时设置,可以传入shader也行,这里我偷懒,就写死了)
const float gridGap = 5;
// 默认向量也可以外部传入,因为上面的默认法线是可以调整的
// 下面我讲默认法线初始化为:up
float3 sumNormal = float3(0, 1, 0);
for (int i = 0; i
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?