详解Unity3D Shader之Shader Lab框架.docx
- 文档编号:2239721
- 上传时间:2022-10-28
- 格式:DOCX
- 页数:25
- 大小:23.47KB
详解Unity3D Shader之Shader Lab框架.docx
《详解Unity3D Shader之Shader Lab框架.docx》由会员分享,可在线阅读,更多相关《详解Unity3D Shader之Shader Lab框架.docx(25页珍藏版)》请在冰豆网上搜索。
详解Unity3DShader之ShaderLab框架
详解Unity3DShader之ShaderLab框架
网上有很多关于Shader的教程,我在这里就不给读者讲解基础知识了,我们直接讲重点,我会结合着C++底层代码一起讲解,帮助理解Unity3D引擎内部对于Shader加载的实现原理,下面就结合着Unity3D中的Shader的编写给读者解释,在Unity3D中的每个Shader中都有SubShader代码段。
以下面的代码为例:
[cpp]viewplaincopy
SubShader{
Pass{
//Dontwritetothedepthbuffer
ZWriteoff
//Setupalphablending
BlendSrcAlphaOneMinusSrcAlpha
CGPROGRAM
#pragmavertexvert
#pragmafragmentfrag
#include"UnityCG.cginc"
sampler2D_MainTex;
float4_Color;
structv2f{
float4pos:
SV_POSITION;
float4texcoord:
TEXCOORD0;
};
v2fvert(appdata_basev)
{
v2fo;
o.pos=mul(UNITY_MATRIX_MVP,v.vertex);
o.texcoord=v.texcoord;
returno;
}
half4frag(v2fi):
COLOR0
{
half4col=_Color*tex2D(_MainTex,i.texcoord.xy);
returncol;
}
ENDCG
}
pass
{
}
}
SubShader
{
Pass
{
}
}
SubShader中包含的代码段是核心程序,它中间还有Pass通道,Pass通道包含了定义的输出结构体和处理顶点函数和处理片段函数,在一个Shader中还可以包含多个SubShader,这些SubShader可以根据硬件自行适配,下面结合着C++代码给读者分析一下Unity3D中的Shader。
先把DirectX中的Shader代码展示如下:
[cpp]viewplaincopy在CODE上查看代码片派生到我的代码片
//--------------------------------------------------------------
//全局变量
//--------------------------------------------------------------
float4x4matWorldViewProj;
float4x4matWorld;
float4vecLightDir;
float4vecEye;
float4materialAmbient;
float4materialDiffuse;
float4materialSpecular;
//-------------------------------------------------------------
//顶点渲染器输出结构
//-------------------------------------------------------------
structVS_OUTPUT
{
float4Pos:
POSITION;
float4Color:
COLOR;
};
//-------------------------------------------------------------
//顶点渲染器
//-------------------------------------------------------------
VS_OUTPUTVS(float4Pos:
POSITION,float3Normal:
NORMAL,
uniformboolbEnableSelfShadow)
{
VS_OUTPUTOut=(VS_OUTPUT)0;
//顶点坐标变换
Out.Pos=mul(Pos,matWorldViewProj);
//单位化光照方向向量
float3LightDir=normalize(vecLightDir);
//计算观察方向
float3PosWorld=normalize(mul(Pos,matWorld));
float3ViewDir=normalize(vecEye-PosWorld);
//计算法向量方向和漫反射强度
float3NormalWorld=normalize(mul(Normal,matWorld));
float4diff=saturate(dot(NormalWorld,LightDir));
//计算反射光方向(R=2*(N.L)*N-L)和镜面反射强度
float3Reflect=normalize(2*diff*NormalWorld-LightDir);
float4specu=pow(saturate(dot(Reflect,ViewDir)),0.5);
//各种光的颜色
float4ambientColor={0.1f,0.0f,0.0f,1.0f};
float4diffuseColor={1.0f,0.0f,0.0f,1.0f};
float4specularColor={1.0f,0.0f,0.0f,1.0f};
//计算顶点颜色
if(bEnableSelfShadow)//启用自阴影
{
floatshadow=saturate(4*diff);
//计算顶点颜色=Ambient+Shadow*(Diffuse+Specular)
Out.Color=ambientColor*materialAmbient+shadow*
(diffuseColor*materialDiffuse*diff+
specularColor*specu*materialSpecular);
}
else//禁用自阴影
{
Out.Color=ambientColor*materialAmbient+
diffuseColor*materialDiffuse*diff+
specularColor*specu*materialSpecular;
}
returnOut;
}
//--------------------------------------------------------------
//技术
//--------------------------------------------------------------
techniqueTShaderSelfShadow
{
passP0
{
VertexShader=compilevs_2_0VS(true);
}
}
techniqueTShaderNoSelfShadow
{
passP0
{
VertexShader=compilevs_2_0VS(false);
}
}
上述Shader定义了输出结构体这个跟Unity3D中的定义的结构体很类似,DirectX中的Shader定义了顶点渲染器VS函数:
[cpp]viewplaincopy在CODE上查看代码片派生到我的代码片
VS_OUTPUTVS(float4Pos:
POSITION,float3Normal:
NORMAL,
uniformboolbEnableSelfShadow)
其中,VS函数是结合了顶点着色器和片段着色器一起实现的,另外,它还定义了technique,在technique中也有pass通道,这个technique跟SubShader类似,pass通道跟SubPass中的pass通道类似。
因为Unity引擎内部我们是看不到的,那就以DirectX中的C++代码为例给读者解密一下引擎内部是如何实现的,C++完整代码如下所示:
[cpp]viewplaincopy在CODE上查看代码片派生到我的代码片
/-----------------------------------------------------------------------------
//全局变量
//-----------------------------------------------------------------------------
ID3DXFont*g_pFont=NULL;//ID3DXFont字体对象
ID3DXSprite*g_pTextSprite=NULL;//ID3DXSprite文本精灵对象
boolg_bShowHelp=true;//标识是否显示简单说明文本
CDXUTDialogResourceManagerg_DialogResourceManager;//对话框资源管理器
CD3DSettingsDlgg_SettingsDlg;//Direct3D设备设置对话框
CDXUTDialogg_HUD;//对话框
CDXUTDialogg_SampleUI;//对话框
LPDIRECT3DVERTEXBUFFER9g_pVB=NULL;//顶点缓冲区
LPD3DXEFFECTg_pEffect=NULL;//效果
boolg_bEnableSelfShadow;//标志是否启用预编译渲染器
//顶点结构和灵活顶点格式
structCUSTOMVERTEX
{
D3DXVECTOR3position;//位置
D3DXVECTOR3normal;//法线
};
#defineD3DFVF_CUSTOMVERTEX(D3DFVF_XYZ|D3DFVF_NORMAL)
//-----------------------------------------------------------------------------
//控件ID
//-----------------------------------------------------------------------------
#defineIDC_TOG
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 详解Unity3D Shader之Shader Lab框架 详解 Unity3D Shader Lab 框架