unity3d shaderlab:如何在我的着色器中设置一些简单变量

unity3d shaderlab:如何在我的着色器中设置一些简单变量,unity3d,shader,hlsl,cg,Unity3d,Shader,Hlsl,Cg,我正在写我的第一个着色器之一。我正在编辑找到的变形球着色器。 我是着色器新手,我只想设置一些变量 我希望在着色器初始化时计算这些变量 这是我的全部简历。。你可以看到我试图在“问题代码”注释之间设置一个“_半径”来做什么 //Rodrigo Fernandez Diaz创作的水变形球着色器效果-2013 //拜访http://codeartist.info/ 更多!! 着色器“自定义/变形球”{ 属性{ _MyColor(“某种颜色”,颜色)=(1,1,1,1) _MainTex(“纹理”,2D)

我正在写我的第一个着色器之一。我正在编辑找到的变形球着色器。 我是着色器新手,我只想设置一些变量

我希望在着色器初始化时计算这些变量

这是我的全部简历。。你可以看到我试图在“问题代码”注释之间设置一个“_半径”来做什么

//Rodrigo Fernandez Diaz创作的水变形球着色器效果-2013
//拜访http://codeartist.info/ 更多!!
着色器“自定义/变形球”{
属性{
_MyColor(“某种颜色”,颜色)=(1,1,1,1)
_MainTex(“纹理”,2D)=“白色”{}
_底部阈值(“底部截止”,范围(0,1))=0.1
_顶部阈值(“顶部截止”,范围(0,1))=0.1
}
子阴影{
标记{“队列”=“透明”}
通过{
混合SrcAlpha ONEMUSSRCALPHA
CGP程序
#pragma顶点顶点
#布拉格碎片碎片
#包括“UnityCG.cginc”
花色4_-MyColor;
浮色;
取样器2D_MainTex;
浮式脱粒机;
浮式脱粒机;
//=============问题代码开始===================
浮动_半径=_顶部阈值-_底部阈值;
如果(_半径<0)
{
_半径=0;
}
//=============问题代码结束=====================
结构v2f{
浮动4位置:SV_位置;
float2uv:TEXCOORD0;
};  
浮动4(缅特克斯街);;
v2f垂直(appdata_base v){
v2fo;
o、 pos=mul(单位矩阵MVP,v顶点);
o、 uv=变换_TEX(v.texcoord,_MainTex);
返回o;
}   
半4碎片(v2f i):颜色{
半4 texcol,最终颜色;
texcol=tex2D(_MainTex,i.uv);
//最终颜色=_颜色*texcol;
最终颜色=_MyColor;
if(texcol.a_topthresh))
{
最终颜色a=0;
}
其他的
{
最终颜色a=1;
}           
返回最终颜色;
}
ENDCG
}
}
回退“顶点照明”
我真的很困惑。在某些情况下,似乎您可以在shaderlab着色器中编写普通c#代码,而在其他无法编写的部分。

您不能在shaderlab文件中的任何位置编写c#代码。该语法是特殊的shaderlab语法,可以包含其他着色器语言,如HLSL

在这种情况下,问题是您试图在顶级子阴影中进行不允许的计算-任何计算都必须在函数中进行。您可以将该代码添加到
vert
函数或
frag
函数中。如下所示:

     v2f vert (appdata_base v){
        float _radius = _topthresh - _bottomthresh;
        if(_radius < 0)
        {
            _radius = 0;
        }

        v2f o;
        o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
        o.uv = TRANSFORM_TEX (v.texcoord, _MainTex);
        return o;
    }   
v2f垂直(appdata\u base v){
浮动_半径=_顶部阈值-_底部阈值;
如果(_半径<0)
{
_半径=0;
}
v2fo;
o、 pos=mul(单位矩阵MVP,v顶点);
o、 uv=变换_TEX(v.texcoord,_MainTex);
返回o;
}   

非常感谢!!我还有一个问题..如何在着色器中进行平方根和平方运算!?!?平方是x*x:),或者您可以使用幂函数
pow
pow(x,2)
对其进行平方运算或
pow(x,0.5)
对其进行平方根运算。
     v2f vert (appdata_base v){
        float _radius = _topthresh - _bottomthresh;
        if(_radius < 0)
        {
            _radius = 0;
        }

        v2f o;
        o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
        o.uv = TRANSFORM_TEX (v.texcoord, _MainTex);
        return o;
    }