我正在尝试在运行时从附加在对象中的着色器获取value属性,但是在材质编辑器中永远不会更改它。也许我误解了着色器的工作原理?
我读过有关GetFloat,GetColor等的信息,但还没有弄清楚它如何在Update()中正确获取着色器的信息。这里的真正目标是(实时)从着色器捕获特定值,并在C#脚本中执行某些操作(如果可能)。
C#示例
public Color colorInfo;
Awake()
{
rend = GetComponent<Renderer>();// Get renderer
rend.material.shader = Shader.Find("Unlit/shadowCreatures");//shader
}
Update()// I want the info in a realtime
{
//get current float state of the shader
colorInfo = rend.material.GetColor("_Color");
//If I setup a white color in shader properties, the color in material editor is always white
}
着色器
Shader "Unlit/shadowCreatures"
{
Properties {
_Color ("Color", Color) = (1,1,1,1)
[PerRendererData]_MainTex ("Sprite Texture", 2D) = "white" {}
_Cutoff("Shadow alpha cutoff", Range(0,1)) = 0.5
}
SubShader {
Tags
{
"Queue"="Geometry"
"RenderType"="TransparentCutout"
"PreviewType"="Plane"
"CanUseSpriteAtlas"="True"
}
LOD 200
Cull Off
CGPROGRAM
// Lambert lighting model, and enable shadows on all light types
#pragma surface surf Lambert addshadow fullforwardshadows
// Use shader model 3.0 target, to get nicer looking lighting
#pragma target 3.0
sampler2D _MainTex;
fixed4 _Color;
fixed _Cutoff;
struct Input
{
float2 uv_MainTex;
};
void surf (Input IN, inout SurfaceOutput o) {
fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
o.Albedo = c.rgb;
o.Alpha = c.a;
clip(o.Alpha - _Cutoff);
_Color = (0,0,0,0); //trying turn to black just for a test, and nothing happens
}
ENDCG
}
FallBack "Diffuse"
}
谢谢您的时间
您几乎无法从着色器获得任何信息,GetColor
函数从您已经设置的检查器而不是从着色器返回颜色。
我想我已经知道您要做什么了,然后
将您的评论和问题汇总在一起,这是我想您要弄弄的东西:
void surf (Input IN, inout SurfaceOutput o) {
_Color = (0,0,0,0); //trying turn to black just for a test, and nothing happens
}
这并没有您认为的那样。该行设置this _Color
:
#pragma target 3.0
sampler2D _MainTex;
fixed4 _Color;
fixed _Cutoff; //here
不是这一个:
Properties {
_Color ("Color", Color) = (1,1,1,1) //here
[PerRendererData]_MainTex ("Sprite Texture", 2D) = "white" {}
_Cutoff("Shadow alpha cutoff", Range(0,1)) = 0.5
}
[第二个是检查器面板中显示的内容,它与CGPROGRAM块的链接实际上是单向的,因为frag
surf
和geom
都被多次并行调用,并且依赖于接收输入相同的数据,因此将Properties
值读入CGPROGRAM,完成后将CGPROGRAM的值丢弃。
[我不认为您可以通过any方式使着色器CGPROGRAM执行您可以从C#读取的任何操作(因为该代码每帧运行数百次,您怎么知道哪一个阅读?)
我知道您可以使用properties(包括更改one实例或all实例的属性),但不能获取基础CGPROGRAM数据。我什至可以想到解决此问题的唯一方法是渲染到纹理,然后读取纹理数据,这将很慢(同样,您会进入“哪个像素具有所需的值”?)