我是靠谱客的博主 背后眼睛,最近开发中收集的这篇文章主要介绍Shader学习笔记UnityShader学习Shader的基本结构,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

UnityShader学习

Shader的基本结构

在这里插入图片描述

名字

写shader第一步肯定是定义名字
Shader “Custom/ShaderName”
{

}

属性

Properties
{
_Name(“Display Name”, type) = defaultValue[{options}]
}

  • _Name 属性的名字也是变量名,整个Shader代码中将使用这个名字来获取该属性的内容
  • Display Name 这个字符串显示在Unity的材质编辑器中作为Shader的使用者可读的内容(所以为了美术阅读可以使用中文)
  • type 属性的类型,可以使用多种已定义过的类型
    Int,Float,Range(min,max),Color,Vector,2D,3D,Cube
  • defaultValue定义属性的默认值
    Color~(1,1,1,1)
  • 2D/Rect/3D 默认值可以为一个代表默认tint颜色的字符串,可以是空字符串或者”white”,”black”,” gray”,”bump”中的一个。如:“white”{}
  • Int ,Float, Range(min,max)可以直接设置为1,1.00,1.00
  • Vector有多维可以设置为(1,2,1)等

SubShader

SubShader
{

}
标签
Tags{“RenderType”=“Opaque”}
一些有用的标签如下:

  • Queue 控制渲染顺序Tags{“Queue”=“Transparent”}
  • RenderType 对着色器进行分类Tags{“RenderType”=“Opaque”}
  • DisableBatching 是否关闭批处理(多用于有顶点动画的物体)Tags{“DisableBatching”=“True”}
  • ForceNoShadowCasting 控制是否会投射阴影 Tags{“ForceNoShadowCasting”=“True”}
  • IgnoreProjector 控制是否会接受Projector的投射 Tags{“IgnoreProjector”=“True”}
  • CanUseSpriteAltas 用于Sprite时设为false Tags{“CanUseSpriteAltas”=“False”}
  • PreviewType 控制材质面板什么形状去预览这个材质 Tags{“PreviewType”=“Plane”}
    LOD
    设定shader的精度值,通过Quality Settings去设定允许的最大LOD,当LOD小于QualitySetting时该SubShader被禁用

表面着色器

CGPROGRAM
#pragma surface surf Lambert
sampler2D _MainTex;
struct Input {
	float2 uv_MainTex;
};
void surf (Input IN, inout SurfaceOutput o) {
	half4 c = tex2D (_MainTex, IN.uv_MainTex);
	o.Albedo = c.rgb;
	o.Alpha = c.a;
}
ENDCG

表面着色器得SubShader主体
1、CGPROGRAM这是SubShader得起始,最后到ENDCG结束
2、#pragma surface surf Lambert 声明一个表面Shader并指定光照类型为Lambert
#pragma surface surfaceFunction lightModel [optionalparams]

  • surface - 声明的是一个表面着色器
  • surfaceFunction - 着色器代码的方法的名字
  • lightModel - 使用的光照模型。
    常见得几种光照模型
    Lambert 适合表面粗糙得模型
    Phong 适合有镜面反射效果的模型
    BlinnPhong 介于Lambert和Phong之间,既有Lambert的漫反射和高光,还要比Phong高光更柔和平滑
    3、sampler2D _MainTex sampler2D即对应的是Texture2d,而_MainTex需要与Properties里声明过的贴图相对应
    4、struct Input
    {
    float2 uv_MainTex;
    }
    作为输入的结构体必须命名为Input,传入uv_MainTex名字也是为了获取贴图_MainTex上的uv坐标
    5、surf函数的目标就是根据输入传入到SufaceOutput预定义的输出结构中,SufaceOutput预定义的输出结构如下:
struct SurfaceOutput {
    half3 Albedo;     //像素的颜色
    half3 Normal;     //像素的法向值
    half3 Emission;   //像素的发散颜色
    half Specular;    //像素的镜面高光
    half Gloss;       //像素的发光强度
    half Alpha;       //像素的透明度
};

6、让我们看一下这个方法里都做了什么
tex2D函数这是CG程序中对一张贴图对一个点进行采样的方法,返回一个float4。这里对_MainTex在输入点上进行了采样,并将其颜色的rbg值赋予了输出的像素颜色,将a值赋予透明度。于是,着色器就明白了应当怎样工作:即找到贴图上对应的uv点,直接使用颜色信息来进行着色。

顶点/片元着色器

SubShader
{
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
float4 vert(float4 v:POSITION)
{
mul(UNITY_MATRIX_MVP,v);
}
fixed4 frag():SV_Target
{
return fixed4(1.0,1.0,1.0,1.0);
}
ENDCG
}
}
  1. #pragma vertex vert与#pragma fragment frag 定义了vert为顶点函数frag为片元函数
  2. vert函数的输入v通过语义POSITION语义定义了顶点的位置
  3. mul(UNITY_MATRIX_MVP,v)是把顶点空间从模型空间转换到裁剪空间
  4. 片元函数没有输入,需要输出一个fixed4,而且用语义SV_Target语义进行了限定,把用户得输出颜色存储到一个渲染目标中

最后

以上就是背后眼睛为你收集整理的Shader学习笔记UnityShader学习Shader的基本结构的全部内容,希望文章能够帮你解决Shader学习笔记UnityShader学习Shader的基本结构所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(38)

评论列表共有 0 条评论

立即
投稿
返回
顶部