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对它的立方体做了一些我不知道的事情。