IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> 22.03.01 《Unity 2018 Shaders and Effects Cookbook》笔记Chapter10-11 -> 正文阅读

[游戏开发]22.03.01 《Unity 2018 Shaders and Effects Cookbook》笔记Chapter10-11

10.Gameplay and Screen Effects

  1. 老电影效果

    1. Sepia tone 棕褐色调

      通过叠加颜色获得

      fixed lum = dot (fixed3(0.299, 0.587, 0.114), renderTex.rgb); 
      fixed4 finalColor = lum + lerp(_SepiaColor, _SepiaColor + fixed4(0.1f,0.1f,0.1f,1.0f), _RandomValue); 
      finalColor = pow(finalColor, _Contrast); 
      
    2. Vignette effect 晕影效果

      也是通过叠加图片获得的

      fixed4 vignetteTex = tex2D(_VignetteTex, i.uv);
      finalColor = lerp(finalColor, finalColor * vignetteTex, _VignetteAmount); 
      
    3. Dust and scratches 脏迹和划痕

      虽然更加复杂,但依旧是叠加图片获得的,只是增加了uv的滚动

      half2 scratchesUV = half2(i.uv.x + (_RandomValue * _SinTime.z * _ScratchesXSpeed), i.uv.y + (_Time.x * _ScratchesYSpeed)); 
      fixed4 scratchesTex = tex2D(_ScratchesTex, scratchesUV); 
      finalColor.rgb *= lerp(scratchesTex, constantWhite, (_RandomValue)); 
      
      half2 dustUV = half2(i.uv.x + (_RandomValue * (_SinTime.z * _dustXSpeed)), i.uv.y + (_RandomValue * 	(_SinTime.z * _dustYSpeed))); 
      fixed4 dustTex = tex2D(_DustTex, dustUV); 
      finalColor.rgb *= lerp(dustTex.rgb, constantWhite, (_RandomValue * _SinTime.z)); 
      
  2. 夜视效果

    仍旧是图片叠加

       //失真算法,对当前UV值变换
       float2 barrelDistortion(float2 coord)  
        { 
            float2 h = coord.xy - float2(0.5, 0.5); 
            float r2 = h.x * h.x + h.y * h.y; 
            float f = 1.0 + r2 * (_distortion * sqrt(r2)); 
            return f * _scale * h + 0.5; 
        } 
    
        fixed4 frag(v2f_img i) : COLOR 
        { 
            //取失真后的uv值
            half2 distortedUV = barrelDistortion(i.uv); 
            
            //采样
            fixed4 renderTex = tex2D(_MainTex, distortedUV); 
            fixed4 vignetteTex = tex2D(_VignetteTex, i.uv); 
    
            //采样扫描线图片
            half2 scanLinesUV = half2(i.uv.x * _ScanLineTileAmount, i.uv.y * _ScanLineTileAmount); 
            fixed4 scanLineTex = tex2D(_ScanLineTex, scanLinesUV); 
            
            //采样噪声图片
            half2 noiseUV = half2(i.uv.x + (_RandomValue * _SinTime.z * _NoiseXSpeed), i.uv.y + (_Time.x * _NoiseYSpeed)); 
            fixed4 noiseTex = tex2D(_NoiseTex, noiseUV); 
    
            //叠加夜视颜色色调
            fixed lum = dot (fixed3(0.299, 0.587, 0.114), renderTex.rgb); 
            lum += _Brightness; 
            fixed4 finalColor = (lum *2) + _NightVisionColor; 
    
            //叠加在一起
            finalColor = pow(finalColor, _Contrast); 
            finalColor *= vignetteTex; 
            finalColor *= scanLineTex * noiseTex; 
    
            return finalColor; 
        }
    

11.Advanced Shading Techniques

  1. 使用UnityCG.cginc文件中的函数

    文件位于Editor\Data\CGIncludes文件夹下

  2. Luminance函数(在UnityCG.cginc中定义):

    函数定义(返回灰度值):

    inline half Luminance(half3 rgb)
    {
    return dot(rgb, unity_ColorSpaceLuminance.rgb);
    }

    其中,unity_ColorSpaceLuminance也在此文件中定义

    #define unity_ColorSpaceLuminance half4(0.22, 0.707, 0.071, 0.0)

  3. 使用自定义的CGInclude文件(头文件)

    1. 创建MyCGInclude.cginc文件
    2. 在文件中实现函数
    3. 在shader中使用#include “MyCGInclude.cginc”
    4. 调用文件中的函数
  4. 毛皮着色器

    1. 首先新建一个pass,它将在顶点函数中创建一个稍大一些的模型(同时考虑了重力)

      void vert (inout appdata_full v)
      {
      	fixed3 direction = lerp(v.normal, _Gravity * _GravityStrength + v.normal * (1-_GravityStrength), FUR_MULTIPLIER);
      	v.vertex.xyz += direction * _FurLength * FUR_MULTIPLIER * v.color.a;
      }
      
    2. 它的表面着色器负责判断哪些像素应该被显示或隐藏(同时考虑了观察角度)

      void surf (Input IN, inout SurfaceOutputStandard o) {
      	fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
      	o.Albedo = c.rgb;
      	o.Metallic = _Metallic;
      	o.Smoothness = _Glossiness;
      
      	o.Alpha = step(lerp(_Cutoff,_CutoffEnd,FUR_MULTIPLIER), c.a);
      
      	float alpha = 1 - (FUR_MULTIPLIER * FUR_MULTIPLIER);
      	alpha += dot(IN.viewDir, o.Normal) - _EdgeFade;
      
      	o.Alpha *= alpha;
      }
      
    3. 在普通表面着色器CGEND之后,添加多个该pass,越多则越真实

    4. 这种方法非常耗时

  5. 向着色器传数组(实现HeatMap)

    1. C#部分:material.SetVectorArray("_Properties", properties);

    2. shader部分:uniform float2 _Properties[20];

    3. heatMap实现方法:通过传入的position数组中点的位置和半径累计热度值h,再根据h绘制上颜色

      			half4 frag(vertOutput output) : COLOR
      			{
      				half h = 0;
      
      				for (int i = 0; i < _Points_Length; i++)
      				{
      					half di = distance(output.worldPos, _Points[i].xyz);
      
      					half ri = _Properties[i].x;
      					half hi = 1- saturate(di / ri);
      
      					h += hi * _Properties[i].y;
      				}
      
      				h = saturate(h);
      				half4 color = tex2D(_HeatTex, fixed2(h, 0));
      				return color;
      			}
      
    4. 性能瓶颈:对于每个像素,都需要执行这个循环

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2022-03-04 15:56:00  更:2022-03-04 15:57:05 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 16:35:40-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码