包含此页的版本:
不含此页的版本:
我们需要做的第一件事是表明我们的着色器在 GPU 上运行的程序。更多信息
请参阅术语表实际上确实需要将照明信息传递给它。Unity 的渲染管道支持多种渲染方式;在这里,我们将使用默认的前向渲染一种渲染路径,用于在一个或多个通道中渲染每个对象,具体取决于影响对象的光源。光源本身也因前向渲染而异,具体取决于其设置和强度。更多信息
请参阅术语表一。
我们将首先仅支持一个定向光源。Unity 中的前向渲染的工作原理是渲染主定向光、环境光、光照贴图(lightmaps)一种预渲染的纹理,包含光源对场景中静态对象的效果。光照贴图覆盖在场景几何体之上,以创建光照效果。更多信息
请参阅术语表以及名为 ForwardBase 的单通道中的反射。在着色器中,这可以通过添加传递标记来指示:Tags {“LightMode”=“ForwardBase”}。这将使定向光源数据通过一些内置变量传递到着色器中。
下面是计算每个顶点的简单漫反射光照的着色器,并使用单个主纹理:
Shader "Lit/Simple Diffuse"
{
Properties
{
[NoScaleOffset] _MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
Pass
{
// indicate that our pass is the "base" pass in forward
// rendering pipeline. It gets ambient and main directional
// light data set up; light direction in _WorldSpaceLightPos0
// and color in _LightColor0
Tags {"LightMode"="ForwardBase"}
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc" // for UnityObjectToWorldNormal
#include "UnityLightingCommon.cginc" // for _LightColor0
struct v2f
{
float2 uv : TEXCOORD0;
fixed4 diff : COLOR0; // diffuse lighting color
float4 vertex : SV_POSITION;
};
v2f vert (appdata_base v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = v.texcoord;
// get vertex normal in world space
half3 worldNormal = UnityObjectToWorldNormal(v.normal);
// dot product between normal and light direction for
// standard diffuse (Lambert) lighting
half nl = max(0, dot(worldNormal, _WorldSpaceLightPos0.xyz));
// factor in the light color
o.diff = nl * _LightColor0;
return o;
}
sampler2D _MainTex;
fixed4 frag (v2f i) : SV_Target
{
// sample texture
fixed4 col = tex2D(_MainTex, i.uv);
// multiply by lighting
col *= i.diff;
return col;
}
ENDHLSL
}
}
}
这使得物体对光的方向做出反应——它面向光线的部分被照亮,而面向光线的部分根本不被照亮。