Unity Shader入门精要学习笔记
Unity Shader入门精要学习笔记
码农小飞飞
在手游开发的路上越走越远!
展开
-
为什么Draw Call多了会影响帧率
在每次调用Draw Call之前,CPU需要向GPU发送很多内容,包括数据﹑状态和命令。在这一阶段,CPU需要完成很多工作,例如检查渲染状态等。而一旦CPU完成了这些准备工作,GPU就可以开始本次的渲染。GPU的渲染能力是很强,渲染200个还是2000个三角网格通常没有什么区别,因此渲染速度往往快于CPU提交命令的速度。如果Draw Call的数量太多,CPU就会把大量时间花费在提交Draw Ca...原创 2019-08-16 14:59:52 · 2645 阅读 · 0 评论 -
CPU和GPU是如何实现并行工作的
如果没有流水线化,那么CPU需要等到GPU完成上一个渲染任务才能再次发送渲染命令。但这种方法显然会造成效率低下。我们需要让CPU和GPU可以并行工作。而解决方法就是使用一个命令缓冲区(Command Buffer)。命令缓冲区包含了一个命令队列,由CPU向其中添加命令,而由GPU从中读取命令,添加和读取的过程是互相独立的。命令缓冲区使得CPU和GPU可以互相独立工作。当CPU需要渲染一些对象时...原创 2019-08-16 14:44:05 · 6514 阅读 · 0 评论 -
什么是OpenGL/DirectX 什么是HLSL﹑GLSL﹑Cg 什么是Draw Call
什么是OpenGL/DirectX如果要开发者直接访问GPU是一件非常麻烦的事情,我们可能需要和各种寄存器﹑显存打交道。而图像编程接口在这些硬件的基础实现了一层抽象。OpenGL和DirectX就是这些图像应用编程接口,这些接口用于渲染二维或三维图形。这些接口架起了上层应用程序和底层GPU的沟通桥梁。一个应用程序向这些接口发送渲染命令,而这些接口会依次向显卡驱动(Graphics Driv...原创 2019-08-16 11:51:32 · 1902 阅读 · 0 评论 -
什么是渲染流水线
渲染流水线的工作任务在于由一个三维场景出发﹑生成(或者说渲染)一张二维图像。换句话说,计算机需要从一系列的顶点数据﹑纹理等信息出发,把这些信息最终转换成一张人眼可以看到的图像。《Real-Time Rendering,Third Edition》一书中将一个渲染流程分成 3 个阶段:应用阶段(Application Stage)﹑几何阶段(Geometry Stage)﹑光栅化阶段(Raste...原创 2019-08-09 17:11:52 · 2361 阅读 · 0 评论 -
Unity Shader 使用噪声 水波效果
Shader "MyShader/WaterWave"{ Properties{ _Color("Main Color", Color) = (0, 0.15, 0.115, 1) _MainTex("Base (RGB)", 2D) = "white" {} _WaveMap("Wave Map", 2D) = "bump" {} ...原创 2019-09-18 16:27:35 · 1047 阅读 · 0 评论 -
Unity Shader 使用噪声 消融效果
shaderShader "MyShader/Dissolve"{ Properties{ _BurnAmount("Burn Amount", Range(0.0, 1.0)) = 0.0 _LineWidth("Burn Line Width", Range(0.0, 0.2)) = 0.1 _MainTex("Bas...原创 2019-09-18 15:12:29 · 254 阅读 · 0 评论 -
Unity Shader 非真实感渲染 素描风格
shaderShader "MyShader/Hatching"{ Properties{ _Color("Color Tint", Color) = (1, 1, 1, 1) _TileFactor("Tile Factor", Float) = 1 _Outline("Outline", Range(0, 1)) = 0....原创 2019-09-18 14:28:48 · 469 阅读 · 0 评论 -
Unity Shader 非真实感渲染 卡通风格
Shader "MyShader/ToonShading"{ Properties{ _Color("Color Tint", Color) = (1, 1, 1, 1) _MainTex("Main Tex", 2D) = "white" {} _Ramp("Ramp Texture", 2D) = "white" {} ...原创 2019-09-18 11:34:18 · 806 阅读 · 0 评论 -
Unity Shader 屏幕后处理 使用深度和法线纹理 边缘检测
代码using UnityEngine;public class EdgeDetectNormalsAndDepth : PostEffectsBase{ public Shader edgeDetectShader; private Material edgeDetectMaterial = null; public Material mater...原创 2019-09-18 10:50:00 · 431 阅读 · 0 评论 -
Unity Shader 屏幕后处理 使用深度和法线纹理 全局雾效
代码using UnityEngine;public class FogWithDepthTexture : PostEffectsBase{ public Shader fogShader; private Material fogMaterial = null; public Material material { get ...原创 2019-09-17 18:39:57 · 479 阅读 · 0 评论 -
Unity Shader 屏幕后处理 运动模糊 速度映射图
代码using UnityEngine;public class MotionBlurWithDepthTexture : PostEffectsBase{ public Shader motionBlurShader; private Material motionBlurMaterial = null; public Material material...原创 2019-09-16 16:01:38 · 309 阅读 · 0 评论 -
Unity Shader 屏幕后处理 运动模糊 累计模糊
效果代码using UnityEngine;public class MotionBlur : PostEffectsBase{ public Shader motionBlurShader; private Material motionBlurMaterial = null; public Material material { ...原创 2019-09-16 15:29:48 · 356 阅读 · 0 评论 -
Unity Shader 使用噪声 全局雾效
代码using UnityEngine;public class FogWithNoise : PostEffectsBase{ public Shader fogShader; private Material fogMaterial = null; public Material material { get ...原创 2019-09-18 16:44:20 · 624 阅读 · 0 评论 -
Unity Shader 高级纹理 立方体纹理 天空盒子
shader 是unity自带的Skybox/6 Sided纹理的Wrap Mode 设置为Clamp,防止在接缝处出现不匹配的现象。参考 我买的 unity shader 入门精要原创 2019-09-18 17:07:49 · 385 阅读 · 0 评论 -
Unity Shader 高级纹理 立方体纹理 创建用于环境映射的立方体纹理
创建用于环境映射的立方体纹理有三种:(1)直接由一些特殊布局的纹理创建。例如类似立方体展开图的交叉布局﹑全景布局等。我们只需把该纹理的 Texture Type 设置为 Cubemap 即可。可以对纹理数据进行压缩,支持边缘修正﹑光滑反射和 HDR 等。(2)手动创建一个 Cubemap 资源,再把 6 张图赋给它。(3)由脚本生成。最理想,我们希望根据物体在场景中位置的...原创 2019-09-18 17:24:25 · 508 阅读 · 2 评论 -
Unity中的渲染优化技术
参考原创 2019-09-19 17:16:49 · 298 阅读 · 0 评论 -
Unity 渲染优化 节省带宽 利用分辨率缩放 安卓
using UnityEngine;public class SetResolution : MonoBehaviour{ private int scaleWidth = 0; private int scaleHeight = 0; public void setDesignContentScale() {#if UNITY_ANDROID ...原创 2019-09-19 16:39:01 · 822 阅读 · 0 评论 -
Unity Shader 高级纹理 程序纹理
单张纹理shader 参见这里。代码using UnityEngine;[ExecuteInEditMode]public class ProceduralTextureGeneration : MonoBehaviour{ public Material material = null; #region Material properties [...原创 2019-09-19 11:31:45 · 354 阅读 · 0 评论 -
Unity Shader 高级纹理 渲染纹理 玻璃效果
当我们早 Shader 中定义了一个 GrabPass 后, Unity 会把当前屏幕的图像绘制在一张纹理中,以便我们在后续的 Pass 中访问。使用 GrabPass 的时候,我们要小心物体的渲染队列设置。我们往往需要把渲染队列设置成透明队列。Shader "MyShader/GlassRefraction"{ Properties{ _MainTex(...原创 2019-09-19 11:06:23 · 322 阅读 · 0 评论 -
Unity Shader 高级纹理 渲染纹理 镜子效果
一个摄像机的渲染结果会输出到颜色缓冲区,并显示到我们的屏幕上。现代的 GPU 允许我们把整个三维场景渲染到一个中间缓冲中,即渲染目标纹理(Render Target Texture,RTT)。Unity 为渲染目标纹理定义了一种专门的纹理类型---渲染纹理(Render Texture)。在 Unity 中使用渲染纹理通常有两种方式:(1)在 Project 目录下创建一个渲染纹理,...原创 2019-09-19 10:44:12 · 277 阅读 · 0 评论 -
Unity Shader 高级纹理 立方体纹理 菲涅尔反射
视线垂直于表面时,反射较弱,而当视线非垂直表面时,夹角越小,反射越明显。如果你站在湖边,低头看脚下的水,你会发现水是透明的,反射不是特别强烈;如果你看远处的湖面,你会发现水并不是透明的,但反射非常强烈。这就是“菲涅尔效应”。Shader "MyShader/Fresnel"{ Properties{ _Color("Color Tint", Color) ...原创 2019-09-19 10:15:53 · 369 阅读 · 0 评论 -
Unity Shader 高级纹理 立方体纹理 折射
折射的定义:当光线从一种介质(例如空气)斜射入另一种介质(例如玻璃)时,传播方向一般会发生改变。当给定入射角时,我们可以使用斯涅尔定律来计算反射角。当光从介质1沿着和表面法线夹角为的方向斜射入介质2时,我们可以使用如下公式计算折射光线与法线的夹角: ...原创 2019-09-18 17:45:13 · 184 阅读 · 0 评论 -
Unity Shader 高级纹理 立方体纹理 反射
使用了反射效果的物体通常看起来就像渡了层金属。想要模拟反射效果很简单,我们只需要通过入射光线的方向和表面法线方向来计算出反射方向,再利用反射方向对立方体纹理采样即可。shaderShader "MyShader/Reflection"{ Properties{ _Color("Color Tint", Color) = (1, 1, 1, 1) ...原创 2019-09-18 17:35:31 · 277 阅读 · 0 评论 -
Unity Shader 屏幕后处理 Bloom效果
Bloom前Bloom后代码using UnityEngine;public class Bloom : PostEffectsBase{ public Shader bloomShader; private Material bloomMaterial = null; public Material material { ...原创 2019-09-16 14:51:28 · 685 阅读 · 0 评论 -
Unity Shader 屏幕后处理效果 高斯模糊
高斯前高斯后代码using UnityEngine;public class GaussianBlur : PostEffectsBase{ public Shader gaussianBlurShader; private Material gaussianBlurMaterial = null; public Material mater...原创 2019-09-16 14:41:59 · 294 阅读 · 0 评论 -
Unity Shader 屏幕后处理效果 边缘检测
edge 0edge 0.5edge 1脚本using UnityEngine;public class EdgeDetection : PostEffectsBase{ public Shader edgeDetectShader; private Material edgeDetectMaterial = null; public M...原创 2019-09-16 11:59:55 · 339 阅读 · 0 评论 -
Unity Shader 凹凸映射 法线纹理 在世界空间下计算
Shader "MyShader/NormalMapWorldMapSpace"{ Properties { _Color("Color Tint",Color) = (1,1,1,1) _MainTex("Main Tex",2D) = "white"{} _BumpMap("Normal Map",2D) = "bump"{}...原创 2019-09-08 11:39:18 · 305 阅读 · 0 评论 -
Unity Shader 凹凸映射 法线纹理 切线空间下计算光照模型
凹凸映射的目的:是使用纹理来修改模型表面的法线,用于为模型提供更多细节。凹凸映射的方式:高度纹理(height map):用于模拟表面位移(displacement),也称作高度映射(height mapping)法线纹理(normal map):用于直接存储表面法线,又称为法线映射(normal mapping)。(1)使用高度纹理高度图中存储的强度值,它用于表示模型...原创 2019-09-06 14:34:50 · 611 阅读 · 0 评论 -
Unity Shader 单张纹理
我们通常使用一张纹理来代替物体的漫反射颜色。Shader "MyShader/SingleTexture"{ Properties { _Color("Color Tint",Color) = (1,1,1,1) _MainTex("Main Tex",2D) = "white"{} _Specular("Specular"...原创 2019-09-05 15:43:59 · 166 阅读 · 0 评论 -
Unity Shader 高光反射光照模型-Blinn-Phong
光照模型-Blinn-PhongShader "Unlit/BlinnPhongLevel"{ Properties { _Diffuse("Diffuse",Color) = (1,1,1,1) _Specular("Specular", Color) = (1, 1, 1, 1) _Gloss("Gloss", Range...原创 2019-09-04 17:25:57 · 133 阅读 · 0 评论 -
Unity Shader 高光反射光照模型-逐像素
逐像素光照Shader "Unlit/SpecularPixelLevel"{ Properties { _Diffuse("Diffuse",Color) = (1,1,1,1) _Specular("Specular", Color) = (1, 1, 1, 1) _Gloss("Gloss", Range(8.0, 25...原创 2019-09-04 17:24:01 · 240 阅读 · 0 评论 -
Unity Shader 高光反射光照模型-逐顶点
逐顶点光照// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'Shader "MyShader/SpecularVertexLevel"{ Properties { _Diffuse("Diffuse",Color) = (1,1,1,1) _Specul...原创 2019-09-04 17:22:21 · 161 阅读 · 0 评论 -
Unity Shader 漫反射光照模型-逐像素-半兰伯特模型
半兰伯特模型Shader "MyShader/HalfLambertLevel"{ Properties { _Diffuse("Diffuse",Color) = (1,1,1,1) } SubShader { Pass { Tags{"LightMode" = "Fo...原创 2019-09-04 15:16:39 · 191 阅读 · 0 评论 -
Unity Shader 漫反射光照模型-逐像素
逐像素光照Shader "MyShader/DiffusePixelLevel"{ Properties { _Diffuse("Diffuse",Color) = (1,1,1,1) } SubShader { Pass { Tags{"LightMode" = "Fo...原创 2019-09-04 15:13:42 · 91 阅读 · 0 评论 -
Unity Shader 渐变纹理
纹理其实可以用于存储任何表面属性。一种常见的用法就是使用渐变纹理来控制漫反射光照的结果。Shader "MyShader/RampTexture"{ Properties { _Color("Color Tint",Color) = (1,1,1,1) _RampTex("Ramp Tex",2D) = "white"{} ...原创 2019-09-08 15:56:25 · 887 阅读 · 0 评论 -
漫反射 高光反射 公式
原创 2019-09-08 16:57:56 · 1976 阅读 · 0 评论 -
Unity Shader 屏幕后处理效果 调整屏幕的亮度 饱和度和对比度
原先后 1.2 1.6 1.2PostEffectsBase.csusing UnityEngine;using System.Collections;[ExecuteInEditMode][RequireComponent (typeof(Camera))]public class PostEffectsBase : MonoBehaviour { // Ca...原创 2019-09-12 15:50:41 · 413 阅读 · 0 评论 -
Unity Shader 顶点动画 广告牌
另一种常见的顶点动画就是广告牌技术(Billboarding)。广告牌技术会根据视角方向来旋转一个被纹理着色的多边形(通常就是简单的四边形,这个多边形就是广告牌),使得多边形看起来好像总是面对这摄影机。多被用于渲染烟雾、云朵、闪光效果等原理:构建旋转矩阵,已知一个变换矩阵需要3个基向量。广告牌技术使用的基向量通常就是表面法线(normal)、指向上的方向(up)以及指向右的方向(fight)。...原创 2019-09-12 11:34:19 · 720 阅读 · 0 评论 -
Unity Shader 顶点动画 流动的河流
河流模拟是顶点动画最常见的应用之一,它的原理通常是使用正弦函数等来模拟水流的波动效果。Shader "MyShader/Water"{ Properties { _MainTex("Main Tex", 2D) = "white" {} _Color("Color Tint", Color) = (1, 1, 1, 1) _...原创 2019-09-11 18:10:57 · 1404 阅读 · 0 评论 -
Unity Shader 纹理动画 滚动的背景
Shader "MyShader/ScrollingBackground"{ Properties { _MainTex("Base Layer (RGB)",2D) = "white"{} _DetailTex("2nd Layer (RGB)",2D) = "white"{} _ScrollX("Base layer Scroll Spe...原创 2019-09-11 16:31:04 · 485 阅读 · 0 评论