UnityShader入门精要
文章平均质量分 94
御坂御坂Matlab工作室
喜爱编程,喜爱游戏设计,喜爱动漫
展开
-
shader之——光照烘焙
Shader "Game_XXX/Scenes/HouseShow"{ Properties { _MainTex ("Texture", 2D) = "white" {} } SubShader { Tags { "Queue"="Geometry"} Pass { CGPROGRAM...原创 2019-06-13 15:46:21 · 478 阅读 · 0 评论 -
第十七章 基于物理的渲染(1)
文章目录在之前的章节中,我们学习了Lambert模型原创 2019-05-14 19:06:01 · 323 阅读 · 0 评论 -
第十六章 Unity的表面着色器探秘(3)
文章目录1.表面着色器实例分析1.表面着色器实例分析为了帮助读者更加深入的理解表面着色器背后的原理,我们在本节以一个表面着色器为例,分析Unity为它生成的代码。测试场景如下图所示,它的实现效果是对模型进行膨胀。这种效果的实现非常简单,就是在顶点修改函数中沿着顶点法线方向扩张顶点的位置。为了分析表面着色器中4个可自定义的函数(顶点修改函数、表面函数。光照函数和最后的颜色修改函数)的原理,...原创 2019-05-14 18:57:12 · 797 阅读 · 0 评论 -
第十六章 Unity的表面着色器探秘(2)
文章目录1.两个结构体数据来源:Input结构体1.两个结构体上一节我们已经讲过,表面着色器支持最多自定义4种关键函数:表面函数(用于设置各种表面性质,如反射率、法线等),光照函数(定义表面使用的光照模型),顶点修改函数(修改或传递顶点属性),最后的颜色修改函数(对最后的颜色进行修改)。那么这些函数之间的信息传递是怎么实现的呢?例如,我们想把顶点颜色传递给表面函数,添加到顶点反射率的计算中,要...原创 2019-05-14 17:33:07 · 264 阅读 · 0 评论 -
第十二章 使用深度和法线纹理(2)
再谈运动模糊在前面我们学习了如何混合多张屏幕图像来模拟运动模糊的效果。原创 2019-05-09 18:27:14 · 209 阅读 · 0 评论 -
第十二章 使用深度和法线纹理(1)
在前面,我们学习的屏幕后处理效果都只是在屏幕颜色图像上进行各种操作来实现的。然而,很多时候我们不仅需要当前屏幕的颜色信息,还希望得到深度和法线信息。例如,在进行边缘检测时,直接利用颜色信息会使检测到的边缘信息受物体纹理和光照等外部因素影响,得到很多我们不需要的边缘点。一种更好的方法是,我们可以在深度纹理和法线纹理上进行边缘检测,这些图像不会受纹理和光照的影响,而仅仅保存了当前渲染物体的模型信息,通...原创 2019-05-09 18:23:21 · 396 阅读 · 0 评论 -
第十章 让画面动起来(2)
顶点动画如果一个游戏中所有的物体都是静止的,这样枯燥的世界恐怕很难引起玩家的兴趣。顶点动画可以让我们的场景变得更加生动有趣。在游戏中,我们常常使用顶点动画来模拟飘动的旗帜、湍流的小河等效果。在本节中,我们将学习两种常见的顶点动画的应用——流动的河流以及广告牌技术。在本节最后我们还将给出一些顶点动画中的注意事项及解决方法。1. 流动的河流河流的模拟是顶点动画最常见的应用之一。它的原理通常就是使...原创 2019-05-06 19:01:07 · 313 阅读 · 0 评论 -
第十六章 Unity的表面着色器探秘(1)
文章目录1.表面着色器的一个例子2.编译指令表面函数表面着色器(Surface Shader)实际上就是在顶点/片元着色器之上又添加了一层抽象。按Aras的话来解释就是,顶点/几何/片元着色器是硬件能理解的渲染方式,而开发者应该使用一种更容易理解的方式。很多时候使用表面着色器,我们只需要告诉Shader:“嘿,使用这些纹理去填充颜色,使用这个法线纹理去填充表面法线,使用兰伯特光照模型,其它的就不...原创 2019-05-14 09:58:45 · 299 阅读 · 0 评论 -
第十章 让画面动起来(1)
1. UnityShader中的内置变量(时间篇)动画效果往往都是把时间添加到一些变量的计算中,以便在时间变化时画面也可以随之变化。UnityShader提供了一系列关于时间的内置变量允许我们方便的在Shader中访问运行时间,实现各种动画效果。下表给出了这些内置的时间变量。 Unity内置的时间变量 名称 类型 描述 _T...原创 2019-05-06 17:47:49 · 353 阅读 · 0 评论 -
第十五章 Unity中的渲染优化技术(5)
文章目录1.节省带宽减少纹理大小利用分辨率缩放2.减少计算复杂度Shader的LOD技术1.节省带宽大量使用未经压缩的纹理以及使用过大的分辨率都会造成由于带宽而引发的性能瓶颈。减少纹理大小之前提到过,使用纹理图集可以帮助我们减少draw call的数目,而这些纹理的大小同样是一个需要考虑的问题。需要注意的是,所有纹理的长宽比最好是一个正方形,而且长宽值最好是2的整数幂。这是因为有很多优化策...原创 2019-05-13 18:49:23 · 203 阅读 · 0 评论 -
第十五章 Unity中的渲染优化技术(4)
一.减少需要处理的顶点的数目尽管draw call是一个重要的性能指标,但顶点数目同样有可能成为GPU的性能瓶颈。在本节中,我们将给出3个常用的顶点优化策略。1.优化几何体3D游戏的制作通常都是由模型制作开始的。而在建模时,有一条规则我们需要记住:尽可能减少模型中三角面片的数目,一些对于模型没有影响、或是肉眼非常难察觉到区别的顶点都要尽可能的去掉。为了尽可能的减少模型中的顶点数目,美工人员往...原创 2019-05-13 18:16:33 · 360 阅读 · 0 评论 -
第八章 更复杂的光照(1)
Unity的渲染路径在Unity里,渲染路径(Rendering Path)决定了光照是如何应用到Unity Shader中的。因此,如果要和光源打交道,我们需要为每个Pass指定它使用的渲染路径,只有这样才能让Unity知道“哦,原来这个程序员想要用这种渲染路径,那么好的,我把光源和处理后的光照信息都放在这些数据里,你可以访问啦”也就是说,我们只有为Shader正确的选择和设置了需要的渲染路径...原创 2019-04-30 18:24:35 · 281 阅读 · 0 评论 -
第十一章 屏幕后处理效果(5)
运动模糊运动模糊是真实世界中的摄像机的一种效果。如果在摄像机曝光时,拍摄场景发生了变化,就会产生模糊的画面。运动模糊效果可以让物体运动看起来更加真实平滑,但在计算机产生的图像中,由于不存在曝光这一物理现象,渲染出来的图像往往都是棱角分明,缺少运动模糊。在诸如赛车一类的游戏中,为画面添加运动模糊是一种常见的处理方法。在这一节,我们将学习如何在屏幕后处理中实现运动模糊的效果。在本节结束后,我们会得到...原创 2019-05-08 19:16:27 · 690 阅读 · 0 评论 -
第十一章 屏幕后处理效果(4)
Bloom效果Bloom特效是游戏中常见的一种屏幕效果。这种特效可以模拟真实摄像机的一种图像效果,它让画面中较量的区域“扩散”到周围的区域中,造成一种朦胧的效果。下图给出了动画短片《大象之梦》(英文名:Elephants Dream)中的一个Bloom效果。本节将会实现一个基本的Bloom特效,在学习完本节后,我们会得到类似下图的效果。Bloom的实现原理非常简单:我们首先根据阈值提取出...原创 2019-05-08 17:54:17 · 624 阅读 · 0 评论 -
第十七章 基于物理的渲染(2)
Unity 5的Standard Shader当我们在Unity 5中新创建一个模型或是新创建一个材质时,其默认使用的着色器都是一个名为Standard的着色器。这个Standard Shader就使用了我们之前所讲的基于物理的渲染。Unity支持两种流行的基于物理的工作流程:金属工作流(Metallic workflow)和高光反射工作流(Specular workflow)。其中金属工作流...原创 2019-05-15 18:17:41 · 218 阅读 · 0 评论 -
第十一章 屏幕后处理效果(1)
屏幕后处理效果(screen post-processing effects)是游戏中实现屏幕特效的常见方法。1.建立一个基本的屏幕后处理脚本系统屏幕后处理,顾名思义,通常指的是在渲染完整个场景得到屏幕图像后,再对这个图像进行一些列操作,实现各种屏幕特效。使用这种技术,可以为游戏画面添加更多的艺术效果,例如景深(Depth of Field)、运动模糊(Motion Blur)等。因此,想要...原创 2019-05-07 17:33:41 · 585 阅读 · 0 评论 -
第十二章 使用深度和法线纹理(3)
文章目录全局雾效1. 重建世界坐标2.雾的计算全局雾效雾效(Fog)是游戏里常见的一种效果。Unity内置的雾效可以产生基于距离的线性或指数雾效。然而,想要在自己编写的顶点/片元着色器中实现这些雾效,我们需要在Shader中添加#pragma multi_compile_fog指令,同时还要使用相关内置宏,例如UNITY_FOG_COORDS、UNITY_TRANSFER_FOG和UNITY_...原创 2019-05-11 11:47:38 · 316 阅读 · 0 评论 -
第十八章 Unity 5更新了什么
文章目录1.场景更亮了2.表面着色器更容易“报错了”3.当家做主:自己控制非统一缩放的网格4.固定管线着色器逐渐退出历史舞台Unity 5相比较与之前的版本来说,在Shader方面做了许多重要的更新。一些更新很容易被大家察觉,例如,如果读者直接把在Unity 4中使用的一些Shader源代码粘贴到Unity 5中,往往会发现和Unity 4中得到的渲染结果不尽相同,甚至还会报错。本章会对Unit...原创 2019-05-18 17:11:51 · 156 阅读 · 0 评论 -
第十七章 基于物理的渲染(4)
答疑解惑1.什么是全局光照在前面的内容中,我们可以发现全局光照对得到真实的渲染结果有着举足轻重的作用。全局光照指的就是模拟光线是如何在场景中传播的。它不仅会考虑那些直接光照的结果,还会计算光线被不同的物理表面反射而产生的间接光照。在使用基于物理的着色技术时,当渲染表面上一点时,我们需要计算该点的半球范围内所有会反射到观察方向的入射光线的光照结果,这些入射光线中就包含了直接光照和间接光照。通常...原创 2019-05-18 11:47:56 · 240 阅读 · 0 评论 -
第十五章 Unity中的渲染优化技术(3)
文章目录减少draw call的数目减少draw call的数目读者最常看到的技术大概是批处理(batching)了,批处理的实现原理就是为了减少每一帧需要的draw call数目。...原创 2019-05-12 18:08:50 · 267 阅读 · 0 评论 -
第十五章 Unity中的渲染优化技术(2)
文章目录Unity中的渲染分析工具1.认识Unity 5的渲染统计窗口Unity中的渲染分析工具Unity内置了一些工具,来帮助我们方便的查看和渲染相关的各个统计数据。这些数据可以帮助我们分析游戏渲染性能,从而更有针对性进行优化。在Unity5中,这些工具包含了渲染统计窗口(Rendering Statistics Window)、性能分析器(Profiler),以及帧调试器(Frame De...原创 2019-05-12 18:06:41 · 290 阅读 · 0 评论 -
第十五章 Unity中的渲染优化技术(1)
1.移动平台的特点和PC平台相比,移动平台的GPU架构有很大不同。由于处理资源等条件的限制,移动设备上的GPU架构专注于尽可能使用更小的带宽和功能,也由此带来了许多和PC平台完全不同的现象。例如,为了尽可能移除那些隐藏的表面,介绍overdraw(即一个像素被绘制多次),PowerVR芯片(通常用于ios设备和某些Android设备)使用了基于瓦片的延迟渲染(Tiled-based Deffe...原创 2019-05-12 16:55:44 · 340 阅读 · 0 评论 -
第十七章 基于物理的渲染(3)
一个更加复杂的例子我们将讲解一个更加复杂的、基于物理渲染的场景1.设置光照环境我们首先要为场景设置光照环境。在默认情况下,Unity 5中一个新创建的场景会包含一个默认的Skybox。在本例中我们使用一个自定义的Skybox来代替默认值。做法是,打开Window->Lighting,在Scene标签下把本例使用的SunsetSkyboxHDR拖拽到Skybox选项中,如下图所示:...原创 2019-05-16 18:32:47 · 285 阅读 · 0 评论 -
第十四章 使用噪声(3)
再谈全局雾效在前面我们讲到了如何使用深度纹理来实现一种基于屏幕后处理的全局特效。我们由深度纹理重建每个像素在世界空间下的位置,再使用一个基于高度的公式来计算雾效的混合系数,最后使用该系数来混合雾的颜色和原屏幕的颜色。这里实现的效果是一个基于高度的均匀雾效,即在同一个高度上,雾的浓度是相同的。如下图的左图所示:然而,一些时候我们希望可以模拟一种不均匀的雾效,同时让雾不断飘动,使雾看起来更加缥缈...原创 2019-05-12 15:41:03 · 252 阅读 · 0 评论 -
第十四章 使用噪声(2)
水波效果在模拟实时水面的过程中,我们往往也会使用噪声纹理。此时,噪声纹理通常会用作一个高度图,以不断修改水面的法线方向。为了模拟水不断的流动效果,我们会使用和时间相关的变量来对噪声纹理进行采样,当得到法线信息后,再进行正常的反射+折射计算,得到最后的水面波动效果。在本节中,我们将会使用一个由噪声纹理得到的法线贴图,实现一个包含菲涅尔反射的水面效果,如下图所示我们曾在前面介绍过如何使用反射和...原创 2019-05-12 11:34:12 · 464 阅读 · 0 评论 -
第十四章 使用噪声(1)
文章目录消融效果很多时候,向规则的事物里添加一些“杂乱无章”的效果往往会有意想不到的效果。而这些“杂乱无章”的效果来源就是噪声。在本章,我们将会学习如何使用噪声来模拟各种看似神奇的效果。消融效果消融(dissolve)效果常见于游戏中角色的死亡、地图烧毁等效果。在这些效果中,消融往往从不同的区域开始,并向看似随机的方向扩张,最后整个物体都将消失不见。在本节中,我们将学习如何在Unity中实现...原创 2019-05-12 10:00:29 · 194 阅读 · 0 评论 -
第十三章 非真实感渲染(2)
另一种非常流行的非真实感渲染是素描风格的渲染。原创 2019-05-11 18:57:52 · 282 阅读 · 0 评论 -
第十三章 非真实感渲染(1)
文章目录卡通风格的渲染1.渲染轮廓线2.添加高光3.实现尽管游戏渲染一般都是以照相写实主义(photorealism)作为主要目标,但也有很多游戏使用了非真实感渲染(Non-photorealistic Rendering,NPR)的方法来渲染游戏画面。非真实感渲染的一个主要目标是,使用一些渲染方法使得画面达到和某些特殊的绘画风格相似的效果,例如卡通、水彩风格等。卡通风格的渲染卡通风格是游戏...原创 2019-05-11 18:27:06 · 710 阅读 · 0 评论 -
第十二章 使用深度和法线纹理(4)
再谈边缘检测在前面,我们曾介绍如何使用Sobel算子对屏幕进行边缘检测,实现描边的效果。但是,这种直接利用颜色信息进行边缘检测的方法会产生很多我们不希望得到的边缘线,如下图所示:可以看出,物体的纹理、阴影等位置也被描上黑边,而这往往不是我们希望看到的。在本节中,我们将学习如何在深度和法线纹理上进行边缘检测,这些图像不会受纹理和光照的影响,而仅仅保存了当前渲染物体的模型信息,通过这种方式检测出...原创 2019-05-11 16:21:08 · 287 阅读 · 0 评论 -
第六章 基础纹理(1)
文章目录基础纹理1. 单张纹理1.1 实践基础纹理纹理最初的目的就是使用一张图片来控制模型的外观。使用纹理映射(texture mapping)技术,我们可以把一张图“黏”在模型表面,逐纹素(texel)(纹素的名字是为和像素进行区分)地控制模型的颜色。在美术人员建模的时候,通常会在建模软件中利用纹理展开技术把纹理映射坐标(texture-mapping coordinates)存储在每个顶...原创 2019-04-25 17:58:45 · 366 阅读 · 0 评论 -
第十一章 屏幕后处理效果(3)
高斯模糊在前面,我们学习了卷积的概念,并利用卷积实现一个简单的边缘检测效果。在本节中,我们将选择卷积的另一个常见应用——高斯模糊。模糊的实现有很多方法,例如均值模糊和中值模糊。均值模糊同样使用了卷积操作,它使用的卷积核中的各个元素值都相等,且相加等于1,也就是说,卷积后得到的像素值是其邻域内各个像素的平均值。而中值模糊则是选择邻域内对所有像素排序后的中值替换掉原颜色。一个更高级的模糊方法是高斯模...原创 2019-05-08 17:20:14 · 587 阅读 · 0 评论 -
第五章 Unity中的基础光照(2)
文章目录1. Unity中的环境光和自发光1. Unity中的环境光和自发光原创 2019-04-23 15:47:43 · 225 阅读 · 0 评论 -
第八章 更复杂的光照(4)
Unity的阴影为了让场景看起来更加真实,具有深度信息,我们通常希望光源可以把一些物体的阴影投射在其它物体上。在本节,我们就来学习如何在Unity中让一个物体向其他物体投射阴影,以及如何让一个物体接收来自其它物体的阴影。1. 阴影是如何产生的我们首先可以考虑真实生活中阴影是如何产生的。当一个光源发射的一条光线遇到一个不透明物体时,这条光线就不可以继续照亮其他物体(这里不考虑光线发射)。因此这...原创 2019-05-02 17:02:32 · 175 阅读 · 0 评论 -
第三章 学习Shader所需的数学基础(3)
文章目录1、 顶点的坐标空间变换过程2. 模型空间3 世界空间4. 观察空间5 裁剪空间1、 顶点的坐标空间变换过程我们知道,在渲染流水线中,一个顶点要经过多个坐标空间的变换才能最终被画在屏幕上。一个顶点最开始是在模型空间中定义的,它最后会被变换到屏幕空间中,得到真正的屏幕像素坐标。因此接下来我们将解释顶点要进行的各种空间变换的过程。为了帮助大家理解这个过程,我们将建立在农场游戏的实例背景下...原创 2019-04-18 18:01:43 · 367 阅读 · 0 评论 -
第八章 更复杂的光照(3)
Unity的光照衰减在前面,我们提到Unity使用一张纹理作为查找表在片元着色器中计算逐像素光照的衰减。这样的好处在于,计算衰减不依赖于数学公式的复杂性,我们只要使用一个参数值去纹理中采样即可。但使用纹理查找来计算衰减也有一些弊端。●需要预处理得到采样纹理,而且纹理的大小也会影响衰减的精度●不直观,同时也不方便,因此一旦把数据存储到查找表中,我们就无法使用其它数学公式来计算衰减但由于这种方...原创 2019-05-02 14:09:15 · 165 阅读 · 0 评论 -
第八章 更复杂的光照(2)
Unity的光源类型在前面的例子中,我们场景中都仅仅只有一个光源且光源类型是平行光(如果你的场景不是这样的话,可能会得到错误的结果)。只有一个平行光的世界很美好,但美梦总有行的那一天,这是我们就要在Unity Shader中处理更复杂的光源类型以及数目更多的光源。在本节中,我们将会学习如何在Unity中处理点光源(point light)和聚光灯(spot light)。Unity一共支持4中...原创 2019-05-01 17:51:44 · 395 阅读 · 0 评论 -
第五章 Unity中的基础光照(1)
文章目录原创 2019-04-22 23:38:14 · 564 阅读 · 0 评论 -
第三章 学习Shader所需的数学基础(2)
文章目录1.坐标空间1.2 坐标空间的变换1.坐标空间我们在以前渲染流水线中就接触了坐标空间的变换。例如,在学习顶点着色器流水线阶段时,我们说过,顶点着色器的最基本功能就是把模型的顶点坐标从模型空间转换到齐次裁剪坐标空间中。1.2 坐标空间的变换我们先要为后面的内容做些数学铺垫。在渲染流水线中,我们往往需要把一个点或方向矢量从一个坐标空间转换到另一个坐标空间。这个过程到底是怎么实现的?我...原创 2019-04-18 11:36:57 · 344 阅读 · 0 评论 -
第四章 开始Unity Shader学习之旅(3)
1. 程序员的烦恼:Debug调试(debug),大概是所有程序员的噩梦。而不幸的是,对一个Shader进行调试更是噩梦中的噩梦。这也是造成Shader难写的原因之一——如果发现得到的效果不对,我们就可能花非常多的时间来找到问题所在。造成这种现状的原因就是在Shader中可以选择的调试方法非常有限,甚至连简单的输出都不行。2. 最新利器:帧调试器Unity5除了带来全新的UI系统外,还为我们...原创 2019-04-22 17:57:10 · 223 阅读 · 0 评论 -
第一章 渲染流水线
1 综述好吧,既然是从最基础开始说起,那我们就有必要了解什么是Shader,即着色器。与之关系非常紧密的就是渲染流水线。可以说如果不了解渲染流水线的工作流程,就无法说自己真正的了解Shader。1.1 什么是流水线要想学会怎么使用Shader,我们首先要了解Shader是怎么工作的。实际上,Shader仅仅是渲染流水线的一个环节,想要让我们的Shader发挥出它的作用,我们就需要知道它在流水...原创 2019-04-15 11:39:18 · 475 阅读 · 0 评论