您的位置:首页 > 其它

[置顶] 神临的Shader学习之漫反射贴图(二)

2017-12-26 11:56 387 查看
上一篇介绍了最基本的漫反射代码和原理,那么关于漫反射在使用的时候肯定会遇到反射的力度,以及光彩等的控制问题,于是聪明的人类再次发挥了他的作死能力,想到了用贴图去控制这些东西,也是因为这个原因我们开始了痛苦挣扎的贴图渲染之旅(这些都是神临瞎想出来的逻辑发展过程,姑且听听就行了,哈哈).

老样子,先上代码,然后挑选几点说明.

Shader"myDiffuse"
{
properties
{
_mainTex("Maintex",2d)="white"{}
_EmissiveColor("Emissive Color",color)= (1,1,1,1)
_AmibientColor("Amibient Color",color)=(1,1,1,1)
_SomeValue("Coefficient",Range(0,10))=2.5
_RampTex("Ramp texture",2D)="white"{}//(1)
}

SubShader
{
Tags{"RanderType"="Opaque"}
LOD 200

CGPROGRAM
#pragma surface surf BasicDiffuse//(2)

sampler2D _mainTex;
float4 _EmissiveColor;
float4 _AmibientColor;
float _SomeValue;
sampler2D _RampTex;

inline float4 LightingBasicDiffuse(SurfaceOutput s,fixed3 lightDir,fixed atten)//(3)
{
float difLight = dot(s.Normal,lightDir);//(4)
float hLambert = difLight*0.5+0.5;//(5)
float3 ramp = tex2D(_RampTex,float2(hLambert,hLambert)).rgb;//(6)

float4 col;
col.rgb = s.Albedo*_LightColor0.rgb*(ramp);
col.a = s.Alpha;
return col;
}

struct Input {
float2 uv_MainTex;
};

void surf (Input IN,inout SurfaceOutput o)
{
float3 i = tex2D(_mainTex,IN.uv_MainTex).rbg;
float4 c = pow((_EmissiveColor+_AmibientColor),_SomeValue);//(7)
o.Albedo = c.rgb*i.rbg;
o.Alpha = c.a;
}
ENDCG
}
FallBack"Diffuse"
}


(1)在这里引用漫反射贴图,什么是漫反射贴图呢?,就像下面这样,有渐变效果的贴图就是,当然要想有好的效果需要专门的定制才行.



然后通过控制uv的坐标索引就能得的相对应的漫反射颜色了,很神奇,需要自己去琢磨.

(2)调用我们自定义的光照模型

(3)是我们自定义的光照模型,这里引用了lightDir和atten(光的方向和距离)参与了计算之中.

(4)基本的lambert漫反射计算,原理在前面点到过了.

(5)half lambert 漫反射计算,其实就是一种加强光照效果的计算,像下面这张图,就是很好的列子



(6)对漫反射贴图的坐标索引计算,自己推导一下应该就能得出结果.

(7)对外部光照的一种控制方式,这里也仅仅是参与到光照计算中而已,没有进行特殊的处理,pow是指数的意思,慢慢推导一下,没有问题.

嗯,关于漫反射贴图的东西就先到这里了,回头想想自己一年前的大学生活真是糜烂额,往事不堪回首!!!

下次继续,谢谢.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: