1

これは私が達成しようとしているものです

  1. プライマリ シェーダーを使用したテクスチャ ジオメトリ
  2. 法線に従って投影された量だけ、最初のテクスチャの上に 2 番目のテクスチャを重ねます。

ここに私の現在のシェーダーコードがあります:

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"

}

しかし、ご覧のとおり、2 番目のテクスチャは端から端まで垂直に投影されていません。どんな提案も素晴らしいでしょう、私は私の数学が正しいと確信しています vertxPos + ( Normal * projectDistance) ユニティModelViewProjection Matrixの使用方法と関係があるのでしょうか?

結果を示す画像 http://i1265.photobucket.com/albums/jj508/maxfire1/Capture_zpsc8db2b1f.png

4

0 に答える 0