包含标签 读书笔记 的文章

《Unity Shader入门精要》第八章笔记 | 透明度

渲染顺序

名称队列索引号描 述
Background1000这个渲染队列会在任何其他队列之前被渲染,我们通常使用该队列来渲染那些需要绘制在背景上的物体
Geometry2000默认的渲染队列,大多数物体都使用这个队列。不透明物体使用这个队列
AlphaTest2450需要透明度测试的物体使用这个队列。在Unity 5中它从Geometry队列中被单独分出来,这是因为在所有不透明物体渲染之后再渲染它们会更加高效
Transparent3000这个队列中的物体会在所有Geometry和AlphaTest物体渲染后,再按从后往前的顺序进行渲染。任何使用了透明度混合(例如关闭了深度写入的Shader)的物体都应该使用该队列, srpite模式是该队列
Overlay4000该队列用于实现一些叠加效果。任何需要在最后渲染的物体都应该使用该队列

透明度测试

透明度测试: 只要一个片元的透明度不满足条件(通常是小于某个阈值),那么它对应的片元就会被舍弃。被舍弃的片元将不会再进行任何处理,也不会对颜色缓冲产生任何影响;否则,就会按照普通的不透明物体的处理方式来处理它

……

阅读全文

《Unity Shader入门精要》第八章笔记 | 透明度

渲染顺序

名称队列索引号描 述
Background1000这个渲染队列会在任何其他队列之前被渲染,我们通常使用该队列来渲染那些需要绘制在背景上的物体
Geometry2000默认的渲染队列,大多数物体都使用这个队列。不透明物体使用这个队列
AlphaTest2450需要透明度测试的物体使用这个队列。在Unity 5中它从Geometry队列中被单独分出来,这是因为在所有不透明物体渲染之后再渲染它们会更加高效
Transparent3000这个队列中的物体会在所有Geometry和AlphaTest物体渲染后,再按从后往前的顺序进行渲染。任何使用了透明度混合(例如关闭了深度写入的Shader)的物体都应该使用该队列, srpite模式是该队列
Overlay4000该队列用于实现一些叠加效果。任何需要在最后渲染的物体都应该使用该队列

透明度测试

透明度测试: 只要一个片元的透明度不满足条件(通常是小于某个阈值),那么它对应的片元就会被舍弃。被舍弃的片元将不会再进行任何处理,也不会对颜色缓冲产生任何影响;否则,就会按照普通的不透明物体的处理方式来处理它

……

阅读全文

《Unity Shader入门精要》第六章笔记 | 基础光照

我们是如何看到这个世界的

  • 光源: 在光学里,我们使用辐照度 (irradiance) 来量化光
  • 物体的吸收和散射: 光线由光源发射出来后,就会与一些物体相交
  • 着色: 根据材质属性(如漫反射属性等)、光源信息(如光源方向、辐照度等),使用一个等式去计算沿某个观察方向的出射度的过程。我们也把这个等式称为光照模型 (Lighting Model)
  • BRDF光照模型

标准光照模型

  • 环境光: 近似模拟间接光照
  • 自发光: 光线也可以直接由光源发射进入摄像机,而不需要经过任何物体的反射
  • 高光反射: 它可用于计算那些沿着完全镜面反射方向被反射的光线,这可以让物体看起来是有光泽的,例如金属材质。
  • 自发光
  • 漫反射: 漫反射光照是用于对那些被物体表面随机散射到各个方向的辐射度进行建模的. 符合兰伯特定律 (Lambert’s law)

……

阅读全文

《Unity Shader入门精要》第六章笔记 | 基础光照

我们是如何看到这个世界的

  • 光源: 在光学里,我们使用辐照度 (irradiance) 来量化光
  • 物体的吸收和散射: 光线由光源发射出来后,就会与一些物体相交
  • 着色: 根据材质属性(如漫反射属性等)、光源信息(如光源方向、辐照度等),使用一个等式去计算沿某个观察方向的出射度的过程。我们也把这个等式称为光照模型 (Lighting Model)
  • BRDF光照模型

标准光照模型

  • 环境光: 近似模拟间接光照
  • 自发光: 光线也可以直接由光源发射进入摄像机,而不需要经过任何物体的反射
  • 高光反射: 它可用于计算那些沿着完全镜面反射方向被反射的光线,这可以让物体看起来是有光泽的,例如金属材质。
  • 自发光
  • 漫反射: 漫反射光照是用于对那些被物体表面随机散射到各个方向的辐射度进行建模的. 符合兰伯特定律 (Lambert’s law)

……

阅读全文

《Unity Shader入门精要》第五章笔记 | 开始shader练习

一个简单的顶点/片元着色器

代码
Shader "Unity Shaders Book/Chapter 5/Simple Shader" {
    Properties {
        // 声明一个Color类型的属性
        _Color ("Color Tint", Color) = (1.0,1.0,1.0,1.0)
    }
    SubShader {
        Pass {
            CGPROGRAM

            #pragma vertex vert
            #pragma fragment frag

            // 在Cg代码中,我们需要定义一个与属性名称和类型都匹配的变量
            fixed4 _Color;

            // 使用一个结构体来定义顶点着色器的输入
            struct a2v {
                // POSITION语义告诉Unity,用模型空间的顶点坐标填充vertex变量
                float4 vertex : POSITION;
                // NORMAL语义告诉Unity,用模型空间的法线方向填充normal变量
                float3 normal : NORMAL;
                // TEXCOORD0语义告诉Unity,用模型的第一套纹理坐标填充texcoord变量
                float4 texcoord : TEXCOORD0;
            };

            // 使用一个结构体来定义顶点着色器的输出
            struct v2f {
                // SV_POSITION语义告诉Unity,pos里包含了顶点在裁剪空间中的位置信息
                float4 pos : SV_POSITION;
                // COLOR0语义可以用于存储颜色信息
                fixed3 color : COLOR0;
            };

            v2f vert(a2v v) : SV_POSITION {
                v2f o;
                // 使用v.vertex来访问模型空间的顶点坐标
                o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
                o.color = v.normal * 0.5 + fixed3(0.5, 0.5, 0.5);
                return o;
            }

            fixed4 frag(v2f i) : SV_Target {
                fixed3 c = i.color;
                // 使用_Color属性来控制输出颜色
                c *= _Color.rgb;
                return fixed4(c, 1.0);
            }

            ENDCG
        }
    }
}

  • 模型数据从哪里来: a2v结构体定义了顶点着色器的输入
  • 顶点着色器和片元着色器之间如何通信: v2f结构体定义了顶点着色器的输入和片元着色器的输入
  • 如何使用属性: Properties 语义块中,并在其中声明了一个属性_Color。并在Cg代码中定一个变量。
  • 顶点着色器是逐顶点调用的,而片元着色器是逐片元调用的。片元着色器中的输入实际上是把顶点着色器的输出进行插值后得到的结果。

ShaderLab中属性的类型和Cg中变量的类型之间的匹配关系 如下:

……

阅读全文

《Unity Shader入门精要》第五章笔记 | 开始shader练习

一个简单的顶点/片元着色器

代码
Shader "Unity Shaders Book/Chapter 5/Simple Shader" {
    Properties {
        // 声明一个Color类型的属性
        _Color ("Color Tint", Color) = (1.0,1.0,1.0,1.0)
    }
    SubShader {
        Pass {
            CGPROGRAM

            #pragma vertex vert
            #pragma fragment frag

            // 在Cg代码中,我们需要定义一个与属性名称和类型都匹配的变量
            fixed4 _Color;

            // 使用一个结构体来定义顶点着色器的输入
            struct a2v {
                // POSITION语义告诉Unity,用模型空间的顶点坐标填充vertex变量
                float4 vertex : POSITION;
                // NORMAL语义告诉Unity,用模型空间的法线方向填充normal变量
                float3 normal : NORMAL;
                // TEXCOORD0语义告诉Unity,用模型的第一套纹理坐标填充texcoord变量
                float4 texcoord : TEXCOORD0;
            };

            // 使用一个结构体来定义顶点着色器的输出
            struct v2f {
                // SV_POSITION语义告诉Unity,pos里包含了顶点在裁剪空间中的位置信息
                float4 pos : SV_POSITION;
                // COLOR0语义可以用于存储颜色信息
                fixed3 color : COLOR0;
            };

            v2f vert(a2v v) : SV_POSITION {
                v2f o;
                // 使用v.vertex来访问模型空间的顶点坐标
                o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
                o.color = v.normal * 0.5 + fixed3(0.5, 0.5, 0.5);
                return o;
            }

            fixed4 frag(v2f i) : SV_Target {
                fixed3 c = i.color;
                // 使用_Color属性来控制输出颜色
                c *= _Color.rgb;
                return fixed4(c, 1.0);
            }

            ENDCG
        }
    }
}

  • 模型数据从哪里来: a2v结构体定义了顶点着色器的输入
  • 顶点着色器和片元着色器之间如何通信: v2f结构体定义了顶点着色器的输入和片元着色器的输入
  • 如何使用属性: Properties 语义块中,并在其中声明了一个属性_Color。并在Cg代码中定一个变量。
  • 顶点着色器是逐顶点调用的,而片元着色器是逐片元调用的。片元着色器中的输入实际上是把顶点着色器的输出进行插值后得到的结果。

ShaderLab中属性的类型和Cg中变量的类型之间的匹配关系 如下:

……

阅读全文

《Unity Shader入门精要》第四章笔记 | 学习Shader所需的数学基础

概述

在学习Shader的过程中,我们最常使用的就是矢量和矩阵(即数学的分支之一——线性代数)。

笛卡儿坐标系

我们使用数学绝大部分都是为了计算位置、距离和角度等变量。而这些计算大部分都是在笛卡儿坐标系 (Cartesian Coordinate System) 下进行的。这个名字来源于法国伟大的哲学家、物理学家、心理学家、数学家笛卡儿(René Descartes)。

……

阅读全文

《Unity Shader入门精要》第四章笔记 | 学习Shader所需的数学基础

概述

在学习Shader的过程中,我们最常使用的就是矢量和矩阵(即数学的分支之一——线性代数)。

笛卡儿坐标系

我们使用数学绝大部分都是为了计算位置、距离和角度等变量。而这些计算大部分都是在笛卡儿坐标系 (Cartesian Coordinate System) 下进行的。这个名字来源于法国伟大的哲学家、物理学家、心理学家、数学家笛卡儿(René Descartes)。

……

阅读全文

《Unity Shader入门精要》第三章笔记| UnityShader基础

材质

在Unity中我们需要配合使用材质 (Material) 和Unity Shader才能达到需要的效果。一个最常见的流程是

  • 创建一个材质;活着导入一个材质
  • 创建一个Unity Shader,并把它赋给上一步中创建的材质;
  • 把材质赋给要渲染的对象;
  • 在材质面板中调整Unity Shader的属性,以得到满意的效果。

Unity的材质

Unity中的材质需要结合一个GameObject的Mesh或者Particle Systems组件来工作。它决定了我们的游戏对象看起来是什么样子的(这当然也需要Unity Shader的配合)。

……

阅读全文

《Unity Shader入门精要》第三章笔记| UnityShader基础

材质

在Unity中我们需要配合使用材质 (Material) 和Unity Shader才能达到需要的效果。一个最常见的流程是

  • 创建一个材质;活着导入一个材质
  • 创建一个Unity Shader,并把它赋给上一步中创建的材质;
  • 把材质赋给要渲染的对象;
  • 在材质面板中调整Unity Shader的属性,以得到满意的效果。

Unity的材质

Unity中的材质需要结合一个GameObject的Mesh或者Particle Systems组件来工作。它决定了我们的游戏对象看起来是什么样子的(这当然也需要Unity Shader的配合)。

……

阅读全文