Unity3D ShaderLab Use Properties
2015-01-05 21:12
246 查看
在上一篇,学会了怎么使用ShaderLab语法:Properties,这一次,我们将会使用属性值点亮材质球。
1:Delete>sampler2D_MainTex;
2:1行位置Add>
以上3个变量都要和Properties中申明的书写一致,保证值得正确引用匹配,此处一定要用复制。
接下来,在surf中使用这些变量传递过来的值。
3:surf方法稍作修改
接下来,就可以在gui上直接调整参数。
此处用到的pow(arg1,arg2)是自带的函数,相当于数学中的求幂power。
完成的shader代码应该如下:
//codestart----------------------------------------------------------------------------------
//codeend----------------------------------------------------------------------------------
通过以上的学习,我们可以更深刻的理解到,在Properties中申明一个属性后,就为着色器提供了一种从gui获得属性值的方法。
这些值会传递给SubShader中的同名变量中,所以我们也就可以在surf中直接使用设置的值,通过上面的步骤,我们完成了最基础的漫反射组件。
SurfaceOutput是表面着色器(SurfaceShader)的标准输出结构是这样的:
其他能放入Input结构中的值:
//更多内容,参见蛮牛api:
http://www.unitymanual.com/m/Components/SL-SurfaceShaders.html
1:Delete>sampler2D_MainTex;
2:1行位置Add>
float4_EmissiveColor; float4_AmbientColor; float_MySliderValue;
以上3个变量都要和Properties中申明的书写一致,保证值得正确引用匹配,此处一定要用复制。
接下来,在surf中使用这些变量传递过来的值。
3:surf方法稍作修改
voidsurf(InputIN,inoutSurfaceOutputo){ float4c; c=pow((_EmissiveColor+_AmbientColor),_MySliderValue); o.Albedo=c.rgb; o.Alpha=c.a; }
接下来,就可以在gui上直接调整参数。
此处用到的pow(arg1,arg2)是自带的函数,相当于数学中的求幂power。
完成的shader代码应该如下:
//codestart----------------------------------------------------------------------------------
Shader"91YGame/BasicMyDiffuse"{
Properties{
_EmissiveColor("EmissiveColor",Color)=(1,1,1,1)
_AmbientColor("AmbientColor",Color)=(1,1,1,1)
_MySliderValue("SliderValue",Range(0,10))=1.3
}
SubShader{
Tags{"RenderType"="Opaque"}
LOD200
CGPROGRAM
#pragmasurfacesurfLambert
float4_EmissiveColor; float4_AmbientColor; float_MySliderValue;
structInput{
float2uv_MainTex;
};
voidsurf(InputIN,inoutSurfaceOutputo){ float4c; c=pow((_EmissiveColor+_AmbientColor),_MySliderValue); o.Albedo=c.rgb; o.Alpha=c.a; }
ENDCG
}
FallBack"Diffuse"
}
//codeend----------------------------------------------------------------------------------
通过以上的学习,我们可以更深刻的理解到,在Properties中申明一个属性后,就为着色器提供了一种从gui获得属性值的方法。
这些值会传递给SubShader中的同名变量中,所以我们也就可以在surf中直接使用设置的值,通过上面的步骤,我们完成了最基础的漫反射组件。
SurfaceOutput是表面着色器(SurfaceShader)的标准输出结构是这样的:
structSurfaceOutput{ half3Albedo; //反射率 half3Normal; //法线 half3Emission; //自发光,用于增强物体自身的亮度,使之看起来好像可以自己发光 halfSpecular; //镜面 halfGloss; //光泽 halfAlpha; //透明 }; 后面,我们将会经常使用这个结构体。 既然的有输出,也就有入。常见的输入结构使用值如下:
表面着色器输入结构
输入结构Input通常具有着色器所需的所有纹理坐标。纹理坐标必须被命名为纹理名称前加“
uv”(或以“
uv2”开头以使用第二纹理坐标集)。
其他能放入Input结构中的值:
float3viewDir-将包含视线方向,用于计算视差(Parallax)效果、边缘光照等。
float4(COLOR)语义的
float4-将包含插值逐顶点颜色。
float4screenPos-将包含反射效果的屏幕空间位置。例如,在DarkUnity中由WetStreet着色器(WetStreetShader)使用。
float3worldPos-将包含世界坐标空间位置。
float3worldRefl-将包含世界坐标反射向量,条件是表面着色器不写入o.Normal。具体示例可见反射-漫反射着色器(Reflect-DiffuseShader)。
float3worldNormal-将包含世界坐标法线向量,条件是表面着色器不写入o.Normal。
float3worldRefl;INTERNAL_DATA-将包含世界坐标反射向量,条件是表面着色器写入o.Normal。要基于逐像素法线贴图获得反射向量,请使用
WorldReflectionVector(IN,o.Normal)。具体示例可见反射-凹凸着色器(Reflect-BumpedShader)。
float3worldNormal;INTERNAL_DATA-将包含世界坐标法线向量,条件是表面着色器写入o.Normal。要基于逐像素法线贴图获得法线向量,请使用
WorldNormalVector(IN,o.Normal)
//更多内容,参见蛮牛api:
相关文章推荐
- Unity ShaderLab 笔记2 Properties
- Unity3D ShaderLab<二>Shader属性
- Unity3D ShaderLab <六>通过改变纹理的UV坐标实现简单的水流效果
- Unity3D - Shader - ShaderLab基础语法
- Unity3D ShaderLab 自定义光照模型
- 详解Unity3D Shader之Shader Lab框架
- UNITY3D shader学习心得<一> properties属性接口
- Unity3D ShaderLab Half Lambert光照模型
- 详解Unity3D Shader之Shader Lab框架
- Unity3d Shader开发(一)Properties
- Unity3D Shaderlab 学习记录
- Unity3d Shader(一) Properties
- Unity3D ShaderLab 混合两张贴图(Blend)
- unity3D ShaderLab <四>漫反射光照改善技巧
- Unity3d Shader开发(一)Properties
- unity3D ShaderLab <五>漫反射光照改善技巧之使用2D ramp texture来创建一个假的BRDF(双向反射分布函数)
- Unity3D Shaderlab实战学习笔记 一 (《shaders for game programmers and artists》实践)
- Unity3D ShaderLab 混合两张贴图(Blend)
- Unity3D ShaderLab<二>Shader属性
- Unity3D Shaderlab 学习记录