目录 1. 概述 2. 详论 2.1. 创建材质 2.2. 着色器 2.2.1. 名称 2.2.2. 属性 2.2.3. SubShader 2.2.3.1. 标签(Tags) 2.2.3.2. 渲染状态(RenderSetup) 2.2.3.3. 通道(Pass) 2.2.4. 回退(FallBack) 2.3. 渲染管线 1. 概述 在上一篇文章<Unity3D学习笔记2--绘制一个带纹理的面>中介绍了如何绘制一个带纹理材质的面,并且通过调整光照,使得材质生效(变亮).不过,上篇文章隐藏了…
目录 1. 概述 2. 详论 3. 参考 1. 概述 在之前的文章中说到,一种材质对应一次绘制调用的指令.即使是这种情况,两个三维物体使用同一种材质,但它们使用的材质参数不一样,那么最终仍然会造成两次绘制指令.原因在于,图形工作都是一种状态机,状态发生了变化,就必须进行一次绘制调用指令. GPU实例化用于解决这样的问题:对于像草地.树木这样的物体,它们往往是数据量很大,但同时又只存在微小的差别如位置.姿态.颜色等.如果像常规物体那样进行渲染,所使用的绘制指令必然很多,资源占用必然很大.一个合理的…
目录 1. 概述 2. 详论 2.1. 实现 2.2. 解析 3. 参考 1. 概述 在上一篇文章<Unity3D学习笔记6--GPU实例化(1)>详细介绍了Unity3d中GPU实例化的实现,并且给出了详细代码.不过其着色器实现是简单的顶点+片元着色器实现的.Unity提供的很多着色器是表面着色器,通过表面着色器,也是可以实现GPU实例化的. 2. 详论 2.1. 实现 首先,我们还是挂接与上篇文章一样的脚本: using UnityEngine; [ExecuteInEditMode] p…
目录 1. 概述 2. 详论 2.1. 自动实例化 2.2. MaterialPropertyBlock 3. 参考 1. 概述 在前两篇文章<Unity3D学习笔记6--GPU实例化(1)><Unity3D学习笔记6--GPU实例化(2)>分别介绍了通过简单的顶点着色器+片元着色器,以及通过表面着色器实现GPU实例化的过程.而在Unity的官方文档Creating shaders that support GPU instancing里,也提供了一个GPU实例化的案例,这里就详细…
目录 1. 概述 2. 详论 3. 问题 1. 概述 在文章<Unity3D学习笔记11--后处理>中论述了后处理是帧缓存(Framebuffer)技术实现之一:而另外一个帧缓存技术实现就是渲染纹理了.通常来说,我们渲染的场景会直接显示到屏幕的颜色缓冲区,但其实纹理和屏幕一样都是二维的,通过把场景渲染到纹理,可以实现很多特别的三维应用场景.三维渲染引擎中,通常给相机封装一个渲染目标(Render Target)的接口,如果不设置,就渲染到屏幕:如果将其设置成一个纹理对象,就渲染到纹理. 2.…
目录 1. 概述 2. 详论 3. 其他 4. 参考 1. 概述 在文章Unity3D学习笔记2--绘制一个带纹理的面中使用代码的方式创建了一个Mesh,不过这套接口在Unity中被称为简单接口.与其相对应的,Unity还提供了一套高级API来创建Mesh. 2. 详论 根据Unity文档的论述,使用高级接口能够得到更高的性能,能够跳过一些验证检查.但是这并不是最关键的,简单接口有个最大的缺点是顶点个数超过65535个时就有问题(至少在2019.4.3f1版本还是这样). 话不多说,直接上代码:…
原文:[HLSL学习笔记]WPF Shader Effect Library算法解读之[DirectionalBlur] 方位模糊是一个按照指定角度循环位移并叠加纹理,最后平均颜色值并输出的一种特效.效果如下图: Angle=0:BlurAmount=0.1:   Angle=45;BlurAmount=0.1; 看看源代码: ++++++++++++++++++++++++++++++++++++++          //模糊的角度 float Angle : register(C0);  …
原文:[HLSL学习笔记]WPF Shader Effect Library算法解读之[Embossed] Embossed(浮雕效果)          浮雕效果主要有两个参数:Amount和Width.Amount控制浮雕边缘的对比度,Width参数控制浮雕效果的精细程度,数值越小越精细. 效果如下图所示: 源代码如下: +++++++++++++++++++++++++++++++++++++++++++++ //浮雕特效 //数量,一个控制雕刻边缘对比度的参数,数值越大,对比越强 flo…
原文:[HLSL学习笔记]WPF Shader Effect Library算法解读之[BandedSwirl] 因工作原因,需要在Silverlight中使用Pixel Shader技术,这对于我来说可算是相当有难度了,首先我是个Java Web开发程序员,从来没正经地学过微软的开发语言和工具:其次,对于算法这种东西,向来有种天生的排斥,一看便头疼.不过项目逼到份上了,只能硬着头皮上,真不知道领导们是怎么想的.还是言归正传吧,记录记录自己的学习心得. 熟悉Silverlight的人都知道,SL…
unity3d学习笔记(一) 第一人称视角实现和倒计时实现 1. 第一人称视角 (1)让mainCamera和player(视角对象)同步在一起 因为我们的player是生成的,所以不能把mainCamera直接放到预支对象里,所以我们实现的方法就是让player和camera的相对位置不变 创建脚本 CameraFlow.cs用于控制mainCamera移动,把此脚本挂到mainCamera中, 同时设置mainCamera为刚体,重力为零(不然mainCamera会掉), 而且把mainCa…
目录 1. 概述 2. 详论 2.1. 网格(Mesh) 2.1.1. 顶点 2.1.2. 顶点索引 2.2. 材质(Material) 2.2.1. 创建材质 2.2.2. 使用材质 2.3. 光照 3. 代码 1. 概述 上一篇文章<Unity3D学习笔记1--绘制一个三角形>中介绍了Unity3D的HelloWorld--绘制一个简单的三角形.不过这个三角形太简单了,连材质都没有.那么这里就将三角形扩展为一个矩形的面,并且为这个面贴上纹理. 2. 详论 2.1. 网格(Mesh) 前面说…
1 单张纹理 1.1 纹理 使用纹理映射(Texture Mapping)技术,我们把一张图片逐纹素(Texel)地控制模型的颜色. 美术人员建模时,会在建模软件中利用纹理展开技术把纹理映射坐标(Texture-Mapping Coordinates)存储在每个顶点上.纹理映射坐标定义了该顶点在纹理中的2D坐标. 纹理映射坐标通常是2维坐标(u,v).也被称为UV坐标.(u为横向,v为纵向) 顶点UV坐标通常被归一化到(0, 1)范围内,但纹理采样的时候常常也有不在(0,1)范围内的坐标. Op…
纹理可以用来存储任何表面属性. 可以通过使用渐变纹理来实现插画风格的渲染效果. 这项技术是由Valve公司提出的.Valve使用它来渲染游戏中具有插画风格的角色. 我们使用半兰伯特模型计算漫反射. 因为我们使用的实际上是一个一维纹理: 所以在片元着色器中,我们使用fixed2(halfLambert, halfLambert)作为uv坐标进行纹理采样. 代码实现如下: Shader "Unity Shader Book/Chapter 7/RampTexture" { Properti…
目录 1. 绪论 2. 概述 3. 详论 3.1. 准备 3.2. 实现 3.3. 解析 3.3.1. 场景树对象 3.3.2. 绘制方法 4. 结果 1. 绪论 最近想学习一下Unity3d,无奈发现现在大部分教程不仅是视频形式的,面对的也是美术.设计之类的非程序员,更多的时候都是把Unity3d当作PS一样的工具来用,真正面对程序开发的教程反而非常少,更不用说希望能研究到一些底层图形技术的技术工作者了. 说一下我看的两本Unity3d书籍吧.第一本是<Unity 3D游戏开发(第2版)>(…
书籍推荐: 3D数学基础:图形与游戏开发——游戏软件开发专家系列(美)邓恩 Unity Shader入门精要 冯乐乐(92年) 数据结构(Python语言描述) 数据结构.算法与应用(C++语言描述) 算法导论 第3版 黑客与画家 程序员生存之道 流体力学:八叉数空间划分   四元数的几个概念: 四元数的模长:Mathf.Sqrt(x^2 + y^2 + z^2 + w^2) 标准四元数:模长为1的四元数叫标准四元数:在Unity中所有用来表示旋转的四元数都是标准四元数 单位四元数:[0,0,0…
说到了网游那就涉及到服务器了,时下最火的属英雄联盟了,我也是它的粉丝,每周必撸一把,都说小撸怡情,大撸伤身,强撸灰飞烟灭,也告诫一下同仁们,注意身体,那么他的服务器架构是什么呢,给大家分享一下, 具体的是什么架构,因为没有源码,也不知道怎么回事,只能根据当前一些经验,还有撸的时候的体验猜想出来的.和实际有偏差,大家勿喷在这里只是分享,和实际的也应该相差不大. 英雄联盟服务器其实就是一个单服,单服下面有一些集群,有用户服务器,的用户服务器实际上就是QQ用户服务器QQ用户也是有服务器集群组成 客户端…
光照模型:用数学的方法模拟现实世界中的光照效果.   场景中模型身上的光反射到相机中的光线: 1.漫反射:产生明暗效果 2.高光反射:产生镜面反射,物体中有最亮且比较耀眼的一部分 3.自发光: 4.环境光:   漫反射 光线被粗糙的表面无规则的向各个方向反射的现象. 漫反射的计算公式(兰伯特光照模型)模拟漫反射 漫反射光 = 光照颜色和强度 * 漫反射颜色 * max(0, dot(法线方向,  光照方向)) 光照颜色和强度:Unity引擎提供的,CGIncludes/UnityLighting…
Alpha测试 AlphaTest Great:大于 AlphaTest Less:小于 AlphaTest Equal:等于 AlphaTest GEqual:大于等于 AlphaTest LEqual:小于等于 AlphaTest Never:全不渲染 AlphaTest Always:全部渲染 如果使用后两项的命名的情况下,比较后的数字项没有意义   AlphaTest 比较项 数字 AlphaTest Great 0.5 //表示只渲染alpha值大于0.5的部分 AlphaTest L…
一.GPU:图形处理器,Graphics Processing Unit 显卡的处理器就是图形处理器.与CPU类似.   GPU和CPU的区别? 1.CPU主要是为了串行指令设计,GPU则是为了大规模的秉性的计算而设计. 2.从并行的角度来看,CPU并行针对于指令集并行,而GPU的并行是针对大规模运算的. 3.同样面积的芯片:CPU上更多的放置缓存和控制部件,而GPU上放置的是更多的运算单元.   二.渲染管线 渲染管线也叫渲染流水线,就是告诉GPU一堆数据,然后得到一个二维的图像. 渲染管线主…
Project(工程.项目):工程是把游戏开发当前所需要的资源归类管理用的. Console控制台:日志.报错.调试,右上角,消息过滤 Assets:资源,存储游戏中一切用到的资源 Library:临时库文件 ProjectSettings:项目设置.项目控制 Temp:临时文件夹 UnityPackageManager:资源包 工程迁移: Assets.ProjectSettings.UnityPackageManager,这三个文件夹必须拷贝走 如果报错,先删掉Library和Temp,再重…
1 高度纹理 使用一张纹理改变物体表面法线,为模型提供更多细节. 有两种主要方法: 1.高度映射:使用一张高度纹理(height map)来模拟表面位移(displacement).得到一个修改后的法线值. 2.法线映射:使用一张法线纹理直接存储表面法线. 1.1 高度纹理 高度图中存储的是强度值(intensity).越浅越说明向外凸起,越深越向里凹. 缺点是计算复杂,消耗性能. 高度图也会与法线映射一起使用.给出表面凹凸的额外信息. 1.2 法线纹理 法线纹理中存储的是法线方向.法线方向的范…
1.原理 1.1.Phong模型 计算高光反射需要表面法线.视角方向.光源方向.反射方向等. 在这四个矢量中,我们实际上只需要知道其中3个矢量即可,而第4个矢量(反射方向r)可以通过其他信息计算得到: 这样,我们就可以利用Phong模型来计算高光反射的部分: m(gloss)是材质的光泽度,也被反称为反光度.它用于控制高光区域的"亮点"有多宽,m(gloss)越大,亮点就越小. m(spscular)是材质的高光反射颜色,它用于控制该材质对于高光反射的强度和颜色. c(light)则是…
在光照无法达到的区域,模型的外观通常是全黑的,没有任何明暗变化,这会使模型的背光区域看起来就像一个平面. 使用半兰伯特光照可以解决这个问题. 逐顶点光照技术也被称为兰伯特光照模型.因为它符合兰伯特定律. Valve公司在开发半条命的时候提出了半兰伯特光照模型. 半兰伯特光照模型没有使用max操作来防止n和I的点积为负值,而是对其结果进行了一个α 倍的缩放再加上一个β 大小的偏移. 绝大多数情况下,α 和β的值均为0.5,即公式为: 对于模型的背光面,在漫反射模型中点积结果将映射到同一个值,即0值…
本代码只适用于平行光. 1.逐顶点漫反射光照 1.1漫反射光照原理 1.2代码实现 在Properties语义块中声明一个漫反射颜色属性 Properties { //漫反射参数,用于调整漫反射效果 _Diffuse ("Diffuse", Color) = (1, 1, 1, 1) } 在SubShader语义块中定义一个Pass语义块. 在Pass的第一行指明光照模式. Tags{"LightMode" = "ForwardBase"} 在P…
前言:当使用Unity开发移动端的游戏,特别是使用到手机的传感器,如重力感应等,调试的时候,很麻烦, 因为每次都需要编译成APK后安装到手机中测试,而Unity Remote便能很好的解决这个问题,Unity Remote 能将手机的传感器参数传递到Unity中,用于测试重力感应相关的游戏. 一:准备工作: 1.下载调试APK地址:http://download.csdn.net/detail/as294985925/7096441 2.安装APK. 二:开始调试 1.调试之前需要把某些软件的*…
一 网络下载可以使用WWW类下载资源用法:以下载图片为例WWW date = new WWW("<url>");yield return date;texture = date.texture; 注意函数的返回值类型为IEnumerator,下载函数尽量使用StartCoroutine(function())协同程序.对于本地资源,url为"file://"+路径,如果使用当前目录,可以使用Application.dataPath用这个方法同样可以在线更…
在C#脚本中,必须显式的继承MonoBehaviour类需要注意的是,在创建C#脚本时,脚本名应尽量符合C#命名规则,以字母或下划线开头,因为类名的默认跟随脚本名.C#声明变量的方式和C++和Java类似,例如public string[] name = {"element1","element2",...};public int i; public GameObject obj;总体来说,与JavaScript的区别在于类型关键词的放置位置不同.函数的定义方式:&…
Update()每帧调用一次LateUpdate()在Update()后执行Awake()系统执行的第一个方法Start()在Awake()之后,Update()之前FixedUpdate()固定更新,可在Edit->Project Settings->Time中更改刷新频率OnDestroy()脚本销毁时调用OnGUI()每帧调用,专门用来绘制界面创建对象 var obj = GameObject.CreatePrimitive(PrimitiveType.cube);获取对象 GameOb…
不是什么技术文章,纯粹是我个人学习是遇到一些觉得需要注意的要点,当成笔记. 1.关于调试,在Android下无法断点,Debug也无法查看,查看日志方法可以启动adb的log功能,或者自己写个GUI控件直接在屏幕上显示Info 2.所有自定义的编辑器扩展插件脚本必须放在Editor文件夹里,不然会导致编译程序时出错,放到Editor文件下,编译成游戏时才会忽略这些脚本 3.打包资源时,假设是在移动设备上使用,打包方式务必选择成:BuildTarget.AndroidBuildPipeline.B…
最近开始在学习Unity3D,在网上找到了一些教程利用晚上回家休息的时间自学了一下,我就是一个小白,对Unity3D什么都不懂,可能需要一些美工的功底.刚好有点,需要点编程的基础,也好我也有点,对C#很熟,看着Unity3D那么火,我也抽时间来研究研究,看看指不定哪天就用到了. 首先准备工作是要到官网上下载一个Unity3D软件 官网http://unity3d.com/cn/ 下载喜欢的版本,至少要下载4.X以上的版本,初学者完全够用了. 下载安装完成以后先不要着急去学习菜单.因为菜单太多了不…