使用通行证的Unity CG纹理分层

时间:2013-10-25 09:00:51

标签: unity3d

这就是我想要完成的事情

  1. 使用主着色器的纹理几何
  2. 在第一个纹理上按照法线按照预计的数量对第二个纹理进行分层。
  3. 这是我当前的着色器代码:

    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 +(Normal * projectionDistance)。这可能与我如何使用统一的ModelViewProjection Matrix有关吗?

    显示结果的图像 http://i1265.photobucket.com/albums/jj508/maxfire1/Capture_zpsc8db2b1f.png

0 个答案:

没有答案