分类 编程 中的文章

URP 不透明/半透明物体的折射

折射

应用场景

  1. 水池
  2. 玻璃
  3. 热空气(热扭曲)

GrabPass + CubeMap

《Unity3D Shader入门精要》第十章介绍了,模拟实现折射效果有两种

  1. 使用cubemap: 我认为太麻烦.需要的贴图太多。也没有找到其他合适的使用场景,遂搁置。
  2. 使用GrabPass抓屏: 是一种比较简单也好理解的方式,抓屏,然后对抓到的贴图的坐标进行偏移。

详情可以参考 《Unity3D Shader入门精要》第十章

……

阅读全文

URP 不透明/半透明物体的折射

折射

应用场景

  1. 水池
  2. 玻璃
  3. 热空气(热扭曲)

GrabPass + CubeMap

《Unity3D Shader入门精要》第十章介绍了,模拟实现折射效果有两种

  1. 使用cubemap: 我认为太麻烦.需要的贴图太多。也没有找到其他合适的使用场景,遂搁置。
  2. 使用GrabPass抓屏: 是一种比较简单也好理解的方式,抓屏,然后对抓到的贴图的坐标进行偏移。

详情可以参考 《Unity3D Shader入门精要》第十章

……

阅读全文

《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中变量的类型之间的匹配关系 如下:

……

阅读全文

MAC平台几何着色器不生效

问题

MAC平台几何着色器不生效

解决步骤

  1. unity shaderlab 怎么设置以至于支持几何着色器
  2. 找原因,设置 编译目标级别,#pragma target 4.0, 不管用
  3. 看到一句话,Unity 在 Metal 图形上支持曲面细分着色器,但 Metal 不支持几何着色器
  4. 找到mac和ios平台使用的是Metal标准的图形api
  5. 遂查询是否有其他的图形 API, 发现 mac和ios还支持 OpenGL
  6. 在Unity中编写的Shader最终会根据不同的平台来编绎成不同的着色器语言,官方的建议是用Cg/HLSL来编写,当然也可以使用GLSL,主要是因为Cg/HLSL有更好的跨平台性,更倾向于使用Cg/HLSL来编写Shader程序。
  7. Shader编程语言
  • 基于OpenGL的OpenGL Shading Language,简称GLSL。
  • 基于DirectX的High Level Shading Language,简称HLSL。
  • 还有NVIDIA公司的C for Graphic,简称Cg语言。
  1. URP 通用渲染管线使用HLSL
  2. unity是否可以指定 graphics API
  3. 打开 Player 设置(菜单:Edit > Project Settings,然后选择 Player 类别)。 导航到 Other Settings 并确保选中 Auto Graphics API

参考链接

……

阅读全文

MAC平台几何着色器不生效

问题

MAC平台几何着色器不生效

解决步骤

  1. unity shaderlab 怎么设置以至于支持几何着色器
  2. 找原因,设置 编译目标级别,#pragma target 4.0, 不管用
  3. 看到一句话,Unity 在 Metal 图形上支持曲面细分着色器,但 Metal 不支持几何着色器
  4. 找到mac和ios平台使用的是Metal标准的图形api
  5. 遂查询是否有其他的图形 API, 发现 mac和ios还支持 OpenGL
  6. 在Unity中编写的Shader最终会根据不同的平台来编绎成不同的着色器语言,官方的建议是用Cg/HLSL来编写,当然也可以使用GLSL,主要是因为Cg/HLSL有更好的跨平台性,更倾向于使用Cg/HLSL来编写Shader程序。
  7. Shader编程语言
  • 基于OpenGL的OpenGL Shading Language,简称GLSL。
  • 基于DirectX的High Level Shading Language,简称HLSL。
  • 还有NVIDIA公司的C for Graphic,简称Cg语言。
  1. URP 通用渲染管线使用HLSL
  2. unity是否可以指定 graphics API
  3. 打开 Player 设置(菜单:Edit > Project Settings,然后选择 Player 类别)。 导航到 Other Settings 并确保选中 Auto Graphics API

参考链接

……

阅读全文