Unity Standard shader 修改(增加本地坐标裁剪)

本想随便找一个裁剪的shader,可无奈的是没找到一个shader符合要求,美术制作的场景都是用的都标准的着色器他们不在乎你的功能逻辑需求,他们只关心场景的表现,那又找不到和unity标准着色器表现一样的shader

1.通过贴图的透明通道做裁剪效果,发现贴图受tiling和 offset属性的制约

2.通过uv坐标逆计算或者传入的uv不做tiling offset的计算,发现建模小伙子uv展的稀碎

3.uv不能用,那只能顶点的位置做裁剪

4.啃源码

standard shader:

standard shader引用的 UnityStandardCoreForward.cginc

 #include "UnityStandardCoreForward.cginc"

找到这个文件打开,打开发现里面啥也没有一个判断,根据宏判断然后引用不同的文件里面的顶点片元函数,我需要的是在下面的文件里修改

   #include "UnityStandardCore.cginc"

打开这个文件,发现里面引用的文件太多了,没办法全部复制到你的shader pass中,为了防止影响到原standard shader,我全部重新创建,最终的文件是这样的

我需要的是根据顶点的位置裁剪片元,然后找到最终的片元处理函数 

fragBase (VertexOutputForwardBase i) 

在函数中添加顶点的判断逻辑

half4 fragBase (VertexOutputForwardBase i) : SV_Target {
    half4 colLight =fragForwardBaseInternal(i);
    if(abs(i.posLocal.x -_VertexCut.x)<_VertexCut.w *0.5f
            && (i.posLocal.x<_VertexCut.x) 
            &&abs(i.posLocal.y -_VertexCut.y)<0.3f){
    }  else{
     discard;
    }                        
    return colLight; 
}

由于顶点信息没有传进来,然后需要在VertexOutputForwardBase的结构体中加入变量

struct VertexOutputForwardBase
{
    UNITY_POSITION(pos);
    float4 tex                            : TEXCOORD0;
    float4 eyeVec                         : TEXCOORD1;    // eyeVec.xyz | fogCoord
    float4 tangentToWorldAndPackedData[3] : TEXCOORD2;    // [3x3:tangentToWorld | 1x3:viewDirForParallax or worldPos]
    half4 ambientOrLightmapUV             : TEXCOORD5;    // SH or Lightmap UV
    float3 posLocal                          : TEXCOORD9;   //新添加的局部顶点变量
    UNITY_LIGHTING_COORDS(6,7)

    // next ones would not fit into SM2.0 limits, but they are always for SM3.0+
#if UNITY_REQUIRE_FRAG_WORLDPOS && !UNITY_PACK_WORLDPOS_WITH_TANGENT
    float3 posWorld                     : TEXCOORD8;
#endif

    UNITY_VERTEX_INPUT_INSTANCE_ID
    UNITY_VERTEX_OUTPUT_STEREO
};

还需要在顶点函数中给结构体传入这个变量的值

   o.posLocal=v.vertex.xyz;

之后就能跑起来了,为了方便调试,修改shader的界面布局脚本,把需要裁剪的位置暴露给编辑器

,方法就是别的属性怎么写你就怎么写,然后shader引用布局的代码是在最后一句话,

 

   FallBack "VertexLit"
   CustomEditor "CStandardShaderGUI"

注意点就是,找到对应的pass,不要复制错位置,要是不知道当前使用的pass,把pass注释掉,测试使用的pass

没什么好说的了,都是照搬,不想写了,就这样吧

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-09 19:14:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-09 19:14:03       101 阅读
  3. 在Django里面运行非项目文件

    2024-06-09 19:14:03       82 阅读
  4. Python语言-面向对象

    2024-06-09 19:14:03       91 阅读

热门阅读

  1. dockerfile,shell脚本,yaml文件如何配合

    2024-06-09 19:14:03       26 阅读
  2. C++数据结构——队列queue

    2024-06-09 19:14:03       22 阅读
  3. 网络安全法对个人保护的要求

    2024-06-09 19:14:03       27 阅读
  4. 【面试宝藏】Redis 常见面试题解析

    2024-06-09 19:14:03       26 阅读
  5. 直接赋值导致响应式断开,前端深浅拷贝

    2024-06-09 19:14:03       26 阅读
  6. Rust-10-数据类型

    2024-06-09 19:14:03       26 阅读
  7. cocos入门7:向量点乘的应用举例

    2024-06-09 19:14:03       28 阅读
  8. 记一次Python matplotlib使用ffmpeg和imagemagick错误

    2024-06-09 19:14:03       26 阅读