【unity】Shader学习笔记

1.Welcome

学习视频

1.0 第1章欢迎来到Shader的世界_哔哩哔哩_bilibili

超容易的shader入门教程 00 介绍_哔哩哔哩_bilibili

1.1 程序猿三大浪漫

编译原理!操作系统!图形学!

1.2 本书结构

见目录

2.渲染流水线

2.1 综述

2.1.1 什么是流水线

2.1.2 什么是渲染流水线

  • 应用阶段

开发者主导控制

场景数据相机Transofm、视椎体、光源
模型Mesh、蒙皮信息、模型Transofm
剔除把不可见物体提出,这样无需再一脚给集合阶段处理
渲染状态材质(漫反射颜色、高光反射颜色)、纹理、Shader
  • 几何阶段

决定需要绘制的图元,怎么绘制,在哪绘制。

逐顶点、逐多边形操作
顶点坐标变换到屏幕空间
输出屏幕空间的二维顶点坐标、每个顶点对应的深度值、着色等信息
  • 光栅化阶段

上阶段的数据产生屏幕上的像素,并渲染出最终图像。

决定每个渲染图元中哪些像素应该绘制在屏幕上
逐顶点数据进行插值
逐像素处理

2.2 CPU和GPU之间的通信

  1. 把数据加载到显存
  2. 设置渲染状态
  3. 调用DrawCall

2.2.1 把数据加载到显存中


2.2.2 设置渲染状态

定义场景中的网格怎么被渲染
使用哪个顶点着色器/片元着色器、光源属性、材质等。

准备好了,CPU调用GPU渲染命令,成为DrawCall。(所以怎么调用)

2.2.3 调用DrawCall

这个命令仅会指向一个需要被渲染的图元列表,不会在包含任何材质信息,因为上阶段已经完成。

2.3 GPU流水线

2.3.1 概述

几何阶段

顶点着色器(Vertex Shader)

工作主要有:坐标变换和逐顶点光照。 

坐标变换:把顶点坐标从模型空间转换到齐次裁剪空间。


逐顶点光照:还可以计算和出顶点的颜色。例如我们可能需要进行逐顶点的光照。

曲面细分着色器

细分图元

几何着色器

裁剪

裁剪阶段的目的是将那些不在摄像机视野内的顶点裁减掉,并剔除某些三角图元的面片


屏幕映射

这一步输入的坐标仍然是三维坐标系下的坐标(范围在单位立方体内)。屏幕映射的任务是把每个图元的x和y坐标转换到屏幕坐标系下,这实际上是一个缩放的过程。屏幕坐标系是一个二维坐标系,它和我们用于显示画面的分辨率有很大关系。

  • 光栅阶段

点线面差值到屏幕像素点。

三角形设置固定函数阶段
三角形遍历固定函数阶段
片元着色器(fragment shader)经历上面之后得到片元,然后跑片元着色器
逐片元操作修改颜色、深度缓冲、混合等
GTest模板测试、透明测试、深度测试
混合如果上面的测试之后,是有效的,那么会进行混合
Frame Buffer最终得到的是FrameBuffer,传给显卡驱动,然后显示到屏幕上

2.4困惑

2.4.3DrawCall

3.Unity Shader基础

3.1 Unity Shader概述

3.1.3 Shader类型

  • Standard Surface Shader      标准光照模型
  • Unlit Shader     顶点/片元着色器
  • Image Effect Shader       屏幕后处理效果
  • Compute Shader      

3.2 Shader Lab

 3.3 Unity Shader结构

3.3.2 Properties

3.3.3 SubShader

  •  状态设置
  • 标签
  • Pass语义块

  • UsePass
  • GrabPass

着色器 - unity手册

3.4 Unity Shader类型

3.4.1 表面着色器

3.4.2 顶点/片元着色器

3.4.4 选择哪种Unity Shader形式

3.7扩展

4.数学基础

4.2坐标系

unity是左手 laya是右手

4.3点和矢量

4.3.2矢量运算

4.4矩阵

最强矩阵变换和常见矩阵动画,从2维到3维!_哔哩哔哩_bilibili

4.5矩阵:变换

4.6坐标空间

4.6.7 裁剪空间

1.透视投影

 2.正交投影

 

4.7法线变换

4.8 Unity Shader内置变量

 

5.Shader之旅

page117

6.光照

7.纹理

8.透明

9.复杂光照

10.高级纹理

11.动态画面

12.后效

13.深度和法线纹理

14.非真实渲染

15.噪声

16.渲染优化

17.表面着色器

18.基于物理渲染

19.Unity5

20.更多

示例

透明

Shader "My Shader/AlphaShader"
{
    Properties
    {
        _Color ("Color", Color) = (1,1,1,1)
        _MainTex ("Texture", 2D) = "white" {}
        _AlphaScale ("Alpha Scale", Range(0, 1)) = 1
    }
    SubShader
    {
        // 透明度混合队列为Transparent,所以Queue=Transparent
        // RenderType标签让Unity把这个Shader归入提前定义的组中,以指明该Shader是一个使用了透明度混合的Shader
        // IgonreProjector为True表明此Shader不受投影器(Projectors)影响
        Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" }

        Pass
        {
            // 开启深度写入
            ZWrite On
            // 设置颜色通道的写掩码,0为不写入任何颜色
            ColorMask 0
        }

        Pass
        {
            Tags { "LightMode"="ForwardBase" }

            // 关闭深度写入
            ZWrite Off
            // 开启混合模式,并设置混合因子为SrcAlpha和OneMinusSrcAlpha
            Blend SrcAlpha OneMinusSrcAlpha

            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"
            #include "Lighting.cginc"

            struct a2v//应用程序传递到顶点函数。application to vertex
            {
                float4 vertex : POSITION;
                float3 normal : NORMAL;
                float4 texcoord : TEXCOORD0;
            };

            struct v2f//顶点函数传递到片元函数。vertex to fragment
            {
                float4 pos : SV_POSITION;
                float2 uv : TEXCOORD0;
                float3 worldNormal : TEXCOORD1;
                float3 worldPos : TEXCOORD2;
            };

            sampler2D _MainTex;
            float4 _MainTex_ST;
            fixed4 _Color;
            // 用于决定调用clip函数时进行的透明度测试使用的判断条件
            fixed _AlphaScale;

            v2f vert (a2v v)
            {
                v2f o;

                o.pos = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
                o.worldNormal = UnityObjectToWorldNormal(v.normal);
                o.worldPos = mul(unity_ObjectToWorld, v.vertex);

                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                fixed3 worldNormal = normalize(i.worldNormal);
                fixed3 worldPos = normalize(i.worldPos);
                fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(worldPos));
                // 纹素值
                fixed4 texColor = tex2D(_MainTex, i.uv);
                // 反射率
                fixed3 albedo =  texColor.rgb * _Color.rgb;
                // 环境光
                fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.rgb * albedo;
                // 漫反射
                fixed3 diffuse = _LightColor0.rgb * albedo * max(0, dot(worldNormal, worldLightDir));
                // 返回颜色,透明度部分乘以我们设定的值
                return fixed4(ambient + diffuse, texColor.a * _AlphaScale);
            }
            ENDCG
        }
    }
}

更新:

2021.12.05 读书
2022.05.03 学习BV16B4y1m7WV

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值