您当前的位置: 首页 >  unity

Jave.Lin

暂无认证

  • 1浏览

    0关注

    704博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Unity Shader - 简单山脉 - 顶点着色器重构法线

Jave.Lin 发布时间:2020-03-14 17:12:03 ,浏览量:1

此文是基于之前的一篇:Unity Shader - 使用Noise噪点图生成简单山脉(使用tex2Dlod控制顶点高度)写的,这篇使用tex2Dlod的,虽然将控制顶点的高度逻辑放到了vertex shader(顶点着色器)中读取高度图来控制了,但是却丢失了实时的法线控制,因为之前在CSharp脚本控制山脉顶点高度时有调用:Mesh.RecalculateNormals();,所以运行后,可以看到山脉可以与灯光有正常的交互。

那么这儿重新写的这篇就是既能在vertex shader中控制高度,也能保留实时调整顶点法线,让山脉与灯光能正常交互。

效果

材质有个:Rebuild Normal 的下拉列表项:On就是开启重构法线,Off就是关闭。 可以看到Off时,整个山脉就如同一个Quad的光照一下,没有立体感。On之后,可以看到山脉可以与方向光有交互了。 在这里插入图片描述

Shader

先大概看看代码,后面会将到思路。 主要在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             
关注
打赏
1664331872
查看更多评论
0.0417s