unity 开发shader(0)
本系列转载自毛星云(浅墨)的专栏
主要目的死参考学习计算机图形学相关的内容,目前接手到的很多项目开发都需要涉及到对图形学的应用,鉴于没有图形学基础,也没有看到好的学习视频资料,无意间看到大神的博客,前来拜读作为学习的参考。(接触到了英伟达开发库中对“海飞丝”的开源内容,然而并不能熟练得使用其开源代码
:https://forum.unity.com/threads/nvidia-hairworks-in-unity.328532/ 看到了有日本大神根据DX11编写得插件觉得有必要学习下相关内容)
前言
首先,Unity中编写Shader的语言叫做ShaderLab,而ShaderLab说白了就是裹着一层皮的CG着色器语言而已。Cg,即C forgraphics,即用于图形的C语言,是微软Microsoft和英伟达NVIDIA相互协作在标准硬件光照语言的语法和语义上达成的一种一致性协议。
HLSL和CG其实是同一种语言(参见Cg教程_可编程实时图形权威指南29页的致谢部分)。很多时候,我们会发现用HLSL写的代码可以直接当中Cg代码使用。
Microsoft和NVIDIA联手推出CG语言,想在经济和技术上实现双赢,从而通过这种方式联手打击他们共同的对手GLSL。
在Unity中写Shader约等于给DirectX写Shader
前奏我就不copy了:看https://blog.csdn.net/poem_qianmo/article/details/40723789 的文章就行 直接看代码
//-----------------------------------------------【Shader说明】----------------------------------------------
// Shader功能: 凹凸纹理显示+自选边缘颜色和强度
// 使用语言: Shaderlab
// 开发所用IDE版本:Unity2017 、Monodevelop
// 2018年4月2日
//---------------------------------------------------------------------------------------------------------------------
Shader "Shader编程/0.TheFirstShader"
{
//-------------------------------【属性】-----------------------------------------
Properties
{
_MainTex ("【纹理】Texture", 2D) = "white" {}
_BumpMap ("【凹凸纹理】Bumpmap", 2D) = "bump" {}
_RimColor ("【边缘颜色】Rim Color", Color) = (0.17,0.36,0.81,0.0)
_RimPower ("【边缘颜色强度】Rim Power", Range(0.6,9.0)) = 1.0
}
//----------------------------【开始一个子着色器】---------------------------
SubShader
{
//渲染类型为Opaque,不透明
Tags { "RenderType" = "Opaque" }
//-------------------开始CG着色器编程语言段-----------------
CGPROGRAM
//使用兰伯特光照模式
#pragma surface surf Lambert
//输入结构
struct Input
{
float2 uv_MainTex;//纹理贴图
float2 uv_BumpMap;//法线贴图
float3 viewDir;//观察方向
};
//变量声明
sampler2D _MainTex;//主纹理
sampler2D _BumpMap;//凹凸纹理
float4 _RimColor;//边缘颜色
float _RimPower;//边缘颜色强度
//表面着色函数的编写
void surf (Input IN, inout SurfaceOutput o)
{
//表面反射颜色为纹理颜色
o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb;
//表面法线为凹凸纹理的颜色
o.Normal = UnpackNormal (tex2D (_BumpMap, IN.uv_BumpMap));
//边缘颜色
half rim = 1.0 - saturate(dot (normalize(IN.viewDir), o.Normal));
//边缘颜色强度
o.Emission = _RimColor.rgb * pow (rim, _RimPower);
}
//-------------------结束CG着色器编程语言段------------------
ENDCG
}
//“备胎”为普通漫反射
Fallback "Diffuse"
}