Unity3d 使用过程的统一CG纹理分层

Unity3d 使用过程的统一CG纹理分层,unity3d,Unity3d,这就是我想要实现的 具有主着色器的纹理几何体 按照法线的投影量在第一个纹理上叠加第二个纹理 以下是我当前的着色器代码: Shader "Custom/FurShader" { Properties { _MainTex( "Main Texture", 2D ) = "white" {} _MaxHairLength( "Max Hair Length", Float ) = 0.5 _NoOfPasses( "Number of Passes", Flo

这就是我想要实现的

  • 具有主着色器的纹理几何体
  • 按照法线的投影量在第一个纹理上叠加第二个纹理
  • 以下是我当前的着色器代码:

    Shader "Custom/FurShader" 
    {
    
    Properties 
    
    {
    
        _MainTex( "Main Texture", 2D ) = "white" {} 
    
        _MaxHairLength( "Max Hair Length", Float ) = 0.5
    
        _NoOfPasses( "Number of Passes", Float ) = 2.0
    
    }
    
    
    
    CGINCLUDE
    
    //includes
    
    #include "UnityCG.cginc"    
    
    
    
    //structures
    
    struct vertexInput
    
    {
    
        float4 vertex : POSITION;
    
        float4 normal : NORMAL;
    
        float4 texcoord : TEXCOORD0;
    
    };
    
    
    
    struct fragmentInput 
    
    {
    
        float4 pos : SV_POSITION;
    
        half2 uv : TEXCOORD0;           
    
    };
    
    
    
    //uniforms
    
    uniform float _MaxHairLength;                       
    
    uniform sampler2D _MainTex;
    
    uniform float4 _MainTex_ST;
    
    
    
    uniform sampler2D _SecondTex;
    
    uniform float4 _SecondTex_ST;
    
    
    
    uniform float _NoOfPasses;
    
    
    
    //function
    
    inline fragmentInput LevelFragmentShader( vertexInput i, int level )
    
    {
    
        fragmentInput o;
    
    
    
        float movementDist = ( _MaxHairLength / _NoOfPasses ) * level;      
    
    
    
        float4 pos = ( i.vertex + ( i.normal * movementDist ) );             
    
    
    
        o.pos = mul( UNITY_MATRIX_MVP, pos );       
    
        o.uv = TRANSFORM_TEX( i.texcoord, _SecondTex );
    
    
    
        return o;
    
    }
    
    
    
    half4 frag( fragmentInput i ) : COLOR
    
    {
    
        return tex2D( _SecondTex, i.uv );
    
    }
    
    
    
    ENDCG
    
    
    
    SubShader {
    
        Tags { "Queue" = "Transparent"}
    
        Blend SrcAlpha OneMinusSrcAlpha
    
    
    
        Pass
    
        {   
    
            CGPROGRAM
    
            // Upgrade NOTE: excluded shader from OpenGL ES 2.0 because it does not contain a surface program or both vertex and fragment programs.
    
            #pragma exclude_renderers gles
    
            #pragma vertex vert 
    
            #pragma fragment frag_unique                    
    
    
    
            fragmentInput vert( vertexInput i )
    
            {
    
                fragmentInput o;
    
    
    
                o.pos = mul( UNITY_MATRIX_MVP, i.vertex );
    
                o.uv = TRANSFORM_TEX( i.texcoord, _MainTex );               
    
    
    
                return o;
    
            }
    
    
    
            half4 frag_unique( fragmentInput i ) : COLOR
    
            {
    
                return tex2D( _MainTex, i.uv );
    
            }
    
    
    
    
    
            ENDCG
    
        }
    
        Pass
    
        {   
    
            CGPROGRAM
    
            // Upgrade NOTE: excluded shader from OpenGL ES 2.0 because it does not contain a surface program or both vertex and fragment programs.
    
            #pragma exclude_renderers gles
    
            #pragma vertex vert
    
            #pragma fragment frag                   
    
    
    
            fragmentInput vert( vertexInput i )
    
            {
    
                fragmentInput o = LevelFragmentShader( i, 1 );              
    
    
    
                return o;
    
            }
    
    
    
    
    
            ENDCG
    
        }
    
    
    
    } 
    
    FallBack "Diffuse"
    
    }
    
    但正如您所看到的,第二个纹理的结果不是垂直于边到边投影。任何建议都很好,我确信我的数学是正确的vertxPos+(正常*投影距离)。这可能与我如何使用unitys ModelViewProjection Matrix有关吗

    图像显示结果

    分层的预期结果是什么?你在尝试实现某种形式的纹理喷溅吗?谢谢你的兴趣Jerdak。最终,它将成为一个使用外壳纹理的毛发着色器,每个级别都是着色器中的一个过程。我提出了这个预期的实现,因为unity不允许您通过脚本管理每个对象的绘图调用,这不是我能找到的,也不是他们论坛上的任何人都能告诉我的。好的,在平面上尝试相同的共享后,它工作得非常好,我猜unity对它的立方体做了一些我不知道的事情。