我正在尝试使用Shells技术在Unity中实现毛发.Fins技术是故意遗漏的,因为我希望它在低端手机(主要是Android设备)上运行,并且需要OpenGL ES 3.0及更高版本,而Shells技术只需要OpenGL ES 2.0.
有一个基于XNA的Shell技术的例子,我试图将它移植到Unity但它无法工作.这是XNA项目的文章.
在XNA着色器:
float4x4 World;
float4x4 View;
float4x4 Projection;
float CurrentLayer; //value between 0 and 1
float MaxHairLength; //maximum hair length
texture FurTexture;
sampler FurSampler = sampler_state
{
Texture = (FurTexture);
MinFilter = Point;
MagFilter = Point;
MipFilter = Point;
AddressU = Wrap;
AddressV = Wrap;
};
struct VertexShaderInput
{
float3 Position : POSITION0;
float3 Normal : NORMAL0;
float2 TexCoord : TEXCOORD0;
};
struct …Run Code Online (Sandbox Code Playgroud) 我不得不将XNA着色器移植到Unity的着色器中,并想验证我是否正确执行了此操作.
Pass1使用alpha混合的部分SrcBlend,DestBlend并将set的cull设置为none是我唯一想要确保正确的地方.
这是XNA着色器版本:
pass Pass1
{
AlphaBlendEnable = true;
SrcBlend = SRCALPHA;
DestBlend = INVSRCALPHA;
CullMode = None;
VertexShader = compile vs_2_0 TheVertexShader();
PixelShader = compile ps_2_0 ThePixelShader();
}
Run Code Online (Sandbox Code Playgroud)
这是我制作的Unity Shaderlab端口:
Tags{ "Queue" = "Transparent" "RenderType" = "Transparent" }
LOD 100
Blend SrcAlpha One
Blend DstAlpha OneMinusSrcAlpha
ZWrite Off
Cull Off
Run Code Online (Sandbox Code Playgroud)
它似乎在Unity中工作正常,但这是Unity中完全相同的传递设置吗?如果没有,则需要进行哪些更改以获得确切的等效性.
我正在尝试创建一个函数,将Unity游戏中的每个Resources数据转储到一个文件,并能够从当前加载的场景中转储屏幕上的视频,音频,脚本名称和图像.
我试图为着色器数据做同样的事情时遇到困难,例如Textures和Matrix,Vectors和int值以及浮点数.我知道我可以通过这些Material.GetXXX功能获得这些形成.
例如,我当前可以Texture从标准着色器获取main ,该着色器具有以下命名的Texture类型属性_MainTex:
Material mat = gameObject.GetComponent<MeshRenderer>().material;
Texture mat1Tex = mat.GetTexture("_MainTex");
SaveTex(mat1Tex);
Run Code Online (Sandbox Code Playgroud)
问题是我需要知道属性的名称以及它的类型,例如Texture,Matrix,Float,Color等,然后才能在运行时获取它们的值
我希望来自第三方资源的许多着色器都在项目中,手动遍历每个着色器,复制它们的属性名称和类型以便我可以获取数据会很复杂.
有没有办法获得着色器属性和使用Material.GetXXX函数检索其值所需的类型?如果这不可能,有没有办法单独转储着色器数据?
注意:
这不是一个保存功能,我不是在寻找保存和加载游戏状态的方法.这是一个用于分析Unity游戏并对其进行故障排除的插件.
在 Unity Shaderlab 着色器中,您可以向编辑器中的材质检查器公开着色器属性。这可以通过将要公开的属性放置在该Properties部分中来完成,如下所示
Properties
{
_SomeFloat("A Float", float) = 5
}
Run Code Online (Sandbox Code Playgroud)
Unity 在此处的文档中定义了属性列表。
然而,这不包括任何形式的 float2 或 vector2,只是单个Float或Vector由 组成xyzw。
我尝试将属性类型设置为float2And Vector2
_SomeFloat("A Float", float2) = (5,5)
_SomeFloat2("A Float2", Vector2) = (5,5)
Run Code Online (Sandbox Code Playgroud)
两者都返回错误Parse error: syntax error, unexpected TVAL_ID at line 7
或者试图Vector通过只设置一半的成员来将其减半
_SomeFloat("A Float", Vector) = (5,5)
Run Code Online (Sandbox Code Playgroud)
返回错误Parse error: syntax error, unexpected ')', expecting ','
我可以只使用 Vector 类型并且只使用它的xy,但这会导致 UI 不清晰,因为检查器中现在有两个未使用的元素,并且找不到允许HideInInspector您隐藏zw值的属性属性或抽屉(例如 …