表面着色器案例分析

来源:互联网 发布:淘宝助理修改宝贝描述 编辑:程序博客网 时间:2024/06/06 01:53

下面是表面着色器案例分析,主要是自己学习,其实就是抄写一遍

首先是一个比较简单的例子

Shader"Example/Diffuse"//漫反射

{

SubShader

{
Tags{"RenderType"="Opaque"}//渲染模式为透明物体,也就是场景中的透明物体使用该shader

CGPROGRAM

#pragma  surface surf  Lambert//内置光照模式

struct Input//输入结构体,该例子中,只有颜色值

{

float4  color:Color;

};

void surf (Input IN,inout SurfaceOutPut o)//表面函数,IN是输入结构体类型,SurfaceOutPut为输出类型,默认的

{

o.Albedo=1;//其实Albedo为float3 类型,该句的意思就是o.Albedo=(1,1,1);//全白

}

ENDCG

}

FallBack“Diffuse”//俗称备胎

}


加上纹理

Shader"Example/Diffuse Texture"

{

Properities

{

_MainTex("Texture",2D)="White"{}//注意属性中的每一行的结尾并没有顿号结束——MainTex为变量名字,Texture为在检视面板现实的名字,任意

}

SubShader

{

Tags{"RenderType"="Opaque"}//只有一个SubShader时,该行卸载;里面与外边效果是一致的,当两个SubShader时,若写外边就是说明两个SubShader都使

CGPROGRAM

#pragma surface surf Lambert

struct

{

float2 uv_MainTex;

};

Sample2D _MainTex;//该处的声明与属性一一对应

void surf (Input IN,SurfaceOutPut o)

{

o.Albedo=tex2D(_MainTex,IN.uv_MainTex).rgb;//漫反射贴图为在uv_MainTex坐标所对应的——MainTex图像

}

ENDCG

FallBack"Diffuse"

}

}


加上法线贴图,使纹理更有立体感,在属性中增加一个属性,即法线贴图_BumpMap("BumpMap",2D)="White"{}

在输入结构体中,将纹理坐标及法线坐标都传递近表面函数中

struct

{

float2 uv_MainTex;

float2  uv_BumpMap;

};

表面函数

void surf (Input  IN,inout  SurfaceOutPut o)

{

o.Albedo=tex2D(_MainTex,IN.uv_MainTex);

o.Normal=UnpackNormal(tex2D(_BumTex,IN.uv_BumpTex));

}


0 0
原创粉丝点击